SQLite format 3@ MTyM-  ( }QtablescriptsscriptsCREATE TABLE scripts ( field_key integer, sql varchar(32000), number_in_update integer, fk_version integer, prim varchar(200), version_name varchar(20), name varchar(100) )b'tabletipstipsCREATE TABLE tips ( field_key integer, note varchar(500) )U tablenewsnewsCREATE TABLE news ( field_key integer, ts_create datetime, report_txt varchar(1000), make_in_ver varchar(20), name varchar(100), fk_v integer ) 2 17!wJ20.11.2015 9:41:31При проведении акта производства, в приходной и расходной накладной сохраняется примечание как в акте производства15.11.20.1Акт производства, примечание(` 3o!?11.11.2015 11:10:52Появилась возможность автоматически округлять расходную цену не только по арифметическим правилам, но и в большую (или меньшую) сторону. Настраивается в меню "Справочники"->"Цены"->"Шкала округления цен"15.11.11.1Округление расходной цены. Изменения.'3!G>11.11.2015 11:07:52Новый механизм в программе, позволяющий задать свою наценку для каждого вида расходной цены. Находится в меню Торговля - Матрица наценок. Для ее использования в свойствах склада должен стоять флажок "Ценовой автомат". При проведении прихода, если была изменена приходная цена, в Журнале авторасчета расходных цен появится соответствующая рекомендация по изменению расходной цены.15.11.11.1Матрица наценок'n 3!!19.10.2015 23:59:04Новый режим расчета алкогольной декларации. Показывает излишки и списания.15.10.19.1Честная алкогольная декларация%_3%!a10.10.2015 21:17:10ВНИМАНИЕ. Полностью переделан механизм привязки складских документов к оплатам. Теперь возвраты поставщику и возвраты от покупателя не уменьшают сумму задолженности, а подвязываются к оплате как обычные накладные.15.10.10.1Расчеты с поставщиками$1 3o!910.10.2015 21:15:49Исправлено обновление таблиц при добавлении нового товара в ассортимент из приходной накладной15.10.10.1Приходная накладная. Мелкие ошибки интерфейса.$4 3!10.10.2015 21:12:19Новая основная настройка control_nomer_nakl позволяет отключить обязательное требование номера приходной накладной15.10.10.1Оформление прихода, номер накладной$3m!k10.10.2015 21:10:39Теперь консолидированный бюджет можно раскрыть по заявкам на финансирование. Также добавилась функция сбора фактического выполнения из консолидированного бюджета15.10.10.1Консолидированный бюджет$q3/!{10.10.2015 21:09:00Если в спецификации поставщика установлена нулевая цена на товар, то при оформлении прихода по умолчанию будет предложена последняя приходная цена.15.10.10.1Приходная цена в спецификации$315.09.2015 14:52:02Новая печатная форма для бюджета БДДС. Отображает выполнение бюджета в разрезе платежных документов.15.9.16.1Печатная форма для бю&   _ l \7oВ прайс листе есть возможность групповой переоценки товаров. Для этого надо отметить товары, подлежащие переоценке (клавиши "Ins", "+", "-"), и нажать комбинацию клавиш Ctrl+F3.k WНаходясь на позиции товара в любом документе, можно нажать клавишу "F9". Откроется аналитический инструмент, отображающий различную аналитику по текущему товару. Например, в каких приходах и расходах встречается товар, движение по позиции, присутствует ли товар в акциях, каковы результаты ревизии по этому товару в предыдущие периоды.  В журналах и документах можно установить быстрый фильтр по значению в столбце. Для этого нажмите клавишу "F2", установив курсор в ячейку, которую хотите отфильтровать. Можно фильтровать и по нескольким столбцам.h SНажатие кнопки "F7" открывает окно контекстного поиска.V /~Нажатие кнопки "F5" скопирует текущую запись или документ. В некоторых формах копирование вызывается нажатием Ctrl+F5.E  }Чтобы создать новый документ в журнале, или вставить строку в существующий документ - нажмите клавишу "F4".9u|Чтобы отредактировать строку или значение, нажмите клавишу "F3". В некоторых формах (например "Матрица наценок") возможно групповое редактирование по отмеченным записям.L{Чтобы удалить строку в документе или сам документ, нажмите клавишу "F8". Так же работает по отмеченным записям.FzВ журналах можно провести/распровести документ, нажав клавишу Alt+F5. Так же работает по отмеченным записям.pcyВ Меркурии есть интересная функция - работа с отмеченными записями. Отмечать можно как Для того, чтобы отметить запись нажмите клавишу "Ins". Повторное нажатие клавиши на той же строке отменит выделение. Чтобы отметить все записи - нажмите клавишу "+". Нажатие клавиши "-" снимет все выделения. С отмеченными записями можно проводить групповые операции. Например нажатие Alt+F6 покажет сумму по отмеченным записям.R'xЧтобы поменять текущий склад, нажмите Ctrl+S. wНажмите Altl+F3 находясь на наименовании товара в любом месте программы, чтобы открыть карточку ассортимента на просмотр или редактирование.sivНажмите Ctrl+Пробел находясь на наименовании товара в любом месте программы, чтобы посмотреть остатки этого товара на всех складах.O!uНажмите ALT+S чтобы открыть форму по име ;R~ytoje`[VQLGB=83.)$ ysmga[UOIC=71+%  } w q k e _ Y S M G A ; 5 / ) #     { u o i c ] W Q K E ? 9 3 - ' !      y s m g a [ U O I C = 7 1 + %      } w q k e _ Y S M G A ; 5 / ) #     { u o i c ] W Q K E ? 9 3 - ' !    ysmga[UOIC=71+% }wqke_YSMGA;сли БДР - пока что просто выходим if (is_bdds=1) then begin for SELECT COALESCE (summa,0) as s1, n_pko, n_plp, ks_1.DATE_CREATE, coalesce(bd_firm.name, bd_firm.fullname) as firm_name FROM KS_1 left join bd_firm on bd_firm.field_key=ks_1.fk_bd_firm --строгое неравенство из-за особенностей входных дат where date_create>=:bd and date_create<:ed and fk_bd_budget_j_cfo=:id_cfo and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :plat, :n_pko, :n_plp, :date_plat, :firm_name do begin SUSPEND; end END ELSE exit; END^ SET TERM ; ^#Хранимка получения инфы о платежках по статьям бюджета15.9.16.1CREATE procedure SP_BUDGET_PLAT_BY_STAT  K_SET TERM ^ ; CREATE OR ALTER procedure SP_BUDGET_FK_TO_INTERVAL ( FK_BUDGET integer) returns ( BD date, ED date -- , IS_BDDS integer, -- ID_CFO integer ) QPL H E C A@?<~;}*|$u"r qponkd`\XWSOKJFۇCه?҇=·<Ƈ6Ň2ć,+)("{yuq}l|hy_u]t\sYrXoWkViThPgEe<b8[-V%U$T#S!RPLKHzEvBnAi>h7a6\5Y0S,R&QOLKJIE> = 8 431-)'%߅ޅ؅ׅօՅԅӅЅ υͅ˅Ä{urmkjhfdb_^[YTRP~N|MyLvKtIqHpFoEmBkAi?f>[<Z8V7T5S0R.J-I*G$F#B"A@?>:76543210/y.w-v,u+t$r omljg fc][VSMGB?>=؃<׃:փ9Ӄ6҃4у1̃-˃,ʃ+Ƀ'ă#ƒ  |yutrlhb`[ZWTM~K{GzBx@w=u:o9n7m5l4g1_0[.Z,T+S*P)O$N"LKJIHGFEC> < 651/.-~,}+|&ztrofdcba`_^]VROMKJIHC<6541+*)ށ(݁$܁"ց ՁԁӁҁρ΁́ ˁ ɁȁāÁ{xwvtpnmlkjifca^][Z~Y}V|SzRoQhOeM_LYHWEVDUCTBSAR@Q=O9L6H4E2D/B.A,@)='<&;$9#7!64.,%#"!      n x2 17!wJ20.11.2015 9:41:31При проведении акта производства, в приходной и расходной накладной сохраняется примечание как в акте производства15.11.20.1Акт производства, примечание(` 3o!?11.11.2015 11:10:52Появилась возможность автоматически округлять расходную цену не только по арифметическим правилам, но и в большую (или меньшую) сторону. Настраивается в меню "Справочники"->"Цены"->"Шкала округления цен"15.11.11.1Округление расходной цены. Изменения.'3!G>11.11.2015 11:07:52Новый механизм в программе, позволяющий задать свою наценку для каждого вида расходной цены. Находится в меню Торговля - Матрица наценок. Для ее использования в свойствах склада должен стоять флажок "Ценовой автомат". При проведении прихода, если была изменена приходная цена, в Журнале авторасчета расходных цен появится соответствующая рекомендация по изменению расходной цены.15.11.11.1Матрица наценок'n 3!!19.10.2015 23:59:04Новый режим расчета алкогольной декларации. Показывает излишки и списания.15.10.19.1Честная алкогольная декларация%_3%!a10.10.2015 21:17:10ВНИМАНИЕ. Полностью переделан механизм привязки складских документов к оплатам. Теперь возвраты поставщику и возвраты от покупателя не уменьшают сумму задолженности, а подвязываются к оплате как обычные накладные.15.10.10.1Расчеты с поставщиками$1 3o!910.10.2015 21:15:49Исправлено обновление таблиц при добавлении нового товара в ассортимент из приходной накладной15.10.10.1Приходная накладная. Мелкие ошибки интерфейса.$4 3!10.10.2015 21:12:19Новая основная настройка control_nomer_nakl позволяет отключить обязательное требование номера приходной накладной15.10.10.1Оформление прихода, номер накладной$3m!k10.10.2015 21:10:39Теперь консолидированный бюджет можно раскрыть по заявкам на финансирование. Также добавилась функция сбора фактического выполнения из консолидированного бюджета15.10.10.1Консолидированный бюджет$q3/!{10.10.2015 21:09:00Если в спецификации поставщика установлена нулевая цена на товар, то при оформлении прихода по умолчанию будет предложена последняя приходная цена.15.10.10.1Приходная цена в спецификации$315.09.2015 14:52:02Новая печатная форма для бюджета БДДС. Отображает выполнение бюджета в разрезе платежных документов.15.9.16.1Печатная форма для бюджета ЦФО.# w A coPwV3Y05.01.2016 10:57:25Два варианта импорта приходной накладной из Excel. 1) В качестве ключевого поля мспользуется код поставщика, который можно проставить в спецификации поставщиков. Позиции, не найденные по ключевому полю в спецификации - игнорируются. 2) В качестве ключевого поля используется штрихкод товара. Позиции, не найденные по штрихкоду, ищутся по наименованию. Если позиция не найдена, вызывается мастер связей, проставляющий соответствия между наименованием поставщика и наименованием товара в Меркурии.16.1.5.1Импорт прихода из Excel33=G05.01.2016 10:55:02Появилась возможность поменять в программе префикс для сканера штрихкода. В глобальных настройках переменная scanerprefix16.1.5.1Префикс сканера3E3g!k12.12.2015 14:57:081) В заголовке ревизии теперь можно выбрать ревизионный период. По умолчанию ставится период от прошлой ревизии до сегодняшнего дня. 2) В теле ревизии появились дополнительные колонки. В них отображаются данные по остаткам на начало ревизионного периода, а также приход и расход товара за ревизионный период. 3) Появилась возможность указывать контрагентов и коды реализации у документов, закрывающих ревизию.15.12.12.1Ревизия. Новый функционал.) 3o+p02.12.2015 19:56:31- В платежном документе можно менять ЦФО и статью бюджета без распроведения. - Выведено поле Артикул из карточки товара в приходы, расходы и текущее состояние склада.15.12.2.1Изменения в финансовом и складском модулях,q1Ckg01.12.2015 4:59:041) расчёт тренда в бюджете ЦФО 2) тренд считать только для непрерывных статей 3) заявки открываем дабл-кликом и F3 из детализации статьи бюджета по заявкам15.12.1.1Доработки бюджетирования+g 37!_W23.11.2015 18:18:09Появилась возможность сделать возврат от покупателя без ввода номера расхода. Цены в этом случае будут выставлены не из конкретного расхода, а текущие15.11.23.1Возврат от покупателя.), 3m!1V23.11.2015 18:16:23Новая глобальная опция rash_prinud_calc. При её установке сумма по позиции в расходе всегда будет равна произведению кол-ва и цены. Нельзя будет сохранить отличающуюся сумму15.11.23.1Принудительно пересчитывать сумму в расходе) 1!QK20.11.2015 9:42:25Возврат поставщику теперь можно привязать к приходу денег в кассу. Возврат от покупателя - к расходу денег.15.11.20.1Платежи. Изменения( "1 Z *"7 1+03.02.2016 9:56:42Заказ поставщику. Новый функционал, облегчающий ручной заказ поставщику. В заголовке заказа поставщику появилось новое поле "Дней, для анализа расходов". При создании заказа, это поле проставляется по умолчанию, как время между заказами из справочника контрагентов, но его можно изменить. При подборе товара в заказ, в списке доступных для заказа товаров появился новый столбец, показывающий продажи товара за столько дней, сколько указано в заголовке заказа.16.2.3.1Заказ поставщику. Новый функционал.=K3I30.01.2016 17:07:30Полноценная работа с правой кнопкой мыши. Теперь нажав правую кнопку мыши на документе или строке, появляется меню с выбором действий и всех горячих клавиш.16.1.30.1Popup  K ;+3!!b06.07.2016 10:04:07ЕГАИС: - Импорт приходов из ЕГАИС - Экспорт возвратов поставщикам в ЕГАИС16.7.6.1Егаис_r*3o?17.06.2016 12:04:14В приходных и расходных накладных появилась возможность подбирать товар с помощью дерева групп.16.6.17.1подбор товараZr)3o?17.06.2016 12:04:14В приходных и расходных накладных появилась возможность подбирать товар с помощью дерева групп.16.6.17.1подбор товараZ2(3gG17.06.2016 11:44:59Вывод суммы накладной в расходных ценах в журнале приходов.16.6.17.1журнал приходовZ2'3gG17.06.2016 11:44:59Вывод суммы накладной в расходных ценах в журнале приходов.16.6.17.1журнал приходовZ \ _ l \7oВ прайс листе есть возможность групповой переоценки товаров. Для этого надо отметить товары, подлежащие переоценке (клавиши "Ins", "+", "-"), и нажать комбинацию клавиш Ctrl+F3.k WНаходясь на позиции товара в любом документе, можно нажать клавишу "F9". Откроется аналитический инструмент, отображающий различную аналитику по текущему товару. Например, в каких приходах и расходах встречается товар, движение по позиции, присутствует ли товар в акциях, каковы результаты ревизии по этому товару в предыдущие периоды.  В журналах и документах можно установить быстрый фильтр по значению в столбце. Для этого нажмите клавишу "F2", установив курсор в ячейку, которую хотите отфильтровать. Можно фильтровать и по нескольким столбцам.h SНажатие кнопки "F7" открывает окно контекстного поиска.V /~Нажатие кнопки "F5" скопирует текущую запись или документ. В некоторых формах копирование вызывается нажатием Ctrl+F5.E  }Чтобы создать новый документ в журнале, или вставить строку в существующий документ - нажмите клавишу "F4".9u|Чтобы отредактировать строку или значение, нажмите клавишу "F3". В некоторых формах (например "Матрица наценок") возможно групповое редактирование по отмеченным записям.L{Чтобы удалить строку в документе или сам документ, нажмите клавишу "F8". Так же работает по отмеченным записям.FzВ журналах можно провести/распровести документ, нажав клавишу Alt+F5. Так же работает по отмеченным записям.pcyВ Меркурии есть интересная функция - работа с отмеченными записями. Отмечать можно как Для того, чтобы отметить запись нажмите клавишу "Ins". Повторное нажатие клавиши на той же строке отменит выделение. Чтобы отметить все записи - нажмите клавишу "+". Нажатие клавиши "-" снимет все выделения. С отмеченными записями можно проводить групповые операции. Например нажатие Alt+F6 покажет сумму по отмеченным записям.R'xЧтобы поменять текущий склад, нажмите Ctrl+S. wНажмите Altl+F3 находясь на наименовании товара в любом месте программы, чтобы открыть карточку ассортимента на просмотр или редактирование.sivНажмите Ctrl+Пробел находясь на наименовании товара в любом месте программы, чтобы посмотреть остатки этого товара на всех складах.O!uНажмите ALT+S чтобы открыть форму по имени.  q  q q}{[ВНИМАНИЕ!!! Бесплатная техподдержка находится на форуме http://forum.soft4trade.ru Зарегистрируйтесь и задавайте вопросы напрямую разработчикам!#Нажатие правой кнопки мышки, откроет контекстное меню документа или строки.Если вы по ошибке завели в справочнике ассортимента один товар несколько раз (под похожими наименованиями), вам поможет инструмент "Слияние позиций". Доступен в справочнике ассортимента по отмеченным позициям.(QНажав на кнопку с вопросительным знаком в правом верхнем углу формы, можно посмотреть подсказку по работе с этой формой, быстрые клавиши и особенности работы.CВ справочнике ассортимента есть инструмент группового редактирования карточек товаров. Для этого отметьте нужные товары (клавиши "Ins", "+", "-") и нажмите комбинацию клавиш Alt+F3. ]`] GW[SET TERM ^ ; CREATE OR ALTER procedure SP_BUDGET_PLAT_BY_STAT ( IS_BDDS integer, ID_CFO integer, ID_STAT integer, BD date, ED date) returns ( PLAT decimal(18,2), N_PKO integer, N_PLP integer, date_plat date, firm_name varchar(100)) as begin --если Бюджет - БДДС, то выдаем список платежек, а если БДР - пока что просто выходим if (is_bdds=1) then begin for SELECT COALESCE (summa,0) as s1, n_pko, n_plp, ks_1.DATE_CREATE, coalesce(bd_firm.name, bd_firm.fullname) as firm_name FROM KS_1 left join bd_firm on bd_firm.field_key=ks_1.fk_bd_firm --строгое неравенство из-за особенностей входных дат where date_create>=:bd and date_create<:ed and fk_bd_budget_j_cfo=:id_cfo and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :plat, :n_pko, :n_plp, :date_plat, :firm_name do begin SUSPEND; end END ELSE exit; END^ SET TERM ; ^#Хранимка получения инфы о платежках по статьям бюджета15.9.16.1CREATE procedure SP_BUDGET_PLAT_BY_STAT  K_SET TERM ^ ; CREATE OR ALTER procedure SP_BUDGET_FK_TO_INTERVAL ( FK_BUDGET integer) returns ( BD date, ED date -- , IS_BDDS integer, -- ID_CFO integer ) as declare variable TMP_DAY varchar(2); declare variable TMP_MONTH varchar(2); declare variable TMP_YEAR varchar(4); declare variable TMP_BD varchar(10); declare variable TMP_ED varchar(10); declare variable TIP integer; declare variable MONTH_NUM integer; declare variable QUARTER_NUM integer; declare variable YEAR_NUM integer; BEGIN select tip, month_num, quarter_num, year_num--, bd_budget_kinds.class, fk_cfo from bd_budget_cfo where bd_budget_cfo.field_key=:fk_budget into :tip, :month_num, :quarter_num, :year_num;--, :is_bdds, :id_cfo; tmp_year=cast (coalesce(year_num,0) as varchar(4)); tmp_month=cast (coalesce(month_num,0) as varchar(2)); if (tip=1) then begin --месячный бюджет bd=cast ('01'||'.'||tmp_month||'.'||tmp_year as date); if (month_num<12) then begin ed=cast ('01'||'.'||(cast (month_num+1 as varchar(2)))||'.'||tmp_year as date); end else begin ed=cast ('01.01.'||(cast (year_num+1 as varchar(4))) as date); end end if (tip=3) then begin --квартальный бюджет select case (:QUARTER_NUM) when 1 then cast('01.01.'||:tmp_year as date) when 2 then cast('01.04.'||:tmp_year as date) when 3 then cast('01.07.'||:tmp_year as date) when 4 then cast('01.10.'||:tmp_year as date) end from RDB$DATABASE into :bd; select case (:QUARTER_NUM) when 1 then cast('01.04.'||:tmp_year as date) when 2 then cast('01.07.'||:tmp_year as date) when 3 then cast('01.10.'||:tmp_year as date) when 4 then cast('01.01.'||(cast (:year_num+1 as varchar(4))) as date) end from RDB$DATABASE into :ed; end if (tip=12) then begin --годовой бюджет bd=cast ('01.01.'||tmp_year as date); ed=cast ('01.01.'||(cast (:year_num+1 as varchar(4))) as date); end suspend; END^ SET TERM ; ^#Хранимка получения интервала дат бюджета из его полей "тип периода, месяц, квартал, год"15.9.16.1CREATE procedure SP_BUDGET_FK_TO_INTERVAL  AcSET TERM ^ ; CREATE OR ALTER procedure SP_PRINT_BUDGET_BDDS_VYPOL ( FK_BUDGET integer) returns ( PLAT decimal(18,2), N_PKO integer, N_PLP integer, FK_STAT integer, NAME_STAT varchar(100), PLAN_STAT decimal(18,2), IS_DOHOD integer, PERIOD_NAME varchar(20), VERSIA integer, CFO_NAME varchar(100), DATE_PLAT date, FIRM_NAME varchar(100) ) as declare variable BD date; declare variable ED date; declare variable IS_BDDS integer; declare variable ID_CFO integer; declare variable TIP integer; declare variable MONTH_NUM integer; declare variable QUARTER_NUM integer; declare variable YEAR_NUM integer; BEGIN select bd, ed from SP_BUDGET_FK_TO_INTERVAL(:FK_BUDGET) into :bd, :ed; select bd_budget_kinds.class, fk_cfo, tip, month_num, quarter_num, year_num, versia, bd_budget_j_cfo.name from bd_budget_cfo join bd_budget_kinds on bd_budget_cfo.fk_kind=bd_budget_kinds.field_key join bd_budget_j_cfo on bd_budget_j_cfo.field_key=bd_budget_cfo.fk_cfo where bd_budget_cfo.field_key=:FK_BUDGET into :is_bdds, :id_cfo, :tip, :month_num, :quarter_num, :year_num, :versia, :cfo_name; select name from SP_GET_BUDGET_PERIOD_NAME(:tip, :month_num, :quarter_num, :year_num) into :period_name; for select bd_budget_j_stat.field_key, bd_budget_j_stat.is_active, bd_budget_cfo11.name, soglasovano from bd_budget_cfo11 join bd_budget_j_stat on bd_budget_j_stat.field_key=bd_budget_cfo11.fk_stat where FK_BD_BUDGET_CFO=:FK_BUDGET into :fk_stat, :is_dohod, :name_stat, :plan_stat do begin for select plat, n_pko, n_plp, date_plat, firm_name from SP_BUDGET_PLAT_BY_STAT (:IS_BDDS, :ID_CFO, :fk_STAT, :BD, :ED) into :plat, :n_pko, :n_plp, :date_plat, :firm_name do begin suspend; end end END^ SET TERM ; ^#Хранимка печати выполнения БДДС15.9.16.1CREATE procedure SP_PRINT_BUDGET_BDDS_VYPOL ` 7]!%SET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_dolg for bd_1 active before update position 0 AS declare variable summa_real decimal(15,2); declare variable summa_vozvrat decimal(15,2); declare variable summa_opl decimal(15,2); declare variable fk_11 integer; declare variable cena_pr decimal(8,2); BEGIN if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin new.DOLGFROMDATE=new.DATE_PRIH+iif(new.COD_PRIH in (2,3),coalesce(new.DAY_CONS_PRIH,0),0); --[18.09.2015] реализация приравнена к консигнации if (not(coalesce(new.COD_PRIH,0) in (7,8,9,1))) then --не: излишки, бонусный товар, товарообмен, пр-во begin --сумма по документу new.SUMMA=coalesce((select sum(summa_with_nds) from bd_11 where fk_bd_1=new.FIELD_KEY),0); --сумма возвратов summa_vozvrat=0; --по коду реализация возвраты раньше не считали --[18.09.2015] возвраты вообще не влияют на сумму долга по документу /*$$IBEC$$ for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_vozvrat=summa_vozvrat +cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21 where p.cod_rash=5 and fk_recipient=new.FK_SUPPLIER),0); end $$IBEC$$*/ --сумма оплат summa_opl=coalesce((select sum(summa) from ks_11 where fk_bd_1=new.FIELD_KEY),0); new.SUMMA_DOLG=new.SUMMA-summa_vozvrat-summa_opl; end /*$$IBEC$$ else begin new.summa=0; --сумма реализации summa_real=0; if (new.cod_prih=3) then --реализация --[18.09.2015] приравнено к консигнации begin for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_real=summa_real+cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21),0); end end $$IBEC$$*//*$$IBEC$$ if (new.cod_prih=1) then --реализация РЦ --[18.09.2015] убрано begin for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_real=summa_real+coalesce((SELECT sum(bd_21.SUMMA) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21),0); end end $$IBEC$$*//*$$IBEC$$ --сумма оплат summa_opl=coalesce((select sum(summa) from ks_11 where fk_bd_1=new.FIELD_KEY),0); new.SUMMA_DOLG=summa_real-summa_opl; end $$IBEC$$*/ end update bd_2 set summa_dolg=new.SUMMA_DOLG where fk_bd_1_6=new.FIELD_KEY; if ((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0)) then begin new.DOLGFROMDATE=new.DATE_PRIH+iif(new.COD_PRIH in (2,3),coalesce(new.DAY_CONS_PRIH,0),0); --[18.09.2015] реализация приравнена к консигнации new.SUMMA_DOLG=coalesce(new.SUMMA_DOLG,0)-new.SUMMA; end if (new.cod_prih in (7,8,9,1)) then --излишки, бонусный товар, товарообмен, пр-во begin new.dolgfromdate=null; new.summa_dolg=0; end END^ SET TERM ; ^$триггер прихода SUMMA_DOLG15.10.10.1tr_bd_1_dolg update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg+:summa_1 where fk_bd_1_6=:fk_1; end for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_21.CENA_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=1 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg+:summa_1 where fk_bd_1_6=:fk_1; end $$IBEC$$*/ end end else begin -- возврат поставщику - уменьшаем сумму долга по приходам --[18.09.2015] уже не уменьшаем /*$$IBEC$$ new.DOLGFROMDATE=null; new.summa=0; --ищем приходы от того же поставщика, которому делаем возврат, минуя все внутренние перемещения for select fk_bd_1, coalesce(sum(bd_21.summa),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier=new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 group by 1 into :fk_1, :summa_1 do update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin new.SUMMA_DOLG=coalesce(new.SUMMA_dolg,0)+coalesce(summa_21,0); new.DOLGFROMDATE=new.DATE_RASH+coalesce(new.DAY_CONS_RASH,0); update bd_21 set invalid_vozvrat_flag=1 where field_key=:fk_21; end $$IBEC$$*/ end --после проведения пытаемся разнести расход по существующим оплатам, если по нему есть долг --ОТМЕНЕНО! 27.08.2015 /*$$IBEC$$ if (new.SUMMA_DOLG>0) then begin --если расход уже частично разнесен, пытаемся разнести по той же оплате dolg_doc=new.SUMMA_DOLG; for select ks_11.FIELD_KEY, ks_1.SUMMA_DOLG from ks_11 join ks_1 on ks_1.FIELD_KEY=ks_11.FK_KS_1 where ks_11.FK_BD_2=new.FIELD_KEY and ks_1.SUMMA_DOLG>0 order by date_create, field_key into :fk_ks11, :summa_bufer do begin if (summa_bufer>dolg_doc) then summa_bufer=dolg_doc; dolg_doc=dolg_doc-summa_bufer; update ks_11 set summa=summa+:summa_bufer where field_key=:fk_ks11; new.SUMMA_DOLG=new.SUMMA_DOLG-summa_bufer; end end --после этого разносим по другим оплатам, если остался долг if (new.SUMMA_DOLG>0) then begin -- if (new.fk_selful2 is null) then ? зачем это условие? dolg_doc=new.SUMMA_DOLG; for select ks_1.FIELD_KEY, ks_1.SUMMA_DOLG from ks_1 where ks_1.SUMMA_DOLG>0 and --определяемся с типом оплаты ( --обычный расход (coalesce(new.COD_RASH,0)<>7 and (new.FK_SELFUL2 is null) and ks_1.FK_SELFUL=new.FK_SELFUL and ks_1.FK_BD_FIRM=new.FK_RECIPIENT and ks_1.PRIH=1) or --возврат от получателя (coalesce(new.COD_RASH,0)=7 and (new.FK_SELFUL2 is null) and ks_1.FK_SELFUL=new.FK_SELFUL and ks_1.FK_BD_FIRM=new.FK_RECIPIENT and ks_1.prih=0) or --расход на свое юр.лицо (coalesce(new.COD_RASH,0)<>7 and (new.FK_SELFUL2 is not null) and ks_1.FK_SELFUL=new.FK_SELFUL2 and ks_1.FK_SELFUL2=new.FK_SELFUL and ks_1.PRIH=2) ) order by date_create, field_key into :fk_ks1, :summa_bufer do begin if (summa_bufer>dolg_doc) then summa_bufer=dolg_doc; dolg_doc=dolg_doc-summa_bufer; if (summa_bufer>0) then INSERT INTO KS_11 (FK_KS_1, FK_BD_2, SUMMA, IS_ZV, TS_CREATE) VALUES (:fk_ks1,new.FIELD_KEY, :summa_bufer, 0, current_timestamp); new.SUMMA_DOLG=new.SUMMA_DOLG-summa_bufer; end end $$IBEC$$*/ end --проведения расхода --РАСПРОВЕДЕНИЕ РАСХОДА if (((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0))) then begin if (not(new.COD_RASH in (9,1))) then --обычный расход - уменьшаем сумму долга по расходу --(5,7)? begin if (new.FK_BD_1_6 is null) then new.SUMMA_DOLG=new.SUMMA_DOLG-coalesce((select sum(summa) from bd_22 where fk_bd_2=new.FIELD_KEY),0); else new.SUMMA_DOLG=coalesce((select summa_dolg from bd_1 where field_key=new.FK_BD_1_6),0); new.SUMMA=0; if (new.COD_RASH<>6) then --кроме расходов по внутреннему перемещению, при их проведении долг на приход не начисляем begin --[18.09.2015] убрано /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_11.CENA_PR_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=3 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg-:summa_1 where fk_bd_1_6=:fk_1; end for select fk_bd_1, coalesce(sum(bd_21.SUMMA),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=1 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg-:summa_1 where fk_bd_1_6=:fk_1; end $$IBEC$$*/ end end else begin -- возврат поставщику - увеличиваем сумму долга по приходам --[18.09.2015] уже не меняем --ищем приходы от того же поставщика, которому делаем возврат, минуя все внутренние перемещения /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.summa),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier=new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 group by 1 into :fk_1, :summa_1 do update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin new.SUMMA_DOLG=coalesce(new.SUMMA_dolg,0)-coalesce(summa_21,0); end $$IBEC$$*/ end end END^ SET TERM ; ^$триггер расхода SUMMA_DOLG15.10.10.1tr_bd_2_dolg zBzE 5!1update bd_cod_rash set name='Товарообмен' where field_key=1;$Переименование "Реализация РЦ" в "Товарообмен"15.10.10.1update bd_cod_rash/ S]!%SET TERM ^ ; CREATE OR ALTER trigger tr_bd_2_dolg for bd_2 active before update or delete position 5 AS declare variable fk_1 integer; declare variable summa_1 decimal(15,2); declare variable fk_21 integer; declare variable summa_21 decimal(15,2); declare variable dolg_doc decimal(15,2); declare variable summa_bufer decimal(15,2); declare variable fk_ks11 integer; declare variable fk_ks1 integer; BEGIN if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin --проведение расхода if (not(new.COD_RASH in (9,1))) then --обычный расход - увеличиваем сумму долга по расходу --(5,7)? begin new.DOLGFROMDATE=new.DATE_RASH+coalesce(new.DAY_CONS_RASH,0); new.SUMMA=abs(coalesce((select sum(cast(summa as decimal(15,3))) from bd_22 where fk_bd_2=new.FIELD_KEY),0)); if (new.FK_BD_1_6 is null) then begin new.SUMMA_DOLG=new.SUMMA_DOLG+new.SUMMA; end else begin --это перемещение, тогда просто берем долг из прихода new.SUMMA_DOLG=coalesce((select summa_dolg from bd_1 where field_key=new.FK_BD_1_6),0); end --реализация: увеличиваем долг по приходам, у которых код=3, надо вытащить внутренние перемещения, --[18.09.2015] реализация приравнена к консигнации, товарообмен не трогаем if (new.COD_RASH<>6) then --кроме расходов по внутреннему перемещению, при их проведении долг на приход не начисляем begin /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_11.CENA_PR_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=3 group by 1 into :fk_1, :summa_1 do begin COD_PRIH.NAME||')' when 2 then ' ('||BD_COD_PRIH.NAME||' '||(date_prih+coalesce(main.DAY_CONS_PRIH,0))||')' when 3 then ' ('||BD_COD_PRIH.NAME||')' when 4 then ' ('||BD_COD_PRIH.NAME||')' when 6 then ' ('||BD_COD_PRIH.NAME||')' else '' end), main.NOMER_PRIH, main.DATE_PRIH, (select sum(summa_with_nds) -- - coalesce(sum(bd_21.summa),0) --[24.09.2015] вычитать возвраты поставщику не надо from bd_11 --left join bd_21 on bd_21.fk_bd_11=bd_11.field_key and bd_21.cod_rash=5 where fk_bd_1=main.field_key) from bd_1 main left join bd_cod_prih on BD_COD_PRIH.FIELD_KEY=main.COD_PRIH where main.field_key=:id_prih and (coalesce(cod_prih,0)<>6 or :is_zv=1) into :typdoc, :nomerdoc, :datdoc, :summadoc; --находим неоплаченную сумму по приходу select :summadoc-coalesce(sum(KS_11.SUMMA),0) from ks_11 where fk_bd_1=:id_prih and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END if (id_rash is not null) THEN BEGIN --данные по расходу --typdoc='Реализация'; select cod_rash, case when cod_rash=6 then :prihod6_txt||coalesce('('||trim(nomer_nakl)||')','') else (:rashod_txt||(case main.cod_rash when 0 then ' ('||BD_COD_rash.NAME||')' when 2 then ' ('||BD_COD_rash.NAME||(date_rash+coalesce(main.DAY_CONS_RASH,0))||')' when 3 then ' ('||BD_COD_rash.NAME||')' when 5 then ' ('||BD_COD_rash.NAME||')' when 8 then ' ('||BD_COD_rash.NAME||')' when 7 then BD_COD_rash.NAME else '' end)) end , main.NOMER_rash, main.DATE_rash, (select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=main.field_key) from bd_2 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.field_key=:id_rash into :cod_rash, :typdoc, :nomerdoc, :datdoc, :summadoc; if (cod_rash in (5,7)) then summadoc=(-1)*summadoc; --находим неоплаченную сумму по расходу select :summadoc-coalesce(sum(ks_11.SUMMA),0) from ks_11 where fk_bd_2=:id_rash and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END if (id_sh_in is not null) THEN BEGIN --данные по заказу поставщика typdoc=zakaz_txt; select main.NOMER_SHET, main.DATE_ORDER, (select sum(BD_ORDER_IN_11.SUMMA_WITH_NDS) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_ORDER_IN_1=main.field_key) from BD_ORDER_IN_1 main where main.field_key=:id_sh_in into :nomerdoc, :datdoc, :summadoc; --находим неоплаченную сумму по приходу select :summadoc-coalesce(sum(ks_11.SUMMA),0) from ks_11 where fk_order_in=:id_sh_in and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END if (id_sh_out is not null) THEN BEGIN --данные по расходу --typdoc='Исходящий счет'; select main.NOMER_SHET, main.DATE_ORDER, (select sum(BD_ORDER_OUT_11.SUMMA_WITH_NDS) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=main.field_key), :ish_shet_txt||(case main.cod_rash when 0 then ' ('||BD_COD_rash.NAME||')' when 2 then ' ('||BD_COD_rash.NAME||')' when 3 then ' ('||BD_COD_rash.NAME||')' when 5 then ' ('||BD_COD_rash.NAME||')' when 8 then ' ('||BD_COD_rash.NAME||')' else '' end) from BD_ORDER_OUT_1 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.field_key=:id_sh_out into :nomerdoc, :datdoc, :summadoc, :typdoc; --находим неоплаченную сумму по приходу select :summadoc-coalesce(sum(ks_11.SUMMA),0) from ks_11 where fo_order_out=:id_sh_out and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END id_prih=null; id_rash=null; id_sh_in=null; id_sh_out=null; currdolg=dolgdoc; SUSPEND; END END^ SET TERM ; ^$отображение связанных с платёжкой накладных15.10.10.1SP_KS_11_DOC D as!+ SET TERM ^ ; CREATE OR ALTER procedure SP_KS_11_PODBOR ( IS_PRIHOD integer, FK_BD_FIRM integer, FK_CODI integer, FK_KS1 integer, FK_KS_SHET integer, FK_KS_SHET2 integer) returns ( NUM_TYPDOC integer, FK_DOC integer, NOMERDOC integer, DATDOC date, DATDOC_ENTER date, SUMMADOC decimal(15,2), DOLGDOC decimal(15,2), TYPDOC varchar(50), COD_DOC varchar(10), FK_KS11 integer) as declare variable PODBOR integer; declare variable ID_RASH integer; declare variable ID_SH_IN integer; declare variable ID_SH_OUT integer; declare variable URTO integer; declare variable URFROM integer; declare variable LANG varchar(2); declare variable VH_SHET_TXT varchar(100); declare variable PRIHOD_TXT varchar(100); declare variable VOZVRAT_TXT varchar(100); declare variable ISH_SHET_TXT varchar(100); declare variable RASHOD_TXT varchar(100); BEGIN lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); vh_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Входящий счет ',:lang)),''); prihod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); vozvrat_txt= coalesce((select TR_NAME from SP_TRANSLATE('Возврат от получателя ',:lang)),''); ish_shet_txt=coalesce((select TR_NAME from SP_TRANSLAd i1!% SET TERM ^ ; CREATE OR ALTER procedure SP_KS_11_DOC ( FK_KS_1 integer) returns ( FK_KS_11 integer, NOMERDOC varchar(30), DATDOC date, SUMMADOC decimal(15,2), DOLGDOC decimal(15,2), TYPDOC varchar(50), CURRDOLG decimal(15,2), COD_DOC varchar(10)) as declare variable ID_PRIH integer; declare variable ID_RASH integer; declare variable ID_SH_IN integer; declare variable ID_SH_OUT integer; declare variable COD_RASH integer; declare variable IS_ZV integer; declare variable LANG varchar(2); declare variable PRIHOD_TXT varchar(100); declare variable PRIHOD6_TXT varchar(100); declare variable ZAKAZ_TXT varchar(100); declare variable RASHOD_TXT varchar(100); declare variable ISH_SHET_TXT varchar(100); BEGIN lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); prihod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); rashod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Расход ',:lang)),''); prihod6_txt=coalesce((select TR_NAME from SP_TRANSLATE('Внутреннее перемещение ',:lang)),''); zakaz_txt=coalesce((select TR_NAME from SP_TRANSLATE('Заказ поставщику ',:lang)),''); ish_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Исходящий счет ',:lang)),''); for select field_key, ks_11.FK_BD_1, ks_11.FK_BD_2, ks_11.FK_ORDER_IN, ks_11.FO_ORDER_OUT, is_zv from ks_11 where fk_ks_1=:fk_ks_1 and fk_ks11_6 is null into :fk_ks_11, :id_prih, :id_rash, :id_sh_in, :id_sh_out, :is_zv do BEGIN if (id_prih is not null) THEN BEGIN --данные по приходу --typdoc='Приход'; select :prihod_txt||(case main.cod_prih when 0 then ' ('||BD_TE('Исходящий счет ',:lang)),''); rashod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Расход ',:lang)),''); select fk_selful from KS_SCHET where field_key=:fk_ks_shet into :urfrom; select fk_selful from KS_SCHET where field_key=:fk_ks_shet2 into :urto; select coalesce(KS_KODI.PODBOR,2) from ks_kodi where field_key=:fk_codi into :podbor; -- podbor=coalesce(podbor,2); --если подбор не указан, выводим все документы podbor=2; --теперь всегда выводим все документы, подбор по типам убран IF (IS_PRIHOD=0) THEN BEGIN --расход - оплата счетов поставщиков и приходов if (podbor in (0,2)) then BEGIN /*$$IBEC$$ ОТМЕНЕН ПОДБОР ПО ЗАЯВКАМ 27.08.2015 for select main.FIELD_KEY, main.NOMER_SHET, main.DATE_ORDER, sum(bd_order_in_11.SUMMA_WITH_NDS), -coalesce((select sum(ks_11.summa) from ks_11 where fk_order_in=main.field_key),0)+sum(bd_order_in_11.SUMMA_WITH_NDS) from BD_ORDER_IN_1 main left join BD_ORDER_IN_11 on BD_ORDER_IN_11.FK_BD_ORDER_IN_1=main.FIELD_KEY where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and main.field_key not in (select coalesce(fk_order_in,-1) from KS_11 where fk_ks_1=:fk_ks1) group by 1,2,3 having coalesce((select sum(ks_11.summa) from ks_11 where fk_order_in=main.field_key),0)0 and cod_prih=4 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END END if (podbor in (1,2)) then BEGIN --приходы for select main.FIELD_KEY, main.NOMER_PRIH, main.DOLGFROMDATE, main.date_prih, main.summa, summa_dolg, :prihod_txt, 100||coalesce(main.COD_PRIH,'') from BD_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) and main.cod_prih not in (4,9) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END --возвраты от получателя --[24.09.2015] заменено на возвраты поставщику for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg, :rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH=5 --было 7 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; ---- suspend; END END END IF (IS_PRIHOD=1) then BEGIN if (podbor in (0,2)) then BEGIN /*$$IBEC$$ ОТМЕНЕН ПОДБОР ПО ЗАЯВКАМ 27.08.2015 for select main.FIELD_KEY, main.NOMER_SHET, main.DATE_ORDER, sum(bd_order_out_11.SUMMA_WITH_NDS), -coalesce((select sum(ks_11.summa) from ks_11 where FO_ORDER_out=main.field_key),0)+sum(bd_order_out_11.SUMMA_WITH_NDS) from BD_ORDER_out_1 main join bd_firm on BD_FIRM.FIELD_KEY=main.FK_BD_FIRM left join BD_ORDER_out_11 on BD_ORDER_out_11.FK_BD_OUT_1=main.FIELD_KEY where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:urfrom and main.field_key not in (select coalesce(KS_11.FO_ORDER_OUT,-1) from KS_11 where fk_ks_1=:fk_ks1) group by 1,2,3 having coalesce((select sum(ks_11.summa) from ks_11 where FO_ORDER_out=main.field_key),0)0 and main.COD_RASH=8 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, main.summa, summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (2,3,0) --[24.09.2015] 5 убрано and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END --[24.09.2015] добавлено, код 7 if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (7) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (is_prihod=2) THEN BEGIN --если это перемещение между счетами, находим внутренние перемещения между складами юрлиц --находим юр.лицо-отправитель и юр.лицо-получатель --находим все неоплаченные расходы со склада-юрлица счета получателя на склады юрлица счета-отправителя, --потому что товары и деньги движутся в противоположных направлениях... for select main.FIELD_KEY, main.NOMER_rash, main.dolgfromdate, main.date_rash, summa, summa_dolg, bd_cod_rash.name||coalesce('('||trim(main.NOMER_NAKL)||')','') from BD_2 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.fk_selful=:urto and main.fk_selful2=:urfrom and main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and summa_dolg>0 into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc do BEGIN num_typdoc=4; suspend; END END END^ SET TERM ; ^$Платежки: ручное разнесение15.10.10.1SP_KS_11_PODBOR --select sum(summa) from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_1 is not null into :sum_raznes; --сначала по заявкам на оплату от этого контрагента на это юр.лицо и этот счет for select ks_11.FIELD_KEY, ks_11.PLAN_DAT, ks_11.PLAN_SUM from ks_11 join bd_1 on bd_1.field_key=ks_11.fk_bd_1 where fk_ks_1 is null and plan_fk_schet=:fk_schet and bd_1.FK_SELFUL=:fk_ul and bd_1.FK_BD_FIRM=:fk_bd_firm and ((coalesce(bd_1.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) order by 2 into :fk_ks11, :date_dolg, :dolgdoc do BEGIN if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; update ks_11 set fk_ks_1=:fk_ks1, summa=:sum_opl where field_key=:fk_ks1; sum_ost=sum_ost-sum_opl; end else break; end --сначала учитывать накладные со склада = подразделение платежа if (:fk_sklad<>-1) then BEGIN for select main.field_key, dolgfromdate, 1 as typdoc, summa_dolg from bd_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg>0 and coalesce(main.COD_PRIH,0) in (2,3,0,4) and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- UNION select main.FIELD_KEY, main.DATE_RASH, 2 as typdoc, 0-summa_dolg from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg<>0 and main.COD_RASH=5 and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- order by 2 asc, 3 desc into :fk_doc, :date_dolg, :typdoc, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN BREAK; if (typdoc=1) then begin if (not exists(select field_key from ks_11 where ks_11.FK_KS_1=:fk_ks1 and fk_bd_1=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_1, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_1=:fk_doc; end if (typdoc=2) then begin if (not exists(select field_key from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc; end sum_ost=sum_ost-sum_opl; end else BREAK; end END --затем накладные с других складов for select main.field_key, dolgfromdate, 1 as typdoc, summa_dolg from bd_1 main --BD_1 main left join BD_11 on BD_11.FK_BD_1=main.FIELD_KEY where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg>0 and coalesce(main.COD_PRIH,0) in (2,3,0,4) and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- --and field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1)  UNION select main.FIELD_KEY, main.DATE_RASH, 2 as typdoc, 0-summa_dolg from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg<>0 and main.COD_RASH=5 and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- --and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) order by 2 asc, 3 desc into :fk_doc, :date_dolg, :typdoc, :dolgdoc do BEGIN if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; if (typdoc=1) then begin if (not exists(select field_key from ks_11 where ks_11.FK_KS_1=:fk_ks1 and fk_bd_1=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_1, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_1=:fk_doc; end if (typdoc=2) then begin if (not exists(select field_key from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc; end sum_ost=sum_ost-sum_opl; end else BREAK; END END --prih=0 if (prih=1) THEN BEGIN sum_ost=coalesce((select ks_1.summa-coalesce(sum(ks_11.summa),0) from KS_1 left join ks_11 on ks_11.FK_KS_1=ks_1.FIELD_KEY and (ks_1.PRIH=1 and ks_11.fk_bd_2 is not null) where ks_1.field_key=:fk_ks1 group by ks_1.summa),0); --разносим по расходам --сначала учитывать накладные со склада = подразделение платежа if (:fk_sklad<>-1) then begin for select main.FIELD_KEY, main.DATE_RASH, iif(main.cod_rash=7,0-summa_dolg,summa_dolg) from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and ( (summa_dolg>0 and main.COD_RASH in (2,3,0,8)) or ((summa_dolg<>0 and main.COD_RASH in (7))) ) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- order by 2, 3 into :fk_doc, :date_dolg, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else BREAK; end end --затем накладные с других складов for select main.FIELD_KEY, main.DATE_RASH, iif(main.cod_rash=7,0-summa_dolg,summa_dolg) from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and ( (summa_dolg>0 and main.COD_RASH in (2,3,0,8)) or ((summa_dolg<>0 and main.COD_RASH in (7))) ) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- order by 2, 3 into :fk_doc, :date_dolg, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else BREAK; end END --prih=1 if (prih=2) THEN --разносим по внутренним перемещениям BEGIN select sum(summa) from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null into :sum_raznes; sum_ost=sum_opl-coalesce(sum_raznes,0); for select main.FIELD_KEY, main.DATE_rash, -coalesce((select sum(ks_11.summa) from ks_11 where FK_BD_2=main.field_key),0)+sum(bd_21.SUMMA) from BD_2 main left join BD_21 on BD_21.FK_BD_2=main.FIELD_KEY where main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and main.fk_selful=:fk_ul2 and main.fk_selful2=:fk_ul group by 1,2 having coalesce((select sum(ks_11.summa) from ks_11 where FK_BD_2=main.field_key),0)0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else break; END END --обработка если сумма оплаты меньше суммы разнесения if (prih=0) then --уменьшаем разнесение по приходам BEGIN sum_ost=coalesce((select ks_1.summa-coalesce(sum(ks_11.summa),0) from KS_1 left join ks_11 on ks_11.FK_KS_1=ks_1.FIELD_KEY and (ks_1.PRIH=0 and ((ks_11.fk_bd_1 is not null) or (coalesce(ks_11.summa,0)<0))) where ks_1.field_key=:fk_ks1 group by ks_1.summa),0); if (sum_ost<0) then -- if (2>3) then begin for select ks_11.field_key, ks_11.summa from ks_11 where fk_ks_1=:fk_ks1 and ks_11.fk_bd_1 is not null order by field_key desc into :fk_ks11, :sum_ks11 do begin if (sum_ost<0) then begin if (sum_ks113) then begin for select ks_11.field_key, ks_11.summa from ks_11 where fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null order by field_key desc into :fk_ks11, :sum_ks11 do begin if (sum_ost<0) then begin if (sum_ks110) then suspend; $$IBEC$$*/ --оплачено name='Оплачено'; summa=-1*coalesce((select sum(abs(summa)) from ks_11 where fk_bd_1=:fk_doc),0); if (summa<>0) then suspend; --текущий долг name='Текущий долг'; summa=coalesce((select sum(summa_dolg) from bd_1 where field_key=:fk_doc),0); suspend; end --расходы if (typ_doc='BD_2') then begin --сумма по документу select cod_rash, fk_recipient from bd_2 where field_key=:fk_doc into :cod_rash, :fk_recipient; name='Сумма по документу'; summa=coalesce((select sum(bd_22.summa) from bd_22 join bd_2 on bd_2.field_key=bd_22.fk_bd_2 where fk_bd_2=:fk_doc and cod_rash in(0,2,3,5,6,7,8)),0); --добавил 5 [17.09.2015] if (cod_rash in (5,7)) then summa=-1*summa; suspend; --оплачено name='Оплачено'; summa=coalesce((select sum(abs(summa)) from ks_11 where fk_bd_2=:fk_doc),0); if (summa<>0) then suspend; --корректировка долга по возвратам - устарело [17.09.2015] /*$$IBEC$$ name='Корректировка по возвратам'; summa_vozvrat=0; if (cod_rash=5) then begin for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>:FK_RECIPIENT) where bd_21.fk_bd_2=:fk_doc and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin summa_vozvrat=summa_vozvrat+coalesce(summa_21,0); end end summa=summa_vozvrat; if (summa<>0) then suspend; $$IBEC$$*/ --текущий долг name='Текущий долг'; summa=coalesce((select sum(summa_dolg) from bd_2 where field_key=:fk_doc),0); if (cod_rash in (5,7)) then summa=-1*summa; suspend; end --заказ поставщику if (typ_doc='BD_ORDER_IN_1') then begin --сумма по документу name='Сумма по документу'; summa=coalesce((select sum(cast(BD_ORDER_IN_11.CENA_PR_WITH_NDS*CNT as decimal(15,2))) from BD_ORDER_IN_11 where fk_bd_order_in_1=:fk_doc),0); suspend; --оплачено name='Оплачено'; summa=coalesce((select sum(summa) from ks_11 where fk_order_in=:fk_doc),0); if (summa<>0) then suspend; --текущий долг name='Текущий долг'; summa=coalesce((select sum(summa_dolg) from BD_ORDER_IN_1 where field_key=:fk_doc),0); suspend; end --заказ от получателя if (typ_doc='BD_ORDER_OUT_1') then begin --сумма по документу name='Сумма по документу'; summa=coalesce((select sum(cast(BD_ORDER_OUT_11.CENA_PR_WITH_NDS*CNT as decimal(15,2))) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=:fk_doc),0); suspend; --оплачено name='Оплачено'; summa=coalesce((select sum(summa) from ks_11 where fo_order_out=:fk_doc),0); if (summa<>0) then suspend; --текущий долг name='Текущий долг'; summa=coalesce((select sum(summa_dolg) from BD_ORDER_OUT_1 where field_key=:fk_doc),0); suspend; end END^ SET TERM ; ^$Отображение долгов и оплат в накладных15.10.10.1SP_GET_SUMMA_FOR_ZVOPL 2 2*  w!M INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Бюджет ЦФО', 'tfrmeditbudgetcfo', 46); INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Бюджет ЦФО', 'tfrmbudgetcfo', 46); INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Бюджет консолидированный', 'tfrmbudgetconsol', 47); INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Бюджет консолидированный', 'tfrmeditbudgetconsol', 47); $Режимы печатных форм бюджета15.10.10.1INSERT INTO BD_SMARTPRINT_REZHIM( G[!% SET TERM ^ ; CREATE OR ALTER trigger tr_ks11_dolg for ks_11 active before insert or update or delete position 0 AS BEGIN if (inserting) then begin --приход и расход: уменьшаем долг if ((new.FK_BD_1 is not null)and(coalesce(abs(new.summa),0)<>0)) then update bd_1 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FK_BD_1; if ((new.FK_BD_2 is not null)and(coalesce(abs(new.summa),0)<>0)) then update bd_2 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FK_BD_2; if ((new.FK_ORDER_IN is not null)and(coalesce(abs(new.summa),0)<>0)) then update BD_ORDER_IN_1 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FK_ORDER_IN; if ((new.FO_ORDER_OUT is not null)and(coalesce(abs(new.summa),0)<>0)) then update BD_ORDER_OUT_1 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.Fo_ORDER_OUT; if (new.FK_KS11_6 is null) then update ks_1 set summa_dolg=coalesce(summc i!9SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SUMMA_FOR_ZVOPL ( FK_DOC integer, TYP_DOC varchar(20)) returns ( NAME varchar(50), SUMMA decimal(15,2)) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_VOZVRAT decimal(15,2); declare variable FK_11 integer; declare variable CENA_PR decimal(8,2); declare variable FK_SUPPLIER integer; declare variable COD_RASH integer; declare variable FK_RECIPIENT integer; declare variable SUMMA_21 decimal(15,2); declare variable FK_21 integer; BEGIN --приходы if (typ_doc='BD_1') then begin --сумма по документу name='Сумма по документу'; summa=coalesce((select sum(cast(bd_11.SUMMA_WITH_NDS as decimal(15,2))) from bd_11 where fk_bd_1=:fk_doc),0); suspend; --возвраты /*$$IBEC$$ name='Возвраты на сумму'; summa_vozvrat=0; for select bd_11.FIELD_KEY, cena_pr_with_nds, fk_supplier from bd_11 where fk_bd_1=:fk_doc and cod_prih<>3 into :fk_11, :cena_pr, :fk_supplier do begin summa_vozvrat=summa_vozvrat+cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21 where p.cod_rash=5 and fk_recipient=:fk_supplier),0); end summa=-1*summa_vozvrat; if (summa<>0) then suspend; --реализации name='Реализовано на сумму'; summa_real=0; for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=:fk_doc and cod_prih=3 into :fk_11, :cena_pr do begin summa_real=summa_real+cena_pr*coalesce((SELECT sum(bd_21.CNTa_dolg,0)-coalesce(new.summa,0) where field_key=new.FK_KS_1; end if (updating) then begin --увеличиваем старый долг и уменьшаем новый if ((new.FK_BD_1 is not null)and(coalesce(abs(new.summa),0)<>0)) then update bd_1 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FK_BD_1; if ((old.FK_BD_1 is not null)and(coalesce(abs(old.summa),0)<>0)) then update bd_1 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FK_BD_1; if ((new.FK_BD_2 is not null)and(coalesce(abs(new.summa),0)<>0)) then update bd_2 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FK_BD_2; if ((old.FK_BD_2 is not null)and(coalesce(abs(old.summa),0)<>0)) then update bd_2 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FK_BD_2; if ((new.FK_ORDER_IN is not null)and(coalesce(abs(new.summa),0)<>0)) then update BD_ORDER_IN_1 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FK_ORDER_IN; if ((old.FK_ORDER_IN is not null)and(coalesce(abs(old.summa),0)<>0)) then update BD_ORDER_IN_1 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FK_ORDER_IN; if ((new.FO_ORDER_OUT is not null)and(coalesce(abs(new.summa),0)<>0)) then update BD_ORDER_OUT_1 set summa_dolg=coalesce(summa_dolg,0)-abs(new.summa), summa_opl=coalesce(summa_opl,0)+abs(new.summa) where field_key=new.FO_ORDER_OUT; if ((old.FO_ORDER_OUT is not null)and(coalesce(abs(old.summa),0)<>0)) then update BD_ORDER_OUT_1 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FO_ORDER_OUT; if (((new.FK_BD_1 is not null)or(new.FK_BD_2 is not null))and(new.FK_KS11_6 is null)) then update ks_1 set summa_dolg=summa_dolg+coalesce(old.summa,0)-coalesce(new.summa,0) where field_key=new.FK_KS_1; if (coalesce(old.FK_KS_1,0)<>coalesce(new.FK_KS_1,0)) then begin update ks_1 set summa_dolg=summa_dolg+coalesce(old.summa,0) where field_key=old.FK_KS_1; update ks_1 set summa_dolg=summa_dolg-coalesce(new.summa,0) where field_key=new.FK_KS_1; end end if (deleting) then begin --приход и расход: увеличиваем долг if ((old.FK_BD_1 is not null)and(coalesce(abs(old.summa),0)<>0)) then update bd_1 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FK_BD_1; if ((old.FK_BD_2 is not null)and(coalesce(abs(old.summa),0)<>0)) then update bd_2 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FK_BD_2; if ((new.FK_ORDER_IN is not null)and(coalesce(abs(new.summa),0)<>0)) then update BD_ORDER_IN_1 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.FK_ORDER_IN; if ((new.FO_ORDER_OUT is not null)and(coalesce(abs(new.summa),0)<>0)) then update BD_ORDER_OUT_1 set summa_dolg=coalesce(summa_dolg,0)+abs(old.summa), summa_opl=coalesce(summa_opl,0)-abs(old.summa) where field_key=old.Fo_ORDER_OUT; if (old.FK_KS11_6 is null) then update ks_1 set summa_dolg=coalesce(summa_dolg,0)+coalesce(old.summa,0) where field_key=old.FK_KS_1; end END^ SET TERM ; ^$Обновление долгов в накладных при изменениях в платежке15.10.10.1tr_ks11_dolg  r _!-SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4)) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_SUPPLIER1 YG!;SET TERM ^ ; CREATE OR ALTER procedure SP_PRINT_BUDGET_BDDS_VYPOL ( FK_BUDGET integer) returns ( PLAT decimal(18,2), N_PKO integer, N_PLP integer, FK_STAT integer, NAME_STAT varchar(100), PLAN_STAT decimal(18,2), IS_DOHOD integer, PERIOD_NAME varchar(20), VERSIA integer, CFO_NAME varchar(100), DATE_PLAT date, FIRM_NAME varchar(100), PRIM varchar(50), kodi_name varchar(100)) as declare variable BD date; declare variable ED date; declare variable IS_BDDS integer; declare variable ID_CFO integer; declare variable TIP integer; declare variable MONTH_NUM integer; declare variable QUARTER_NUM integer; declare variable YEAR_NUM integer; BEGIN select bd, ed from SP_BUDGET_FK_TO_INTERVAL(:FK_BUDGET) into :bd, :ed; select bd_budget_kinds.class, fk_cfo, tip, month_num, quarter_num, year_num, versia, bd_budget_j_cfo.name from bd_budget_cfo join bd_budget_kinds on bd_budget_cfo.fk_kind=bd_budget_kinds.field_key join bd_budget_j_cfo on bd_budget_j_cfo.field_key=bd_budget_cfo.fk_cfo where bd_budget_cfo.field_key=:FK_BUDGET into :is_bdds, :id_cfo, :tip, :month_num, :quarter_num, :year_num, :versia, :cfo_name; select name from SP_GET_BUDGET_PERIOD_NAME(:tip, :month_num, :quarter_num, :year_num) into :period_name; for select bd_budget_j_stat.field_key, bd_budget_j_stat.is_active, bd_budget_cfo11.name, soglasovano from bd_budget_cfo11 join bd_budget_j_stat on bd_budget_j_stat.field_key=bd_budget_cfo11.fk_stat where FK_BD_BUDGET_CFO=:FK_BUDGET into :fk_stat, :is_dohod, :name_stat, :plan_stat do begin for select plat, n_pko, n_plp, date_plat, firm_name, prim, kodi_name from SP_BUDGET_PLAT_BY_STAT (:IS_BDDS, :ID_CFO, :fk_STAT, :BD, :ED) into :plat, :n_pko, :n_plp, :date_plat, :firm_name, :prim, :kodi_name do begin suspend; end end END^ SET TERM ; ^ $печать бюджета 215.10.10.1для Эльчина 2W %G!;SET TERM ^ ; CREATE OR ALTER procedure SP_BUDGET_PLAT_BY_STAT ( IS_BDDS integer, ID_CFO integer, ID_STAT integer, BD date, ED date) returns ( PLAT decimal(18,2), N_PKO integer, N_PLP integer, DATE_PLAT date, FIRM_NAME varchar(100), PRIM varchar(50), kodi_name varchar(100)) as begin --если Бюджет - БДДС, то выдаем список платежек, а если БДР - пока что просто выходим if (is_bdds=1) then begin for SELECT COALESCE (summa,0) as s1, n_pko, n_plp, ks_1.DATE_CREATE, coalesce(bd_firm.name, bd_firm.fullname) as firm_name, ks_1.prim, ks_kodi.name as kodi_name FROM KS_1 left join bd_firm on bd_firm.field_key=ks_1.fk_bd_firm left join ks_kodi on ks_kodi.field_key=ks_1.fk_ks_kodi --строгое неравенство из-за особенностей входных дат where date_create>=:bd and date_create<:ed and fk_bd_budget_j_cfo=:id_cfo and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :plat, :n_pko, :n_plp, :date_plat, :firm_name, :prim, :kodi_name do begin SUSPEND; end END ELSE exit; END^ SET TERM ; ^ $печать бюджета 115.10.10.1для Эльчина 1 integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod, period_1, period_2, prim) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period, :period_1, :period_2, ''); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0 where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала эт ой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6 from sp_alc_move2(:fromdate,:todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6 do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and ((fk_creator=:FK_CREATOR)or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; if ((cnt_end<0)and(CNT_RASH_rozn>0)) then --если итог<0 корректируем остаток на конец за счет розничных продаж begin if (abs(cnt_end)>CNT_RASH_rozn) then CNT_RASH_rozn=0; else CNT_RASH_rozn=CNT_RASH_rozn+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if ((cnt_end<0)and(CNT_RASH_any>0)) then --если после коррекции розничных продаж итог<0 корректируем остаток на конец за счет прочих расходов begin if (abs(cnt_end)>CNT_RASH_any) then CNT_RASH_any=0; else CNT_RASH_any=CNT_RASH_any+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end end else begin ---считаем приблизительные расходы - решено не использовать CNT_PRIH_6=0; CNT_RASH_6=0; --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; -- if ((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)>0.1*CNT_PRIH_VSEGO) then CNT_RASH_rozn=((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)-0.1*CNT_PRIH_VSEGO); CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO>0)or(CNT_PRIH_VSEGO>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end execute procedure sp_alc_correct_6(:FK_DECLARE); END^ SET TERM ; ^ $Декларация 5 знаков, ч.115.10.10.1Применять только после смены decimal (15,3) на (15,5) f 7_!-SET TERM ^ ; CREATE OR ALTER procedure SP_ALC_CORRECT_6 ( FK_DECLARE integer) as declare variable FK_BD_FIRM integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_CREATOR integer; declare variable CNT_END decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable SUM_6 decimal(15,5); declare variable KOEF decimal(15,5); declare variable FIELD_KEY integer; begin --уменьшение внутренних перемещений -- fk_declare=28; field_key=0; for SELECT a.field_key, a.fk_bd_firm, a.KOD_VID_PROD, a.FK_CREATOR, cnt_end, a.CNT_RASH_6 FROM BD_ALC_MOV2 a where a.FK_ALC_DECLARE=:fk_declare and cnt_end<0 and cnt_rash_6>0 into :field_key, :fk_bd_firm, :kod_vid_prod, :fk_creator, :cnt_end, :cnt_rash_6 do begin --если внутренние перемещения позволяют уменьшить до нуля -- if (abs(cnt_end)>cnt_rash_6) then -- CNT_RASH_rozn=0; else cnt_rash_6=cnt_rash_6+cnt_end; update bd_alc_mov2 set cnt_rash_vsego=cnt_rash_vsego+:cnt_end, cnt_end=0, cnt_rash_6=:cnt_rash_6 where field_key=:field_key; --а теперь корректируем все приходы по внутренним перемещениям по данному виду продукции и производителю кроме данной записи select coalesce(sum(cnt_prih_6),0) from bd_alc_mov2 where FK_ALC_DECLARE=:fk_declare and fk_creator=:fk_creator and kod_vid_prod=:kod_vid_prod and field_key<>:field_key into :sum_6; update bd_alc_mov2 set cnt_end=cnt_begin+CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_ANY+CNT_PRIH_6*:cnt_rash_6/:sum_6-cnt_rash_vsego, cnt_prih_vsego=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_ANY+CNT_PRIH_6*:cnt_rash_6/:sum_6, cnt_prih_6=cnt_prih_6*:cnt_rash_6/:sum_6 where FK_ALC_DECLARE=:fk_declare and fk_creator=:fk_creator and kod_vid_prod=:kod_vid_prod and field_key<>:field_key; --если итог стал минусовым, уменьшаем расход за счет розницы update bd_alc_mov2 set cnt_rash_vsego=bd_alc_mov2.CNT_RASH_0+cnt_end+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6, CNT_RASH_0=CNT_RASH_0+cnt_end where FK_ALC_DECLARE=:fk_declare and fk_creator=:fk_creator and kod_vid_prod=:kod_vid_prod and cnt_end<0; update bd_alc_mov2 set cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego where FK_ALC_DECLARE=:fk_declare and fk_creator=:fk_creator and kod_vid_prod=:kod_vid_prod; end --чистим нулевые записи delete from bd_alc_mov2 where FK_ALC_DECLARE=:fk_declare and cnt_begin=0 and cnt_prih_vsego=0 and cnt_rash_vsego=0; end^ SET TERM ; ^ $Декларация 5 знаков, ч.215.10.10.1Применять только после смены decimal (15,3) на (15,5) L  qY!GALTER TABLE BD_CALC_COMPONENT ADD FK_OPERATION INTEGER; COMMENT ON COLUMN BD_CALC_COMPONENT.FK_OPERATION IS 'ссылка на BD_TTK_OPERATIONS'; CREATE INDEX BD_CALC_COMPONENT_IDX1 ON BD_CALC_COMPONENT (FK_OPERATION);$Ссылка на операцию в каждой строчке табличной части ТТК15.10.10.1ALTER TABLE BD_CALC_COMPONENT1 +g!ICREATE GENERATOR GEN_BD_TTK_OPERATIONS_ID; CREATE TABLE BD_TTK_OPERATIONS ( FIELD_KEY INTEGER NOT NULL, NAME VARCHAR(100), PROCENT_POTER DECIMAL(5,2) DEFAULT 0 ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_TTK_OPERATIONS ADD CONSTRAINT PK_BD_TTK_OPERATIONS PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_TTK_OPERATIONS_BI */ CREATE OR ALTER TRIGGER BD_TTK_OPERATIONS_BI FOR BD_TTK_OPERATIONS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_ttk_operations_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_TTK_OPERATIONS.NAME IS 'Название операции'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_TTK_OPERATIONS TO PUBLIC;$Таблица операций для ТТК15.10.10.1CREATE TABLE BD_TTK_OPERATIONS m ![!UUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('control_nomer_nakl', '0', 'Запрещать проведение прих. без № накл.') MATCHING (paramname)$Разрешать/запрещать проведение прихода без № накладной15.10.10.1update or insert into GLOBAL_OPTIONS W!IALTER TABLE BD_BUDGET_CONSOL11 ADD PROCENT DECIMAL(5,2); COMMENT ON COLUMN BD_BUDGET_CONSOL11.PROCENT IS '% выполнения бюджета'; ALTER TABLE BD_BUDGET_CONSOL11 ADD TREND DECIMAL(5,2); COMMENT ON COLUMN BD_BUDGET_CONSOL11.TREND IS 'тренд';$Выполнение и тренд в консол. бюджете15.10.10.1ALTER TABLE BD_BUDGET_CONSOL11n !w!=SET TERM ^ ; CREATE OR ALTER procedure SP_BUDGET_CONSOL_BY_STAT ( IS_BDDS integer, ID_STAT integer, BD date, ED date) returns ( SUMMA_PLAT decimal(18,2), ID_CFO integer) as declare variable TMP_SUM decimal(18,2); declare variable NEXT_STAT integer; begin summa_plat=0; tmp_sum=0; --если Бюджет - БДДС, то собираем сумму платежек, а если БДР - сумму накладных if (is_bdds=1) then begin FOR SELECT field_key from bd_budget_j_cfo where coalesce(active_flag,0)=1 INTO :id_cfo DO BEGIN summa_plat=0; SELECT COALESCE (SUM(summa),0) as s1 FROM KS_1 --строгое неравенство из-за особенностей входных дат where date_create>=:bd and date_create<:ed and (fk_bd_budget_j_cfo=:id_cfo) and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :tmp_sum; summa_plat=summa_plat+tmp_sum; FOR SELECT field_key FROM bd_budget_j_stat WHERE fk_parent=:id_stat INTO :next_stat DO BEGIN tmp_sum=0; SELECT COALESCE(SUM(summa_plat), 0) as s1 FROM SP_BUDGET_CONSOL_BY_STAT(:is_bdds, :next_stat, :bd, :ed) WHERE id_cfo=:id_cfo INTO :tmp_sum; summa_plat=summa_plat+tmp_sum; END SUSPEND; END END ELSE BEGIN --БДР - собираем сумму накладных FOR SELECT field_key from bd_budget_j_cfo where coalesce(active_flag,0)=1 INTO :id_cfo DO BEGIN summa_plat=0; SELECT COALESCE (SUM(sum_with_nds),0) as s1 FROM bd_1 --строгое неравенство из-за особенностей входных дат where date_prih>=:bd and date_prih<:ed and (fk_bd_budget_j_cfo=:id_cfo) and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :tmp_sum; summa_plat=summa_plat+tmp_sum; SELECT COALESCE (SUM(summa),0) as s1 FROM bd_2 --строгое неравенство из-за особенностей входных дат where date_rash>=:bd and date_rash<:ed and (fk_bd_budget_j_cfo=:id_cfo) and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :tmp_sum; summa_plat=summa_plat+tmp_sum; FOR SELECT field_key FROM bd_budget_j_stat WHERE fk_parent=:id_stat INTO :next_stat DO BEGIN tmp_sum=0; SELECT COALESCE(SUM(summa_plat), 0) as s1 FROM SP_BUDGET_CONSOL_BY_STAT(:is_bdds, :next_stat, :bd, :ed) WHERE id_cfo=:id_cfo INTO :tmp_sum; summa_plat=summa_plat+tmp_sum; END SUSPEND; END END END^ SET TERM ; ^$Новая процедура для бюджета 115.10.10.1SP_BUDGET_CONSOL_BY_STAT_TOVAR.INPLACE) as declare variable SKLAD type of column BD_FIRM.SKLAD; begin select coalesce(sklad,0) from bd_firm where field_key=:id_supplier into :sklad; cena_pr_with_nds=0; cena_pr_without_nds=0; --поиск по спецификациям по договору, группе склада и поставщику if (id_dogovor is not null) then begin select first 1 cena_pr, cena_pr_without_nds, 'Спецификация №'||bd_sps1.nomer_create from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 where (bd_sps11.fk_bd_tovar=:id_tovar) and ((bd_sps1.fk_bd_dogovor=:id_dogovor)or(bd_sps1.fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1) and (bd_sps1.FK_SUPPLIER=:id_supplier) into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end --не нашли по договору - ищем без него if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 cena_pr, cena_pr_without_nds, 'Спецификация №'||bd_sps1.nomer_create from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 where ((bd_sps11.fk_bd_tovar=:id_tovar) and (bd_sps1.fk_supplier=:id_supplier) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1)) into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end if (only_by_sps=0) then --если разрешено искать по последним приходам begin --не нашли по спецификации - ищем по последнему приходу if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 bd_11.cena_pr_with_nds,bd_11.cena_pr_without_nds, 'Приход (посл. по складу)' from bd_11 where (bd_11.fk_bd_firm=:id_SKLAD and bd_11.fk_bd_tovar=:id_tovar) order by bd_11.date_prih desc, bd_11.field_key desc into :cena_pr_with_nds,:cena_pr_without_nds, :prim; end --не нашли по последнему приходу по складу, ищем по всем складам if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 bd_11.cena_pr_with_nds,bd_11.cena_pr_without_nds, 'Приход (посл. по всем складам)' from bd_11 where (bd_11.fk_bd_tovar=:id_tovar) order by bd_11.date_prih desc, bd_11.field_key desc into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end end --поиск текущих остатков - по поставвщику и на своем складе if (with_stock=1) then begin self_stock=0; stock=0; select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 join bd_1 on (bd_1.field_key=bd_11.fk_bd_1) where (bd_1.valid_flag=1) and (bd_1.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:id_tovar) and (bd_11.stock>0) into self_stock; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 join bd_1 on (bd_1.field_key=bd_11.fk_bd_1) where (bd_1.valid_flag=1) and (bd_1.fk_bd_firm=:id_supplier) and (bd_11.fk_bd_tovar=:id_tovar) and (bd_11.stock>0) into :stock; end select nds, inplace from BD_TOVAR where field_key=:id_tovar into :nds_tovar, :inplace; suspend; end^ SET TERM ; ^$последняя прих. цена15.10.10.1CREATE OR ALTER procedure SP_GET_TOV_CENA_PR ` `` k !ASET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,3), CNT_FROM_CR decimal(15,3), CNT_FROM_SUP decimal(15,3), CNT_1_6 decimal(15,3), CNT_7 decimal(15,3), CNT_ALL_RASH decimal(15,3), CNT_ROZN decimal(15,3), CNT_4 decimal(15,3), CNT_5 decimal(15,3), CNT_2_6 decimal(15,3), CNT_PRIH_VOZV decimal(15,3)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.) 5s!OSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4), HIDE_IZLISH smallint = 1) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3)&R 7#!AALTER TABLE BD_ALC_DECLARE ADD HIDE_IZLISH BOOLFIELD DEFAULT 1 ; COMMENT ON COLUMN BD_ALC_DECLARE.HIDE_IZLISH IS 'Скрывать излишки; если 0 - декларация честная';%Флаг "Скрывать излишки" в алко декларации15.10.19.1alter table BD_ALC_DECLARE@ =W!eSET TERM ^ ; CREATE OR ALTER procedure SP_GET_TOV_CENA_PR ( ID_SUPPLIER integer, ID_SKLAD integer, ID_TOVAR integer, ID_DOGOVOR integer = null, WITH_STOCK integer = 1, ONLY_BY_SPS integer = 0) returns ( CENA_PR_WITH_NDS decimal(12,5), CENA_PR_WITHOUT_NDS decimal(12,5), SELF_STOCK decimal(7,3), STOCK decimal(7,3), PRIM varchar(500), NDS_TOVAR integer, INPLACE type of column BD$'; declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', :hide_izlish); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0 where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой (окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6 from sp_alc_move2(:fromdate,:todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6 do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and ((fk_creator=:FK_CREATOR)or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; if ((cnt_end<0)and(CNT_RASH_rozn>0)) then --если итог<0 корректируем остаток на конец за счет розничных продаж begin if (abs(cnt_end)>CNT_RASH_rozn) then CNT_RASH_rozn=0; else CNT_RASH_rozn=CNT_RASH_rozn+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if ((cnt_end<0)and(CNT_RASH_any>0)) then --если после коррекции розничных продаж итог<0 корректируем остаток на конец за счет прочих расходов begin if (abs(cnt_end)>CNT_RASH_any) then CNT_RASH_any=0; else CNT_RASH_any=CNT_RASH_any+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end end else begin ---считаем приблизительные расходы - решено не использовать CNT_PRIH_6=0; CNT_RASH_6=0; --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; -- if ((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)>0.1*CNT_PRIH_VSEGO) then CNT_RASH_rozn=((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)-0.1*CNT_PRIH_VSEGO); CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO>0)or(CNT_PRIH_VSEGO>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end execute procedure sp_alc_correct_6(:FK_DECLARE); END^ SET TERM ; ^%Добавление флага "Скрыть излишки" при создании алко декларации15.10.19.1ALTER procedure SP_CREATE_NEW_ALCALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and not(bd_1.cod_prih in (1,9)) --товарообмен и бонусы and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход sum(case when (fk_recipient=2) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_rozn, --розничные продажи sum(case when ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4,9)) ) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания и на пр-во) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения ,sum(case when (bd_2.cod_rash in (7)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and rec.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (1,9)) --товарообмен и бонусы and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^%Честная алкодекларация, хранимка 115.10.19.1procedure SP_ALC_MOVE_TRUE+RM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0 where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (9,1)) --бонусы и товарообмен скрываем,излишки - нет group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (9,1)) --бонусы и товарообмен скрываем,излишки - нет group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6, cnt_prih_vozv from sp_alc_move_TRUE(:fromdate, :todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6, :cnt_prih_vozvrat do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and (fk_creator=:FK_CREATOR --or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod and :fk_creator is distinct from null) --если производитель не указан - не декларируем into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6+CNT_PRIH_ANY; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_5+CNT_RASH_6+CNT_RASH_ANY; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; --здесь были корректировки на случай cnt_end<0 - в режиме честной декларации убраны end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO<>0)or(CNT_PRIH_VSEGO<>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end -- execute procedure SP_ALC_CORRECT_6(:FK_DECLARE); END^ SET TERM ; ^%Честная алкодекларация, хранимка 215.10.19.1procedure SP_CREATE_NEW_ALC_TRUE   ?  )!?ALTER TABLE BD_TOVAR ADD FRPRINT_FLAG SMALLINT DEFAULT 0 ;&Признак печати позиции на принтере 2 (15.7.30.1)15.10.27.1BD_TOVAR ADD FRPRINT_FLAG" a !MSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4)) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', 0); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FI*and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and not(bd_1.cod_prih in (1,9)) --товарообмен и бонусы and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход sum(case when (fk_recipient=2) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_rozn, --розничные продажи sum(case when ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4,9)) ) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания и на пр-во) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения ,sum(case when (bd_2.cod_rash in (7)) then -bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and ((rec.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(rec.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (1,9)) --товарообмен и бонусы and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^&доработки честной декларации15.10.27.1ALTER procedure SP_ALC_MOVE_TRUE j _!QSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4), HIDE_IZLISH smallint = 1) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3)/M My!M!SET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,3), CNT_FROM_CR decimal(15,3), CNT_FROM_SUP decimal(15,3), CNT_1_6 decimal(15,3), CNT_7 decimal(15,3), CNT_ALL_RASH decimal(15,3), CNT_ROZN decimal(15,3), CNT_4 decimal(15,3), CNT_5 decimal(15,3), CNT_2_6 decimal(15,3), CNT_PRIH_VOZV decimal(15,3)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR ---0; declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', :hide_izlish); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0 where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой 1окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc, number_correct desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6 from sp_alc_move2(:fromdate,:todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6 do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and ((fk_creator=:FK_CREATOR)or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; if ((cnt_end<0)and(CNT_RASH_rozn>0)) then --если итог<0 корректируем остаток на конец за счет розничных продаж begin if (abs(cnt_end)>CNT_RASH_rozn) then CNT_RASH_rozn=0; else CNT_RASH_rozn=CNT_RASH_rozn+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if ((cnt_end<0)and(CNT_RASH_any>0)) then --если после коррекции розничных продаж итог<0 корректируем остаток на конец за счет прочих расходов begin if (abs(cnt_end)>CNT_RASH_any) then CNT_RASH_any=0; else CNT_RASH_any=CNT_RASH_any+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end end else begin ---считаем приблизительные расходы - решено не использовать CNT_PRIH_6=0; CNT_RASH_6=0; --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; -- if ((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)>0.1*CNT_PRIH_VSEGO) then CNT_RASH_rozn=((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)-0.1*CNT_PRIH_VSEGO); CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO>0)or(CNT_PRIH_VSEGO>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end execute procedure sp_alc_correct_6(:FK_DECLARE); END^ SET TERM ; ^&Корректный поиск прошлой декларации, 115.10.27.1 ALTER procedure SP_CREATE_NEW_ALC3_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (9,1)) --бонусы и товарообмен скрываем,излишки - нет and ( (/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (bd_1.cod_prih=7) ) group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc, number_correct desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER /*and sup.DECLAR_FLAG=1*/ where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (9,1)) --бонусы и товарообмен скрываем,излишки - нет group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и асходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6, cnt_prih_vozv from sp_alc_move_TRUE(:fromdate, :todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6, :cnt_prih_vozvrat do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and (fk_creator=:FK_CREATOR --or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod and :fk_creator is distinct from null) --если производитель не указан - не декларируем into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6+CNT_PRIH_ANY; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_5+CNT_RASH_6+CNT_RASH_ANY; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; --здесь были корректировки на случай cnt_end<0 - в режиме честной декларации убраны end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO<>0)or(CNT_PRIH_VSEGO<>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end -- execute procedure SP_ALC_CORRECT_6(:FK_DECLARE); END^ SET TERM ; ^&Доработки честной и корректный поиск прошлой декларации15.10.27.1 ALTER procedure SP_CREATE_NEW_ALC_TRUE `` _]![SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4)) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', 0); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG2оловое)','403',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино с защищенным географическим указанием','404',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино с защищенным наименованием места происхождения','405',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино коллекционное виноградное','406',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Ликерное вино','411',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Ликерное вино с защищенным географическим указанием','412',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Ликерное вино с защищенным наименованием места происхождения','413',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино (столовое) с защищенным географическим указанием','414',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино (столовое) с защищенным наименованием места происхождения','415',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино (столовое) коллекционное','416',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Фруктовое (плодовое) вино','421',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино коллекционное фруктовое','422',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино специальное с защищенным географическим указанием','430',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино специальное с защищенным наименованием места происхождения','431',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино ароматизированное виноградное','432',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина игристые','440',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина игристые с защищенным географическим указанием','441',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина игристые с защищенным наименованием места происхождения','442',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина игристые коллекционные','443',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина шампанские','450',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина шампанские с защищенным географическим указанием','451',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина шампанские с защищенным наименованием места происхождения','452',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вина шампанские коллекционные','453',11) matching (KOD);&новые коды алкоголя15.10.27.1update or insert into BD_ALC_VID_PROD  " "S sU!W update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Бренди','232',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Коньяк с защищенным географическим указанием','233',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Коньяк с защищенным наименованием места происхождения','234',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Коньяк коллекционный','235',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Ромы','236',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Виски','237',11) matching (KOD); update or insert into BD_ALC_VID_PROD (NAME, KOD, VID_DECLAR) values ('Вино (виноградное с5 ! K!W#SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_8 M!W"SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(200), CENA decimal(12,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(12,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^&Не брать архивные товары в ревизию, 115.10.27.1ALTER procedure SP_GET_OST_PRIH_PRICEsmena=(select fk_bd_smena from bd_9 where field_key=:fk_9); select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^&Не брать архивные товары в ревизию, 215.10.27.1ALTER procedure SP_GET_OST_RASH_PRICE # ;!W%SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN sel:+" e!W$SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and ( bd_11.FK_BD_FIRM=:id_sklad ) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END END END^ SET TERM ; ^&Не брать архивные товары в ревизию, 315.10.27.1ALTER procedure SP_GET_REV_PRIH_PRICEect bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^ &Не брать архивные товары в ревизию, 415.10.27.1ALTER procedure SP_GET_REV_RASH_PRICE DD9$ s!e&SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE ( BY_MATRIX integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES (:fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real); END END^ SET TERM ; ^ &Не брать архивные товары в ревизию, 515.10.27.1ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE & Y!])SET TERM ^ ; CREATE OR ALTER trigger bd_cpr_bi_oper for bd_cpr active before insert or update position 5 AS begin new.operator=(select first 1 field_key from bd_users where UPPER(login)=current_user); end^ SET TERM ; ^'Триггер на хранение автора каждого изменения расх. цены15.11.11.1CREATE trigger bd_cpr_bi_oper for bd_cprb% E!e'SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_RASH_PRICE ( BY_MATRIX integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в РАСхОДНЫх ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN select coalesce ( (select first 1 coalesce(BD_CPR_NOW.CENA,0) from BD_CPR_NOW where BD_CPR_NOW.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR_NOW.fk_bd_cena=:id_cena) ,0) from rdb$database into :cena; --ищем цену по заданному типу цены; если нету - то по последней приходной --и находим общее количество if (:cena=0) then begin select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES (:fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real); END END^ SET TERM ; ^ &Не брать архивные товары в ревизию, 615.10.27.1ALTER procedure SP_GET_REV_MATRIX_RASH_PRICE OO.' W)!S+SET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_dolg for bd_1 active before update position 0 AS declare variable summa_real decimal(15,2); declare variable summa_vozvrat decimal(15,2); declare variable summa_opl decimal(15,2); declare variable fk_11 integer; declare variable cena_pr decimal(8,2); BEGIN if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin new.DOLGFROMDATE=new.DATE_PRIH+iif(new.COD_PRIH in (2,3),coalesce(new.DAY_CONS_PRIH,0),0); --[18.09.2015] реализация приравнена к консигнации --сумма по документу new.SUMMA=coalesce((select sum(summa_with_nds) from bd_11 where fk_bd_1=new.FIELD_KEY),0); if (not(coalesce(new.COD_PRIH,0) in (7,8,9,1))) then --не: излишки, бонусный товар, товарообмен, пр-во begin --сумма возвратов summa_vozvrat=0; --по коду реализация возвраты раньше не считали --[18.09.2015] возвраты вообще не влияют на сумму долга по документу /*$$IBEC$$ for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_vozvrat=summa_vozvrat +cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21 where p.cod_rash=5 and fk_recipient=new.FK_SUPPLIER),0); end $$IBEC$$*/ --сумма оплат summa_opl=coalesce((select sum(summa) from ks_11 where fk_bd_1=new.FIELD_KEY),0); new.SUMMA_DOLG=new.SUMMA-summa_vozvrat-summa_opl; end /*$$IBEC$$ else begin new.summa=0; --сумма реализации summa_real=0; if (new.cod_prih=3) then --реализация --[18.09.2015] приравнено к консигнации begin for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_real=summa_real+cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21),0); end end $$IBEC$$*//*$$IBEC$$ if (new.cod_prih=1) then --реализация РЦ --[18.09.2015] убрано begin for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_real=summa_real+coalesce((SELECT sum(bd_21.SUMMA) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21),0); end end $$IBEC$$*//*$$IBEC$$ --сумма оплат summa_opl=coalesce((select sum(summa) from ks_11 where fk_bd_1=new.FIELD_KEY),0); new.SUMMA_DOLG=summa_real-summa_opl; end $$IBEC$$*/ end update bd_2 set summa_dolg=new.SUMMA_DOLG where fk_bd_1_6=new.FIELD_KEY; if ((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0)) then begin new.DOLGFROMDATE=new.DATE_PRIH+iif(new.COD_PRIH in (2,3),coalesce(new.DAY_CONS_PRIH,0),0); --[18.09.2015] реализация приравнена к консигнации new.SUMMA_DOLG=0; --coalesce(new.SUMMA_DOLG,0)-new.SUMMA; [06.11.15] end if (new.cod_prih in (7,8,9,1)) then --излишки, бонусный товар, товарообмен, пр-во begin new.dolgfromdate=null; new.summa_dolg=0; end END^ SET TERM ; ^'общая сумма прихода теперь рассчитывается15.11.11.1ALTER trigger tr_bd_1_dolg for bd_1?_11.cod_prih=1 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg+:summa_1 where fk_bd_1_6=:fk_1; end $$IBEC$$*/ end end else --для расходов с кодами: товарообмен, списание, внутр., пр-во begin new.SUMMA_DOLG=0; -- возврат поставщику - уменьшаем сумму долга по приходам --[18.09.2015] уже не уменьшаем /*$$IBEC$$ new.DOLGFROMDATE=null; new.summa=0; --ищем приходы от того же поставщика, которому делаем возврат, минуя все внутренние перемещения for select fk_bd_1, coalesce(sum(bd_21.summa),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier=new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 group by 1 into :fk_1, :summa_1 do update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin new.SUMMA_DOLG=coalesce(new.SUMMA_dolg,0)+coalesce(summa_21,0); new.DOLGFROMDATE=new.DATE_RASH+coalesce(new.DAY_CONS_RASH,0); update bd_21 set invalid_vozvrat_flag=1 where field_key=:fk_21; end $$IBEC$$*/ end --после проведения пытаемся разнести расход по существующим оплатам, если по нему есть долг --ОТМЕНЕНО! 27.08.2015 /*$$IBEC$$ if (new.SUMMA_DOLG>0) then begin --если расход уже частично разнесен, пытаемся разнести по той же оплате dolg_doc=new.SUMMA_DOLG; for select ks_11.FIELD_KEY, ks_1.SUMMA_DOLG from ks_11 join ks_1 on ks_1.FIELD_KEY=ks_11.FK_KS_1 where ks_11.FK_BD_2=new.FIELD_KEY and ks_1.SUMMA_DOLG>0 order by date_create, field_key into :fk_ks11, :summa_bufer do begin if (summa_bufer>dolg_doc) then summa_bufer=dolg_doc; dolg_doc=dolg_doc-summa_bufer; update ks_11 set summa=summa+:summa_bufer where field_key=:fk_ks11; new.SUMMA_DOLG=new.SUMMA_DOLG-summa_bufer; end end --после этого разносим по другим оплатам, если остался долг if (new.SUMMA_DOLG>0) then begin -- if (new.fk_selful2 is null) then ? зачем это условие? dolg_doc=new.SUMMA_DOLG; for select ks_1.FIELD_KEY, ks_1.SUMMA_DOLG from ks_1 where ks_1.SUMMA_DOLG>0 and --определяемся с типом оплаты ( --обычный расход (coalesce(new.COD_RASH,0)<>7 and (new.FK_SELFUL2 is null) and ks_1.FK_SELFUL=new.FK_SELFUL and ks_1.FK_BD_FIRM=new.FK_RECIPIENT and ks_1.PRIH=1) or --возврат от получателя (coalesce(new.COD_RASH,0)=7 and (new.FK_SELFUL2 is null) and ks_1.FK_SELFUL=new.FK_SELFUL and ks_1.FK_BD_FIRM=new.FK_RECIPIENT and ks_1.prih=0) or --расход на свое юр.лицо (coalesce(new.COD_RASH,0)<>7 and (new.FK_SELFUL2 is not null) and ks_1.FK_SELFUL=new.FK_SELFUL2 and ks_1.FK_SELFUL2=new.FK_SELFUL and ks_1.PRIH=2) ) order by date_create, field_key into :fk_ks1, :summa_bufer do begin if (summa_bufer>dolg_doc) then summa_bufer=dolg_doc; dolg_doc=dolg_doc-summa_bufer; if (summa_bufer>0) then INSERT INTO KS_11 (FK_KS_1, FK_BD_2, SUMMA, IS_ZV, TS_CREATE) VALUES (:fk_ks1,new.FIELD_KEY, :summa_bufer, 0, current_timestamp); new.SUMMA_DOLG=new.SUMMA_DOLG-summa_bufer; end end $$IBEC$$*/ end --проведения расхода --РАСПРОВЕДЕНИЕ РАСХОДА if (((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0))) then begin new.SUMMA_DOLG=0; --[06.11.15] if (not(new.COD_RASH in (9,1))) then --обычный расход - уменьшаем сумму долга по расходу --(5,7)? begin if (new.FK_BD_1_6 is null) then new.SUMMA_DOLG=0; --new.SUMMA_DOLG-coalesce((select sum(summa) from bd_22 where fk_bd_2=new.FIELD_KEY),0); [06.11.15] else new.SUMMA_DOLG=0; --coalesce((select summa_dolg from bd_1 where field_key=new.FK_BD_1_6),0); [06.11.15] new.SUMMA=0; if (new.COD_RASH<>6) then --кроме расходов по внутреннему перемещению, при их проведении долг на приход не начисляем begin --[18.09.2015] убрано /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_11.CENA_PR_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=3 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg-:summa_1 where fk_bd_1_6=:fk_1; end for select fk_bd_1, coalesce(sum(bd_21.SUMMA),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=1 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg-:summa_1 where fk_bd_1_6=:fk_1; end $$IBEC$$*/ end end else begin -- возврат поставщику - увеличиваем сумму долга по приходам --[18.09.2015] уже не меняем --ищем приходы от того же поставщика, которому делаем возврат, минуя все внутренние перемещения /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.summa),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier=new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 group by 1 into :fk_1, :summa_1 do update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin new.SUMMA_DOLG=coalesce(new.SUMMA_dolg,0)-coalesce(summa_21,0); end $$IBEC$$*/ end end END^ SET TERM ; ^'При пров. расхода с кодами 1,4,6,9 - сумма долга=0; общая сумма и дата долга теперь рассчитываются15.11.11.1ALTER trigger tr_bd_2_dolg for bd_2 ww<) }1!A,update or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('nacenka_matrix', '0', 'Использовать матрицу наценок') MATCHING (paramname);'Глобал. перем. использования матрицы наценок15.11.11.1insert into GLOBAL_OPTIONS;( 9_!S*SET TERM ^ ; CREATE OR ALTER trigger tr_bd_2_dolg for bd_2 active before update or delete position 5 AS declare variable fk_1 integer; declare variable summa_1 decimal(15,2); declare variable fk_21 integer; declare variable summa_21 decimal(15,2); declare variable dolg_doc decimal(15,2); declare variable summa_bufer decimal(15,2); declare variable fk_ks11 integer; declare variable fk_ks1 integer; BEGIN if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin --проведение расхода new.SUMMA=abs(coalesce((select sum(cast(summa as decimal(15,3))) from bd_22 where fk_bd_2=new.FIELD_KEY),0)); if (not(new.COD_RASH in (1,4,6,9))) then --обычный расход - увеличиваем сумму долга по расходу --(5,7)? begin if (new.COD_RASH in (5,7)) then new.DOLGFROMDATE=new.DATE_RASH; else new.DOLGFROMDATE=new.DATE_RASH+coalesce(new.DAY_CONS_RASH,0); if (new.FK_BD_1_6 is null) then begin new.SUMMA_DOLG=new.SUMMA_DOLG+new.SUMMA; end else begin --это перемещение, тогда просто берем долг из прихода new.SUMMA_DOLG=coalesce((select summa_dolg from bd_1 where field_key=new.FK_BD_1_6),0); end --реализация: увеличиваем долг по приходам, у которых код=3, надо вытащить внутренние перемещения, --[18.09.2015] реализация приравнена к консигнации, товарообмен не трогаем if (new.COD_RASH<>6) then --кроме расходов по внутреннему перемещению, при их проведении долг на приход не начисляем begin /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_11.CENA_PR_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=3 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg+:summa_1 where fk_bd_1_6=:fk_1; end for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_21.CENA_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd> ++V, =!G/ALTER TABLE BD_NACENKA_MATRIX ADD LAST_PRIH_CENA DECIMAL(12,5) DEFAULT 0 ; COMMENT ON COLUMN BD_NACENKA_MATRIX.LAST_PRIH_CENA IS 'Кэш последней приходной цены';'Поле кэша последней прих. цены в матрице наценок15.11.11.1alter table BD_NACENKA_MATRIX/+  }!M.INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Матрица наценок','nac_matrix', (select field_key from BD_USERS_RIGHTS_NAME where name_var='menu_trade'));'Права на меню "Матрица наценок"15.11.11.1insert into BD_USERS_RIGHTS_NAMEG* Ye!I-CREATE GENERATOR GEN_BD_NACENKA_MATRIX_ID; CREATE TABLE BD_NACENKA_MATRIX ( FIELD_KEY INTEGER NOT NULL, FK_BD_CENA INTEGER NOT NULL, FK_BD_TOVAR INTEGER NOT NULL, MARGIN DECIMAL(15,2) DEFAULT 0 ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_NACENKA_MATRIX ADD CONSTRAINT PK_BD_NACENKA_MATRIX PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_NACENKA_MATRIX_IDX1 ON BD_NACENKA_MATRIX (FK_BD_CENA); CREATE INDEX BD_NACENKA_MATRIX_IDX2 ON BD_NACENKA_MATRIX (FK_BD_TOVAR); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_NACENKA_MATRIX_BI */ CREATE OR ALTER TRIGGER BD_NACENKA_MATRIX_BI FOR BD_NACENKA_MATRIX ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.field_key IS NULL) THEN NEW.field_key = GEN_ID(GEN_BD_nacenka_matrix_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_nacenka_matrix_ID, 0); if (tmp < new.field_key) then tmp = GEN_ID(GEN_BD_nacenka_matrix_ID, new.field_key-tmp); END END ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_NACENKA_MATRIX.MARGIN IS 'наценка в %'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_NACENKA_MATRIX TO PUBLIC;'Таблица матрицы наценок15.11.11.1create table BD_NACENKA_MATRIX  ( F. cA!_1SET TERM ^ ; CREATE OR ALTER procedure SP_FILL_NAC_MATRIX_TOVAR ( FK_BD_TOVAR integer) as declare variable FK_cena integer; BEGIN for select field_key from bd_cena where field_key in (select fk_rights from bd_users_rights where BD_USERS_RIGHTs.TYPEOFRIGHTS='p' and upper(userlogin)=upper(current_user)) into :fk_cena do BEGIN if (not exists(select first 1 field_key from BD_NACENKA_MATRIX where fk_bd_cena=:fk_cena and fk_bd_tovar=:fk_bd_tovar)) then INSERT INTO BD_NACENKA_MATRIX (fk_bd_cena, FK_BD_TOVAR, margin, last_prih_cena) VALUES ( :fk_cena, :fk_bd_tovar, 0, 0 ); END END^ SET TERM ; ^ 'Заполнение матрицы наценок с товаром в заголовке15.11.11.1create procedure SP_FILL_NAC_MATRIX_TOVARU-  9!]0SET TERM ^ ; CREATE OR ALTER procedure SP_FILL_NAC_MATRIX_CENA ( FK_BD_cena integer) as declare variable FK_TOVAR integer; BEGIN for select bd_tovar.field_key from bd_tovar WHERE is_old_flag<>1 into :fk_tovar do BEGIN if (not exists(select first 1 field_key from BD_NACENKA_MATRIX where fk_bd_cena=:fk_bd_cena and fk_bd_tovar=:fk_tovar)) then INSERT INTO BD_NACENKA_MATRIX (fk_bd_cena, FK_BD_TOVAR, margin, last_prih_cena) VALUES ( :fk_bd_cena, :fk_tovar, 0, 0 ); END END^ SET TERM ; ^'Заполнение матрицы наценок с ценой в заголовке15.11.11.1create procedure SP_FILL_NAC_MATRIX_CENA -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else --((nac_matrix is null) or (trim(nac_matrix)='0') or (trim(nac_matrix)='')) then select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then exit; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена -- cenabase=round(:cenaprnew+((coalesce(:margin,0)/100)*:cenaprnew),2); ----[09.11.15] cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- Если новая приходная цена не равна старой if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then exit; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; /*$$IBEC$$ select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; $$IBEC$$*/ select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; -- cenabase=val; update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^ 'Триггер ценового автомата смотрит в margin товара или margin матрицы наценок в завис-ти от глобальной настройки; кэшируем новые прих. цены в матрице наценок; округление исправлено15.11.11.1alter trigger BD_11_AI1 for bd_11 ``/ I !O2SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(100); begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then exit; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then exit; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход является последним if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then exit; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then exit; C  "2 Y!C5SET TERM ^ ; create or alter procedure ROUND_RCENA ( FK_BD_TOVAR integer not null, CENA type of column BD_11.CENA_PR_WITH_NDS not null) returns ( ROUNDEDCENA type of column BD_11.CENA_PR_WITH_NDS) as declare variable STEP_R type of column BD_ROUND.STEP_ROUND; declare variable KOP type of column BD_ROUND.MINUS_KOP; declare variable MINCENA type of column BD_TOVAR.MINCENA; declare variable r_type type of column BD_ROUND.ROUND_TYPE; declare variable tmp_math_rounded type of column BD_11.CENA_PR_WITH_NDS; begin select coalesce(bd_tovar.mincena,0) from bd_tovar where field_key=:fk_bd_tovar into :mincena; if (mincena>0) then if (mincena>:cena) then cena=:mincena; roundedcena=:cena; select first 1 step_round, minus_kop, coalesce(ROUND_TYPE,0) from BD_ROUND where :roundedcena between min_predel and max_predel order by min_predel into :step_r, :kop, :r_type; tmp_math_rounded=round(:roundedcena/iif(coalesce(coalesce(:step_r,0),0)=0,1,coalesce(:step_r,1)),0)*coalesce(:step_r,1); -- if (kop=1) then roundedcena=:roundedcena-0.01; -- 1 - округляем в меньшую сторону, 2 - в большую, иначе математически, копейку уже не никогда отбрасываем if ((:r_type=1) and (:tmp_math_rounded>:roundedcena)) then tmp_math_rounded=tmp_math_rounded-step_r; if ((:r_type=2) and (:tmp_math_rounded<:roundedcena)) then tmp_math_rounded=tmp_math_rounded+step_r; roundedcena=tmp_math_rounded; suspend; end^ SET TERM ; ^ 'Доработка процедуры округления - только после добавления поля ROUND_TYPE в BD_ROUND15.11.11.1alter procedure ROUND_RCENA,1 1k!54ALTER TABLE BD_ROUND ADD ROUND_TYPE SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_ROUND.ROUND_TYPE IS '0 - мат. округление, 1 - в меньшую сторону, 2 - в большую'; 'Поле для типов округления15.11.11.1alter table BD_ROUND*0 q3!'3execute block as declare variable id_cena integer; declare variable id_tovar integer; declare variable lastpr type of column bd_sps11.cena_pr; declare variable nac type of column bd_nacenka_matrix.margin; BEGIN for select --bd_sps1.nomer_create, bd_tovar.name, bd_sps_cpr.fk_bd_tovar, bd_sps_cpr.fk_bd_cena --, bd_cena.name, bd_sps_cpr.cena , bd_sps11.cena_pr , iif (coalesce(bd_sps11.cena_pr,0)=0,0, cast(((bd_sps_cpr.cena-bd_sps11.cena_pr)*100/bd_sps11.cena_pr) as decimal(15,2)) ) as nac from bd_sps1 join bd_sps11 on bd_sps11.fk_bd_sps1=bd_sps1.field_key join bd_sps_cpr on bd_sps_cpr.fk_bd_sps1=bd_sps1.field_key and bd_sps_cpr.fk_bd_tovar=bd_sps11.fk_bd_tovar --join bd_tovar on bd_tovar.field_key=bd_sps_cpr.fk_bd_tovar --join bd_cena on bd_cena.field_key=bd_sps_cpr.fk_bd_cena where bd_sps1.valid_flag=1 -- and (current_date between bd_sps1.date_start and bd_sps1.date_end) into :id_tovar, :id_cena, :lastpr, :nac do begin update or insert into bd_nacenka_matrix (fk_bd_tovar, fk_bd_cena, last_prih_cena, margin) values (:id_tovar, :id_cena, :lastpr, :nac) matching (fk_bd_tovar, fk_bd_cena); end END 'заполнение матрицы наценок данными из спецух15.11.11.1execute blockGt fk_selful from KS_SCHET where field_key=:fk_ks_shet into :urfrom; select fk_selful from KS_SCHET where field_key=:fk_ks_shet2 into :urto; select coalesce(KS_KODI.PODBOR,2) from ks_kodi where field_key=:fk_codi into :podbor; -- podbor=coalesce(podbor,2); --если подбор не указан, выводим все документы podbor=2; --теперь всегда выводим все документы, подбор по типам убран IF (IS_PRIHOD=0) THEN BEGIN --расход - оплата счетов поставщиков и приходов if (podbor in (0,2)) then BEGIN /*$$IBEC$$ ОТМЕНЕН ПОДБОР ПО ЗАЯВКАМ 27.08.2015 for select main.FIELD_KEY, main.NOMER_SHET, main.DATE_ORDER, sum(bd_order_in_11.SUMMA_WITH_NDS), -coalesce((select sum(ks_11.summa) from ks_11 where fk_order_in=main.field_key),0)+sum(bd_order_in_11.SUMMA_WITH_NDS) from BD_ORDER_IN_1 main left join BD_ORDER_IN_11 on BD_ORDER_IN_11.FK_BD_ORDER_IN_1=main.FIELD_KEY where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and main.field_key not in (select coalesce(fk_order_in,-1) from KS_11 where fk_ks_1=:fk_ks1) group by 1,2,3 having coalesce((select sum(ks_11.summa) from ks_11 where fk_order_in=main.field_key),0)0 and cod_prih=4 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END END if (podbor in (1,2)) then BEGIN --приходы for select main.FIELD_KEY, main.NOMER_PRIH, main.DOLGFROMDATE, main.date_prih, main.summa, summa_dolg, :prihod_txt, 100||coalesce(main.COD_PRIH,'') from BD_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) and main.cod_prih not in (4,9) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END --возвраты от получателя --[24.09.2015] заменено на возвраты поставщику for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg, :rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (5,7) --было 7, потом 5, [17.11.15] (5,7) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; ---- suspend; END END END IF (IS_PRIHOD=1) then BEGIN if (podbor in (0,2)) then BEGIN /*$$IBEC$$ ОТМЕНЕН ПОДБОР ПО ЗАЯВКАМ 27.08.2015 for select main.FIELD_KEY, main.NOMER_SHET, main.DATE_ORDER, sum(bd_order_out_11.SUMMA_WITH_NDS), -coalesce((select sum(ks_11.summa) from ks_11 where FO_ORDER_out=main.field_key),0)+sum(bd_order_out_11.SUMMA_WITH_NDS) from BD_ORDER_out_1 main join bd_firm on BD_FIRM.FIELD_KEY=main.FK_BD_FIRM left join BD_ORDER_out_11 on BD_ORDER_out_11.FK_BD_OUT_1=main.FIELD_KEY where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:urfrom and main.field_key not in (select coalesce(KS_11.FO_ORDER_OUT,-1) from KS_11 where fk_ks_1=:fk_ks1) group by 1,2,3 having coalesce((select sum(ks_11.summa) from ks_11 where FO_ORDER_out=main.field_key),0)0 and main.COD_RASH=8 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, main.summa, summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (2,3,0) --[24.09.2015] 5 убрано and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END --[24.09.2015] добавлено, код 7 if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (5,7) ---[17.11.15] добавлено 5 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (is_prihod=2) THEN BEGIN --если это перемещение между счетами, находим внутренние перемещения между складами юрлиц --находим юр.лицо-отправитель и юр.лицо-получатель --находим все неоплаченные расходы со склада-юрлица счета получателя на склады юрлица счета-отправителя, --потому что товары и деньги движутся в противоположных направлениях... for select main.FIELD_KEY, main.NOMER_rash, main.dolgfromdate, main.date_rash, summa, summa_dolg, bd_cod_rash.name||coalesce('('||trim(main.NOMER_NAKL)||')','') from BD_2 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.fk_selful=:urto and main.fk_selful2=:urfrom and main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and summa_dolg>0 into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc do BEGIN num_typdoc=4; suspend; END END END^ SET TERM ; ^(Вручную можно привязывать любые виды возвратов к платежкам15.11.20.1alter procedure SP_KS_11_PODBOR   k4  {!E7SET TERM ^ ; CREATE OR ALTER procedure SP_KS_11_DOC ( FK_KS_1 integer) returns ( FK_KS_11 integer, NOMERDOC varchar(30), DATDOC date, SUMMADOC decimal(15,2), DOLGDOC decimal(15,2), TYPDOC varchar(50), CURRDOLG decimal(15,2), COD_DOC varchar(10)) as declare variable ID_PRIH integer; declare variable ID_RASH integer; declare variable ID_SH_IN integer; declare variable ID_SH_OUT integer; declare variable COD_RASH integer; declare variable IS_ZV integer; declare variable LANG varchar(2); declare variable PRIHOD_TXT varchar(100); declare variable PRIHOD6_TXT varchar(100); declare variable ZAKAZ_TXT varchar(100); declare variable RASHOD_TXT varchar(100); declare variable ISH_SHET_TXT varchar(100); declare variable PRIH integer; BEGIN lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); prihod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); rashod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Расход ',:lang)),''); prihod6_txt=coalesce((select TR_NAME from SP_TRANSLATE('Внутреннее перемещение ',:lang)),''); zakaz_txt=coalesce((select TR_NAME from SP_TRANSLATE('Заказ поставщику ',:lang)),''); ish_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Исходящий счет ',:lang)),''); select prih from ks_1 where field_key=:fk_ks_1 into :prih; for select field_key, ks_11.FK_BD_1, ks_11.FK_BD_2, ks_11.FK_ORDER_IN, ks_11.FO_ORDER_OUT, is_zv from ks_11 where fk_ks_1=:fk_ks_1 and fk_ks11_6 is null into :fk_ks_11, :id_prih, :id_rash, :id_sh_in, :id_sh_out, :is_zv do BEGIN if (id_prih is not null) THEN BEGIN --данные по приходу --typdoc='Приход'; select :prihod_txt||(case main.cod_prih when 0 then ' ('||BD_COD_PRIH.NAME||')' when 2 then ' ('||BD_COD_PRIH.NAME||' '||(date_prih+coalesce(main.DAY_CONS_PRIH,0))||')' when 3 then ' ('|| BD_COD_PRIH.NAME||')' wheI[3 yg!K6SET TERM ^ ; CREATE OR ALTER procedure SP_KS_11_PODBOR ( IS_PRIHOD integer, FK_BD_FIRM integer, FK_CODI integer, FK_KS1 integer, FK_KS_SHET integer, FK_KS_SHET2 integer) returns ( NUM_TYPDOC integer, FK_DOC integer, NOMERDOC integer, DATDOC date, DATDOC_ENTER date, SUMMADOC decimal(15,2), DOLGDOC decimal(15,2), TYPDOC varchar(50), COD_DOC varchar(10), FK_KS11 integer) as declare variable PODBOR integer; declare variable ID_RASH integer; declare variable ID_SH_IN integer; declare variable ID_SH_OUT integer; declare variable URTO integer; declare variable URFROM integer; declare variable LANG varchar(2); declare variable VH_SHET_TXT varchar(100); declare variable PRIHOD_TXT varchar(100); declare variable VOZVRAT_TXT varchar(100); declare variable ISH_SHET_TXT varchar(100); declare variable RASHOD_TXT varchar(100); BEGIN lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); vh_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Входящий счет ',:lang)),''); prihod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); vozvrat_txt= coalesce((select TR_NAME from SP_TRANSLATE('Возврат от получателя ',:lang)),''); ish_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Исходящий счет ',:lang)),''); rashod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Расход ',:lang)),''); selecFn 4 then ' ('||BD_COD_PRIH.NAME||')' when 6 then ' ('||BD_COD_PRIH.NAME||')' else '' end), main.NOMER_PRIH, main.DATE_PRIH, (select sum(summa_with_nds) -- - coalesce(sum(bd_21.summa),0) --[24.09.2015] вычитать возвраты поставщику не надо from bd_11 --left join bd_21 on bd_21.fk_bd_11=bd_11.field_key and bd_21.cod_rash=5 where fk_bd_1=main.field_key) from bd_1 main left join bd_cod_prih on BD_COD_PRIH.FIELD_KEY=main.COD_PRIH where main.field_key=:id_prih and (coalesce(cod_prih,0)<>6 or :is_zv=1) into :typdoc, :nomerdoc, :datdoc, :summadoc; --находим неоплаченную сумму по приходу select :summadoc-coalesce(sum(KS_11.SUMMA),0) from ks_11 where fk_bd_1=:id_prih and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END if (id_rash is not null) THEN BEGIN --данные по расходу --typdoc='Реализация'; select cod_rash, case when cod_rash=6 then :prihod6_txt||coalesce('('||trim(nomer_nakl)||')','') else (:rashod_txt||(case main.cod_rash when 0 then ' ('||BD_COD_rash.NAME||')' when 2 then ' ('||BD_COD_rash.NAME||(date_rash+coalesce(main.DAY_CONS_RASH,0))||')' when 3 then ' ('||BD_COD_rash.NAME||')' when 5 then ' ('||BD_COD_rash.NAME||')' when 8 then ' ('||BD_COD_rash.NAME||')' when 7 then BD_COD_rash.NAME else '' end)) end , main.NOMER_rash, main.DATE_rash, (select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=main.field_key) from bd_2 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.field_key=:id_rash into :cod_rash, :typdoc, :nomerdoc, :datdoc, :summadoc; if ( ((prih=1) and (cod_rash=7)) or ((prih<>1) and (cod_rash=5)) ) then summadoc=(-1)*summadoc; --[17.11.15] --находим неоплаченную сумму по расходу select :summadoc-coalesce(sum(ks_11.SUMMA),0) from ks_11 where fk_bd_2=:id_rash and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; if (dolgdoc is null) then dolgdoc=0; END if (id_sh_in is not null) THEN BEGIN --данные по заказу поставщика typdoc=zakaz_txt; select main.NOMER_SHET, main.DATE_ORDER, (select sum(BD_ORDER_IN_11.SUMMA_WITH_NDS) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_ORDER_IN_1=main.field_key) from BD_ORDER_IN_1 main where main.field_key=:id_sh_in into :nomerdoc, :datdoc, :summadoc; --находим неоплаченную сумму по приходу select :summadoc-coalesce(sum(ks_11.SUMMA),0) from ks_11 where fk_order_in=:id_sh_in and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END if (id_sh_out is not null) THEN BEGIN --данные по расходу --typdoc='Исходящий счет'; select main.NOMER_SHET, main.DATE_ORDER, (select sum(BD_ORDER_OUT_11.SUMMA_WITH_NDS) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=main.field_key), :ish_shet_txt||(case main.cod_rash when 0 then ' ('||BD_COD_rash.NAME||')' when 2 then ' ('||BD_COD_rash.NAME||')' when 3 then ' ('||BD_COD_rash.NAME||')' when 5 then ' ('||BD_COD_rash.NAME||')' when 8 then ' ('||BD_COD_rash.NAME||')' else '' end) from BD_ORDER_OUT_1 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.field_key=:id_sh_out into :nomerdoc, :datdoc, :summadoc, :typdoc; --находим неоплаченную сумму по приходу select :summadoc-coalesce(sum(ks_11.SUMMA),0) from ks_11 where fo_order_out=:id_sh_out and ks_11.FK_KS_1<>:fk_ks_1 into :dolgdoc; END id_prih=null; id_rash=null; id_sh_in=null; id_sh_out=null; currdolg=dolgdoc; SUSPEND; END END^ SET TERM ; ^(Отображение KS_11 с учетом плюсов-минусов после привязки возвратов15.11.20.1ALTER procedure SP_KS_11_DOCK.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash do BEGIN for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если прихоы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,0); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, bd_pr_product.inplace, bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, bd_pr_product.inplace, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save do BEGIN --заполняем приход --находим цену if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make+:day_save)); END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^(при проведении акта производства, примечание из него идет в расходы и приходы15.11.20.1SP_CREATE_BY_PR @~6 [W!A9update or insert into GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('rash_prinud_calc', '1', 'Принудительно сумма каждой позиции расхода=цена*колич.') MATCHING (paramname))Принудительно сумма каждой позиции расхода=цена*колич.15.11.23.1insert into GLOBAL_OPTIONS15 )!+8SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr; summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENTJNid_skl, :id_user, :doprash, :fk_smena, :prim_pr; summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash do BEGIN for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,0); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, bd_pr_product.inplace, bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, bd_pr_product.inplace, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save do BEGIN --заполняем приход --находим цену if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make+:day_save)); END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^)исправление15.11.23.1sp_create_by_pr_2 l9 ?a!a=ALTER TABLE BD_BUDGET_CFO11 ADD PROCENT DECIMAL(5,2); COMMENT ON COLUMN BD_BUDGET_CFO11.PROCENT IS '% выполнения бюджета'; ALTER TABLE BD_BUDGET_CFO11 ADD TREND DECIMAL(5,2); COMMENT ON COLUMN BD_BUDGET_CFO11.TREND IS 'тренд';*Выполнение бюджета ЦФО15.11.28.1Выполнение бюджета ЦФОH8 =!5;SET TERM ^ ; CREATE OR ALTER trigger tr_bd_11_bd for bd_11 active before delete position 0 AS BEGIN if ((old.STOCK0 and dolgfromdate<='01.01.2099' and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor is null ),0)-coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=7) and bd_2.fk_bd_dogovor is null ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and ks_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=1 and ks_1.fk_bd_dogovor is null ),0) ) as summa, 1 as typerec from bd_firm a where a.GET_KS_post=1 and coalesce(sklad,0)=0 ----------------------------------------------------------- UNION select a.field_key, a.name, d.nomer_partner, d.field_key as fk_bd_dogovor, ( coalesce(( select sum(summa_dolg) from bd_1 where fk_supplier=a.field_key -- and fk_selful=:fk_selful and fk_selful_from is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and bd_1.fk_bd_dogovor=d.field_key and coalesce(bd_1.cod_prih,0)<>9 ),0)-coalesce(( select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=a.field_key -- and fk_selful=:fk_selful and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=5 ) and bd_2.fk_bd_dogovor=d.field_key ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and KS_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=0 and ks_1.fk_bd_dogovor=d.field_key ),0))-(coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor=d.field_key ),0)-coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=7) and bd_2.fk_bd_dogovor=d.field_key ),0)+coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and ks_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=1 and ks_1.fk_bd_dogovor=d.field_key ),0)) as summa, 3 as typerec from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key where a.GET_KS_post=1 and coalesce(sklad,0)=0 ;+Вьюшка с долгами контрагентов по всем юрлицам15.12.1.1 DOLGI_ALL_SELFUL qqG=  G5Edelete from bd_users_rights_name where trim(upper(name_var))='HIDETIPS'; insert into bd_users_rights_name (name_var, name, parent) values ('HideTips','Скрыть советы дня',0);,Принудительное разовое включение советов дня ВСЕМ15.12.2.1bd_users_rights_nameR< SWuDupdate or insert into bd_users_rights_name (name,name_var,parent) values ('Меню ресторана','restoran_menu',(select field_key from bd_users_rights_name where name_var='menu_production')) matching (name_var);,Меню ресторана new right15.12.2.1bd_users_rights_name add Меню ресторана;  1eCexecute block as declare variable name_var type of column bd_users_rights_name.name_var; declare variable cnt integer; declare variable i integer; declare variable tmp_del_fk integer; BEGIN for select name_var, count(name_var) from bd_users_rights_name group by 1 having count(name_var)>1 into :name_var, :cnt do begin i=1; while (i0 and dolgfromdate<='01.01.2099' and bd_1.fk_bd_dogovor is null and coalesce(bd_1.cod_prih,0)<>9 ),0)-coalesce(( select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=a.field_key -- and fk_selful=:fk_selful and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=5 ) and bd_2.fk_bd_dogovor is null ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and KS_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=0 and ks_1.fk_bd_dogovor is null ),0))-(coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null P EGE@  ;!/HALTER TABLE BD_91 ADD CNT_START DECIMAL(12,3); COMMENT ON COLUMN BD_91.CNT_START IS 'остаток на начало ревизионного периода'; ALTER TABLE BD_91 ADD CNT_PRIH DECIMAL(12,3); COMMENT ON COLUMN BD_91.CNT_PRIH IS 'Приходы за период'; ALTER TABLE BD_91 ADD CNT_RASH DECIMAL(12,3); COMMENT ON COLUMN BD_91.CNT_RASH IS 'Расходы за период';.По ревизиям 215.12.12.1ALTER TABLE BD_91? 1;!-GALTER TABLE BD_9 ADD DATE_FROM DATE; COMMENT ON COLUMN BD_9.DATE_FROM IS 'Начало ревизионного периода, дата прошлой ревизии+1'; ALTER TABLE BD_9 ADD FK_SUPPLIER INTEGER; COMMENT ON COLUMN BD_9.FK_SUPPLIER IS 'Поставщик в шапке'; ALTER TABLE BD_9 ADD FK_RECIPIENT INTEGER; COMMENT ON COLUMN BD_9.FK_RECIPIENT IS 'Получатель в шапке'; ALTER TABLE BD_9 ADD FK_COD_PRIH INTEGER; COMMENT ON COLUMN BD_9.FK_COD_PRIH IS 'Код прихода в шапке'; ALTER TABLE BD_9 ADD FK_COD_RASH INTEGER; COMMENT ON COLUMN BD_9.FK_COD_RASH IS 'Код расхода в шапке'; CREATE INDEX BD_9_IDX1 ON BD_9 (FK_SUPPLIER); CREATE INDEX BD_9_IDX2 ON BD_9 (FK_RECIPIENT);.По ревизиям 115.12.12.1ALTER TABLE BD_9#> }CFSET TERM ^ ; CREATE OR ALTER procedure ROUND_RCENA ( FK_BD_TOVAR integer not null, CENA type of column bd_21.CENA_WITH_NDS) returns ( ROUNDEDCENA type of column BD_21.CENA_WITH_NDS) as declare variable STEP_R type of column BD_ROUND.STEP_ROUND; declare variable KOP type of column BD_ROUND.MINUS_KOP; declare variable MINCENA type of column BD_TOVAR.MINCENA; declare variable R_TYPE type of column BD_ROUND.ROUND_TYPE; declare variable TMP_MATH_ROUNDED type of column BD_21.CENA_WITH_NDS; begin if (cena is null) then cena=0; select coalesce(bd_tovar.mincena,0) from bd_tovar where field_key=:fk_bd_tovar into :mincena; if (mincena>0) then if (mincena>:cena) then cena=:mincena; roundedcena=:cena; select first 1 step_round, minus_kop, coalesce(ROUND_TYPE,0) from BD_ROUND where :roundedcena between min_predel and max_predel order by min_predel into :step_r, :kop, :r_type; tmp_math_rounded=round(:roundedcena/iif(coalesce(coalesce(:step_r,0),0)=0,1,coalesce(:step_r,1)),0)*coalesce(:step_r,1); -- if (kop=1) then roundedcena=:roundedcena-0.01; -- 1 - округляем в меньшую сторону, 2 - в большую, иначе математически, копейку уже не никогда отбрасываем if ((:r_type=1) and (:tmp_math_rounded>:roundedcena)) then tmp_math_rounded=tmp_math_rounded-step_r; if ((:r_type=2) and (:tmp_math_rounded<:roundedcena)) then tmp_math_rounded=tmp_math_rounded+step_r; roundedcena=tmp_math_rounded; suspend; end^ SET TERM ; ^-Исправленная процедура округления - не вызывает ошибки в спецухах15.12.4.1ALTER procedure ROUND_RCENA  V V'A 1;![ISET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_BY_9 ( ID_9 integer) returns ( sum_prih type of column bd_91.cnt_prih, sum_rash type of column bd_91.cnt_rash, ost_begin type of column bd_stock_1.cnt ) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; suspend; end END^ SET TERM ; ^.По ревизиям 315.12.12.1CREATE procedure SP_FILL_91DATECNT_BY_9 RR+B 9;![JSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE_T ( ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT ) as --DECLARE VARIABLE variable_name < datatype>; BEGIN --остатки по товару в приходных ценах for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN --находим последнюю приходную цену --находим общее количество for select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.field_key desc into :cena do break; cena=coalesce(cena,0); if (cena=0) then select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.field_key desc into :cena; select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 into :cnt_11; sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; fk_revsp=GEN_ID(GEN_BD_91_ID,1); suspend; END END^ SET TERM ; ^.По ревизиям 415.12.12.1ALTER procedure SP_GET_OST_PRIH_PRICE_T YY$C +;![KSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE_T ( ID_CENA integer, ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT ) as declare variable IS_OPT integer; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 for select bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena do break; end ELSE BEGIN --bd_cpr for select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena do break; END sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; fk_revsp=GEN_ID(GEN_BD_91_ID,1); select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 into :cnt_11; suspend; END END^ SET TERM ; ^.По ревизиям 515.12.12.1ALTER procedure SP_GET_OST_RASH_PRICE_T NN/D s!ONSET TERM ^ ; CREATE OR ALTER procedure SP_CALC_BD9_POS2 ( FK_POS integer, DATE_START date, DATE_END date, FK_BD_FIRM integer, fk_bd_9 integer) returns ( RES decimal(15,2)) as declare variable SELECT_SQL varchar(4000); declare variable POS integer; BEGIN select sql_calc from BD_9_ACT_FORMA_POS where field_key=:fk_pos into :select_sql; pos=POSITION(':fk_bd_firm' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING fk_bd_firm FROM pos for CHAR_LENGTH(':fk_bd_firm')); pos=POSITION(':fk_bd_firm' in select_sql); end pos=POSITION(':fk_bd_9' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING fk_bd_9 FROM pos for CHAR_LENGTH(':fk_bd_9')); pos=POSITION(':fk_bd_9' in select_sql); end pos=POSITION(':date_start' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING ''''||date_start||'''' FROM pos for CHAR_LENGTH(':date_start')); pos=POSITION(':date_start' in select_sql); end pos=POSITION(':date_end' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING ''''||date_end||'''' FROM pos for CHAR_LENGTH(':date_end')); pos=POSITION(':date_end' in select_sql); end FOR EXECUTE STATEMENT (:select_sql) INTO :res DO begin suspend; end END^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure SP_CALC_BD9_POS2 ( FK_POS integer, DATE_START date, DATE_END date, FK_BD_FIRM integer, fk_bd_9 integer) returns ( RES decimal(15,2)) as declare variable SELECT_SQL varchar(4000); declare variable POS integer; BEGIN select sql_calc from BD_9_ACT_FORMA_POS where field_key=:fk_pos into :select_sql; pos=POSITION(':fk_bd_firm' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING fk_bd_firm FROM pos for CHAR_LENGTH(':fk_bd_firm')); pos=POSITION(':fk_bd_firm' in select_sql); end pos=POSITION(':fk_bd_9' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING fk_bd_9 FROM pos for CHAR_LENGTH(':fk_bd_9')); pos=POSITION(':fk_bd_9' in select_sql); end pos=POSITION(':date_start' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING ''''||date_start||'''' FROM pos for CHAR_LENGTH(':date_start')); pos=POSITION(':date_start' in select_sql); end pos=POSITION(':date_end' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING ''''||date_end||'''' FROM pos for CHAR_LENGTH(':date_end')); pos=POSITION(':date_end' in select_sql); end FOR EXECUTE STATEMENT (:select_sql) INTO :res DO begin suspend; end END^ SET TERM ; ^.Параметр fk_bd_9 в акт ревизии 115.12.12.1CREATE procedure SP_CALC_BD9_POS2 5E s!SLSET TERM ^ ; CREATE OR ALTER procedure SP_CALC_BD9_FORMA2 ( FK_BD_9_ACT integer, DATE_START date, DATE_END date, FK_BD_FIRM integer, CALC integer, FK_FORMA integer, fk_bd_9 integer) returns ( FIELD_KEY integer, NAME_POS varchar(500), VALUE_POS decimal(15,2), NUMBER_PRINT integer, BOLD_FLAG integer, NUMBER_CALC integer, FORMULA varchar(100), FK_POS integer, SAVEAS varchar(100), NAME_FORMULA varchar(30), SQL_CALC varchar(4000), SQL_DETAIL varchar(4000), ISFORMULA_FLAG integer) as BEGIN if (coalesce(calc,0)=1) then begin delete from bd_9_act_detail where fk_bd_9_act=:fk_bd_9_act; if (fk_forma is null) then select fk_bd_9_act_forma from BD_9_ACT where field_key=:fk_bd_9_act into :fk_forma; if (fk_forma is null) then select fk_forma_bd9act from BD_FIRM where field_key=:fk_bd_firm into :fk_forma; for select field_key, NAME, NUMBER_CALC, NUMBER_PRINT, SAVEAS, FORMULA, NAME_FORMULA, SQL_CALC, SQL_DETAIL, bold_flag from BD_9_ACT_FORMA_POS where FK_BD_9_ACT_FORMA=:fk_forma and coalesce(ISFORMULA_FLAG,0)=0 order by number_calc into :fk_pos, :name_pos, :NUMBER_CALC, :NUMBER_PRINT, :SAVEAS, :FORMULA, :NAME_FORMULA, :SQL_CALC, :SQL_DETAIL, :bold_flag do begin value_pos=coalesce((SELECT res FROM SP_CALC_BD9_POS2(:fk_pos, :DATE_START, :DATE_END, :FK_BD_FIRM, :fk_bd_9) p),0); field_key=gen_id(GEN_BD_9_ACT_DETAIL_ID,1); INSERT INTO BD_9_ACT_DETAIL (field_key, FK_BD_9_ACT, NAME, NUMBER_CALC, NUMBER_PRINT, SAVEAS, FORMULA, NAME_FORMULA, ISFORMULA_FLAG, SQL_CALC, SQL_DETAIL, VALUE_CALC, bold_flag) VALUES (:field_key, :FK_BD_9_ACT, :NAME_pos, :NUMBER_CALC, :NUMBER_PRINT, :SAVEAS, null, :NAME_FORMULA, 0, :SQL_CALC, :SQL_DETAIL, :value_pos, :bold_flag); ISFORMULA_FLAG=0; suspend; end for select field_key, name, formula, number_print, name_formula, saveas, bold_flag from BD_9_ACT_FORMA_POS where FK_BD_9_ACT_FORMA=:fk_forma and coalesce(ISFORMULA_FLAG,0)=1 order by number_calc into :fk_pos, :name_pos, :formula, :number_print, :name_formula, :saveas, :bold_flag do begin value_pos=null; if (coalesce(formula,'')<>'') then value_pos=coalesce((SELECT res FROM SP_CALC_BD9_POS_formula(:fk_bd_9_act, :formula) p),0); field_key=gen_id(GEN_BD_9_ACT_DETAIL_ID,1); INSERT INTO BD_9_ACT_DETAIL (field_key, FK_BD_9_ACT, NAME, NUMBER_CALC, NUMBER_PRINT, SAVEAS, FORMULA, NAME_FORMULA, ISFORMULA_FLAG, SQL_CALC, SQL_DETAIL, VALUE_CALC, bold_flag) VALUES (:field_key, :FK_BD_9_ACT, :NAME_pos, :NUMBER_CALC, :NUMBER_PRINT, :SAVEAS, :formula, :NAME_FORMULA, 1, null, null, :value_pos, :bold_flag); ISFORMULA_FLAG=1; suspend; end end else begin for select field_key, saveas, value_calc, number_print, bold_flag from BD_9_ACT_DETAIL where FK_BD_9_ACT=:FK_BD_9_ACT order by NUMBER_PRINT into :field_key, :name_pos, :value_pos, :number_print, :bold_flag do suspend; end END^ SET TERM ; ^.Параметр fk_bd_9 в акт ревизии 215.12.12.1CREATE procedure SP_CALC_BD9_FORMA2key, bd_11.STOCK, cena_pr_with_nds from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG=1 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_21 (FIELD_KEY, FK_BD_2, FK_BD_11, FK_BD_USERS, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT) VALUES (gen_id(GEN_BD_21_ID,1), :fk_2, :fk_11 ,:id_user, :cena, (100*:cena)/(100+(select coalesce(nds,0) from bd_tovar where field_key=:fk_bd_tovar)), :ost); ost_rash=ost_rash-ost; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_21 (FIELD_KEY, FK_BD_2, FK_BD_11, FK_BD_USERS, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT) VALUES (gen_id(GEN_BD_21_ID,1), :fk_2, :fk_11 ,:id_user, :cena, (100*:cena)/(100+(select coalesce(nds,0) from bd_tovar where field_key=:fk_bd_tovar)), :ost_rash); ost_rash=0; END end END */ insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt) values (:fk_2,:fk_bd_tovar,:ost_rash); END --считаем сумму расхода update bd_2 main set main.SUMMA=(select sum(bd_21.CENA_WITH_NDS*bd_21.CNT) from bd_21 where fk_bd_2=main.field_key) where main.field_key=:fk_2; execute procedure SP_BD2_PROV(:fk_2,:lang,0,:id_user, 1); --для ревизий не учитываем запрет на создание излишков данного товара if (exists (select bd_91.FK_BD_TOVAR --излишки from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-(coalesce(count_11,0))>0))) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat,current_time, :izlishki, null, null, :fk_supplier, :fk_face, :fk_cod_prih, null, null, null, 0, 0, 1, null, :id_user, 1, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_real,0)-coalesce(count_11,0), cena, --излишки BD_TOVAR.NDS, gtd, articul, inplace from bd_91 join bd_tovar on bd_tovar.field_key=bd_91.FK_BD_TOVAR where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))>0 into :fk_bd_tovar, :cnt, :cena, :NDS_tovar, :gtd, :articul, :inplace do BEGIN --находим сроки годности из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:id_skl and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; --заполняем приход INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, ARTICUL,date_save, date_make) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds_tovar, --date_save ? :GTD, :cena, --в приходе какую ставим цену??? (100*:cena)/(100+:nds_tovar), :cena*:cnt, (100*:cena*:cnt)/(100+:nds_tovar), :cnt, 0, :INPLACE, :ARTICUL, :date_save, :date_make); END update bd_9 set fk_bd_1=:fk_1, fk_bd_2=:fk_2 where field_key=:id_rev; -- execute procedure sp_22_by_21(:fk_2,0); END^ SET TERM ; ^/Проведение ревизии с учетом ее новых полей15.12.14.1ALTER procedure SP_CREATE_BY_REV q^qjH w!7QGRANT EXECUTE ON PROCEDURE SP_FILL_91DATECNT_BY_9 TO PUBLIC; GRANT EXECUTE ON PROCEDURE SP_CALC_BD9_POS2 TO PUBLIC; GRANT EXECUTE ON PROCEDURE SP_CALC_BD9_FORMA2 TO PUBLIC; GRANT EXECUTE ON PROCEDURE SP_FILL_NAC_MATRIX_CENA TO PUBLIC; GRANT EXECUTE ON PROCEDURE SP_FILL_NAC_MATRIX_TOVAR TO PUBLIC;0права на новые процедуры, SP_FILL_NAC_MATRIX_TOVAR15.12.25.1SP_FILL_91DATECNT_BY_9, SP_CALC_BD9_POS2, SP_CALC_BD9_FORMA2, SP_FILL_NAC_MATRIX_CENAG m!#Pupdate bd_9 set fk_recipient=1, fk_supplier=1, fk_cod_prih=7, fk_cod_rash=4 where ( (fk_bd_1 is not null) or (fk_bd_2 is not null) ) and ( (fk_recipient is null) or (fk_supplier is null) or (fk_cod_prih is null) or (fk_cod_rash is null) );/Старым ПРОВЕДЕННЫМ ревизиям - дефолтные значения новых полей15.12.14.1update bd_9F  )!MOSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_REV ( ID_REV integer) returns ( FK_1 integer, FK_2 integer) as declare variable DAT date; declare variable TIM time; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CNT decimal(7,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; --declare variable NDS integer; declare variable NDS_TOVAR integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); --declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); --declare variable OST decimal(7,3); declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable NEDOSTACHA varchar(200); declare variable IZLISHKI varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable FK_Supplier integer; declare variable fk_recipient integer; declare variable fk_cod_prih integer; declare variable FK_cod_rash integer; BEGIN /* создание прихода и расхода по ревизии */ lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); nedostacha=(select TR_NAME from SP_TRANSLATE('Недостача',:lang)); izlishki=(select TR_NAME from SP_TRANSLATE('Излишки',:lang)); id_user=(select first 1 field_key from bd_users where upper(login)=upper(current_user)); select date_rev, time_rev, fk_bd_firm, FK_FACE, FK_BD_SMENA, coalesce(fk_supplier,1), coalesce(fk_recipient,1), coalesce(fk_cod_prih,7), coalesce(fk_cod_rash,4) from BD_9 where field_key=:id_rev into :dat, :tim, :id_skl, :fk_face, :fk_smena, :fk_supplier, :fk_recipient, :fk_cod_prih, :fk_cod_rash; if (exists (select bd_91.FK_BD_TOVAR --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:nedostacha,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:fk_recipient,:fk_face,:fk_cod_rash, null, :id_user, null, 0, null, null, null, :id_skl, null, 0, null, null,1, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_11,0)-coalesce(count_real,0)--, cena --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0 into :fk_bd_tovar, :ost_rash /*, :cena */ do BEGIN --заполняем расход --ищем партии в порядке возрастания /* for select bd_11.field_X[clare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; BEGIN create_7=coalesce(create_7,0); ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod is null or fk_bd_tovar_mod=:fk_bd_mod ) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_witho\ut_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if ((cnt_ost>0)and(CREATE_7=0)) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select FK_BD_Ttk_AVTOPR from BD_TOVAR where field_key=:FK_BD_TOVAR into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_11; end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( (create_7=1) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода ] fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(cnt_11_stock+coalesce(cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock-coalesce(cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end --удаляем заголовки излишков без позиций --если расход по чекам, то помечаем чеки как переведенные в расход if ((fk_bd_kassa is not null)) then begin if (CREATE_7=1) then begin for SELECT a.FIELD_KEY FROM BD_ch2 a where fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and coalesce(accept_flag,0)=0 and (a.fk_bd_2=:fk_bd2 or summa=0) into :fk_ch2 do begin update BD_CH2 set accept_flag=1 where field_key=:fk_ch2; update BD_CH21 set accept_flag=1 where fk_bd_ch2=:fk_ch2; end end else begin execute procedure sp_set_accept_ch21_op(:fk_bd2,:fk_bd_kassa,:is_vozvrat,:date_rash); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and (fk_bd_2=:fk_bd2 or summa<=0) and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); end end update bd_2 set valid_flag=1 where field_key=:fk_bd2; execute procedure sp_bd2_to_ks1(:fk_bd2, 1); end --если у получателя включена галка "автопроведение прихода по ВП", то проводим приход if (1=coalesce((select min(BD_FIRM.AVTO_BD1_BY_BD2_VALID_FLAG) from BD_FIRM join bd_2 on bd_2.FK_RECIPIENT=bd_firm.FIELD_KEY where bd_2.FIELD_KEY=:fk_bd2 and BD_FIRM.SKLAD=1),0) ) then update bd_1 set valid_flag=1 where field_key=(select bd_2.FK_BD_1_6 from bd_2 where field_key=:fk_bd2); END^ SET TERM ; ^0SP_BD2_PROV изменения порядка сортировки при переборе остатков по приоритету15.12.25.1SP_BD2_PROV изменения порядка сортировки при переборе остатков по приоритету  IL {M!KUSET TERM ^ ; CREATE OR ALTER procedure SP_KS_11_PODBOR ( IS_PRIHOD integer, FK_BD_FIRM integer, FK_CODI integer, FK_KS1 integer, FK_KS_SHET integer, FK_KS_SHET2 integer) returns ( NUM_TYPDOC integer, FK_DOC integer, NOMERDOC integer, DATDOC date, DATDOC_ENTER date, SUMMADOC decimal(15,2), DOLGDOC decimal(15,2), TYPDOC varchar(50), COD_DOC varchar(10), FK_KS11 integer) as declare variable PODBOR integer; declare variable ID_RASH integer; declare variable ID_SH_IN integer; declare variable ID_SH_OUT integer; declare variable URTO integer; declare variable URFROM integer; declare variable LANG varchar(2); declare variable VH_SHET_TXT varchar(100); declare variable PRIHOD_TXT varchar(100); declare variable VOZVRAT_TXT varchar(100); declare var`'K }s!UTUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('oplat_nakl_by_sklad', '0', 'Привязывать платежи к накладным только в рамках подразделения') MATCHING (paramname)0Привязывать платежи к накладным только в рамках подразделения15.12.25.1update or insert into GLOBAL_OPTIONSJ C!GSdelete from bd_nacenka_matrix where not(exists (select field_key from bd_tovar where field_key=bd_nacenka_matrix.fk_bd_tovar) )0Чистка матрицы наценок от несуществующих товаров15.12.25.1delete from bd_nacenka_matrix\I }!RSET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; deZaiable ISH_SHET_TXT varchar(100); declare variable RASHOD_TXT varchar(100); declare variable by_sklad varchar(1); declare variable fk_sklad integer; BEGIN by_sklad=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='OPLAT_NAKL_BY_SKLAD'),'0'); if (by_sklad='') then by_sklad='0'; select fk_sklad from ks_1 where field_key=:fk_ks1 into :fk_sklad; if ((fk_sklad is null) and (by_sklad='1')) then exit; --если подразделение не указано, но требуется привязывать только по нему lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); vh_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Входящий счет ',:lang)),''); prihod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); vozvrat_txt= coalesce((select TR_NAME from SP_TRANSLATE('Возврат от получателя ',:lang)),''); ish_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Исходящий счет ',:lang)),''); rashod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Расход ',:lang)),''); select fk_selful from KS_SCHET where field_key=:fk_ks_shet into :urfrom; select fk_selful from KS_SCHET where field_key=:fk_ks_shet2 into :urto; -- select coalesce(KS_KODI.PODBOR,2) from ks_kodi where field_key=:fk_codi into :podbor; -- podbor=coalesce(podbor,2); --если подбор не указан, выводим все документы podbor=2; --теперь всегда выводим все документы, подбор по типам убран IF (IS_PRIHOD=0) THEN BEGIN --расход - оплата счетов поставщиков и приходов if (podbor in (0,2)) then BEGIN for select main.FIELD_KEY, main.NOMER_PRIH, main.DOLGFROMDATE, main.date_prih, main.summa, summa_dolg, :prihod_txt, 100||coalesce(main.COD_PRIH,'') from BD_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and cod_prih=4 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END END if (podbor in (1,2)) then BEGIN --приходы for select main.FIELD_KEY, main.NOMER_PRIH, main.DOLGFROMDATE, main.date_prih, main.summa, summa_dolg, :prihod_txt, 100||coalesce(main.COD_PRIH,'') from BD_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) and main.cod_prih not in (4,9) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END --возвраты от получателя --[24.09.2015] заменено на возвраты поставщику for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg, :rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (5,7) --было 7, потом 5, [17.11.15] (5,7) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; ---- suspend; END END END IF (IS_PRIHOD=1) then BEGIN if (podbor in (0,2)) then BEGIN for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, main.summa, summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH=8 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, main.summa, summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (2,3,0) --[24.09.2015] 5 убрано and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END --[24.09.2015] добавлено, код 7 if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (5,7) ---[17.11.15] добавлено 5 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (is_prihod=2) THEN BEGIN --если это перемещение между счетами, находим внутренние перемещения между складами юрлиц --находим юр.лицо-отправитель и юр.лицо-получатель --находим все неоплаченные расходы со склада-юрлица счета получателя на склады юрлица счета-отправителя, --потому что товары и деньги движутся в противоположных направлениях... for select main.FIELD_KEY, main.NOMER_rash, main.dolgfromdate, main.date_rash, summa, summa_dolg, bd_cod_rash.name||coalesce('('||trim(main.NOMER_NAKL)||')','') from BD_2 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.fk_selful=:urto and main.fk_selful2=:urfrom and main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and summa_dolg>0 and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc do BEGIN num_typdoc=4; suspend; END END END^ SET TERM ; ^0платежи к накладным только в рамках подразделения - 115.12.25.1ALTER procedure SP_KS_11_PODBORce field_key=:fk_ks1; sum_ost=sum_ost-sum_opl; end else break; end --сначала учитывать накладные со склада = подразделение платежа if (:fk_sklad<>-1) then BEGIN for select main.field_key, dolgfromdate, 1 as typdoc, summa_dolg from bd_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg>0 and coalesce(main.COD_PRIH,0) in (2,3,0,4) and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- UNION select main.FIELD_KEY, main.DATE_RASH, 2 as typdoc, 0-summa_dolg from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg<>0 and main.COD_RASH=5 and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- order by 2 asc, 3 desc into :fk_doc, :date_dolg, :typdoc, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN BREAK; if (typdoc=1) then begin if (not exists(select field_key from ks_11 where ks_11.FK_KS_1=:fk_ks1 and fk_bd_1=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_1, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_1=:fk_doc; end if (typdoc=2) then begin if (not exists(select field_key from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc; end sum_ost=sum_ost-sum_opl; end else BREAK; end END --затем накладные с других складов, но только если глобальная опция oplat_nakl_by_sklad выключена if (by_sklad<>'1') THEN BEGIN for select main.field_key, dolgfromdate, 1 as typdoc, summa_dolg from bd_1 main --BD_1 main left join BD_11 on BD_11.FK_BD_1=main.FIELD_KEY where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg>0 and coalesce(main.COD_PRIH,0) in (2,3,0,4) and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- --and field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) UNION select main.FIELD_KEY, main.DATE_RASH, 2 as typdoc, 0-summa_dolg from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg<>0 and main.COD_RASH=5 and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- --and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) order by 2 asc, 3 desc into :fk_doc, :date_dolg, :typdoc, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_dopl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; if (typdoc=1) then begin if (not exists(select field_key from ks_11 where ks_11.FK_KS_1=:fk_ks1 and fk_bd_1=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_1, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_1=:fk_doc; end if (typdoc=2) then begin if (not exists(select field_key from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc; end sum_ost=sum_ost-sum_opl; end else BREAK; end END END --prih=0 if (prih=1) THEN BEGIN sum_ost=coalesce((select ks_1.summa-coalesce(sum(ks_11.summa),0) from KS_1 left join ks_11 on ks_11.FK_KS_1=ks_1.FIELD_KEY and (ks_1.PRIH=1 and ks_11.fk_bd_2 is not null) where ks_1.field_key=:fk_ks1 group by ks_1.summa),0); --разносим по расходам --сначала учитывать накладные со склада = подразделение платежа if (:fk_sklad<>-1) then begin for select main.FIELD_KEY, main.DATE_RASH, iif(main.cod_rash=7,0-summa_dolg,summa_dolg) from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and ( (summa_dolg>0 and main.COD_RASH in (2,3,0,8)) or ((summa_dolg<>0 and main.COD_RASH in (7))) ) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- order by 2, 3 into :fk_doc, :date_dolg, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else BREAK; end end --затем накладные с других складов, но только если глобальная опция oplat_nakl_by_sklad выключена if (by_sklad<>'1') THEN BEGIN for select main.FIELD_KEY, main.DATE_RASH, iif(main.cod_rash=7,0-summa_dolg,summa_dolg) from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and ( (summa_dolg>0 and main.COD_RASH in (2,3,0,8)) or ((summa_dolg<>0 and main.COD_RASH in (7))) ) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- order by 2, 3 into :fk_doc, :date_dolg, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else BREAK; end END END --prih=1 if (prih=2) THEN --разносим по внутренним перемещениям BEGIN select sum(summa) from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null into :sum_raznes; sum_ost=sum_opl-coalesce(sum_raznes,0); for select main.FIELD_KEY, main.DATE_rash, -coalesce((select sum(ks_11.summa) from ks_11 where FK_BD_2=main.field_key),0)+sum(bd_21.SUMMA) from BD_2 main left join BD_21 on BD_21.FK_BD_2=main.FIELD_KEY where main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and main.fk_selful=:fk_ul2 and main.fk_selful2=:fk_ul and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) --учет глобальной опции "Привязывать платежи к накладным только в рамках подразделения" group by 1,2 having coalesce((select sum(ks_11.summa) from ks_11 where FK_BD_2=main.field_key),0)0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else break; END END --обработка если сумма оплаты меньше суммы разнесения if (prih=0) then --уменьшаем разнесение по приходам BEGIN sum_ost=coalesce((select ks_1.summa-coalesce(sum(ks_11.summa),0) from KS_1 left join ks_11 on ks_11.FK_KS_1=ks_1.FIELD_KEY and (ks_1.PRIH=0 and ((ks_11.fk_bd_1 is not null) or (coalesce(ks_11.summa,0)<0))) where ks_1.field_key=:fk_ks1 group by ks_1.summa),0); if (sum_ost<0) then -- if (2>3) then begin for select ks_11.field_key, ks_11.summa from ks_11 where fk_ks_1=:fk_ks1 and ks_11.fk_bd_1 is not null order by field_key desc into :fk_ks11, :sum_ks11 do begin if (sum_ost<0) then begin if (sum_ks113) then begin for select ks_11.field_key, ks_11.summa from ks_11 where fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null order by field_key desc into :fk_ks11, :sum_ks11 do begin if (sum_ost<0) then begin if (sum_ks110) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; update ks_11 set fk_ks_1=:fk_ks1, summa=:sum_opl wherbgdecimal(7,3), FKTOV_MOD integer) as declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; BEGIN rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; for select sum(bd_ch21.cnt), bd_tovar.name, bd_ch21.fk_bd_tovar, bd_ch2.date_close, emktov --, bd_ch21.scancod from bd_ch2 join bd_ch21 on bd_ch21.fk_bd_ch2=bd_ch2.field_key join bd_tovar on bd_tovar.field_key=bd_ch21.fk_bd_tovar where bd_ch2.fk_bd_firm=:fkfirm and bd_ch21.accept_flag<>1 /* не учитывать товары с автопроизводством */ and bd_tovar.fk_bd_ttk_avtopr is null and bd_ch2.date_open<=:withtoday group by 2,3,4,5 order by 3,4 into :cnt, :name, :fktov, :datech, :emktov --, :scan do begin --if (substring(scan from 1 for 2)='99') then begin -- emktov=null; -- select emktov from bd_tovar where field_key=:fktov into :emktov; if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; -- end nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin for select n.fk_bd_tovar_dop, t.name, n.cnt_dop from bd_tovar_nabor n left join bd_tovar t on (t.field_key=n.fk_bd_tovar_dop) where n.fk_bd_tovar_master=:fktov into :nabor_fktov, :name, :nabor_cnt_dop do begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:nabor_fktov)) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:nabor_fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:nabor_fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:nabor_cnt_dop and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if ((:cnt*:nabor_cnt_dop)>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=coalesce(:sumrazn*((:cnt*:nabor_cnt_dop)-:stock),0); razn=0; razn=coalesce((:cnt*:nabor_cnt_dop)-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:nabor_fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-(:cnt*:nabor_cnt_dop) where fk_tovar=:nabor_fktov and frmhandle=123; end end else begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:fktov)) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:fktov and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if (:cnt>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=:sumrazn*(:cnt-:stock); --coalesce((select first 1 bd_11.cena_pr_with_nds from bd_11 where bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech order by field_key desc)*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-:cnt where fk_tovar=:fktov and frmhandle=123; end end END^ SET TERM ; ^1не учитывать товары с автопроизводством15.12.27.1SP_GET_OUTOFSTOCK_CH22 O !!AXSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22_MOD ( FKFIRM integer not null, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV decimal(7,3), FKTOV_MOD integer, NABOR_FKTOV_MOD integer) as declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; declare variable Z_FKTOV_MOD integer; declare variable Z_STOCK decimal(7,3); declare variable Z_DATE_PR date; declare variable Z_TMP_CNT decimal(7,3); declare variable Z_TMP_STOCK decimal(7,3); begin rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; delete from z_izl_stock; insert into z_izl_stock select bd_11.date_prih, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, sum(bd_11.stock) from bd_11 where bd_11.valid_flag=1 and bd_11.fk_bd_firm=:fkfirm and bd_11.stock>0 and bd_11.priority>0 group by 1,2,3 order by 1,2,3 desc; for select c2.date_close, c21.fk_bd_tovar, c21.fk_bd_tovar_mod, trim(t.name)||coalesce(' ['||m.name||']','') name, t.emktov, sum(c21.cnt) from bd_ch2 c2 join bd_ch21 c21 on c21.fk_bd_ch2=c2.field_key join bd_tovar t on t.field_key=c21.fk_bd_tovar left join bd_tovar_mod m on m.field_key=c21.fk_bd_tovar_mod where c2.fk_bd_firm=:fkfirm and coalesce(c21.accept_flag,0)<>1 /* не учитывать товары с автопроизводством */ and t.fk_bd_ttk_avtopr is null and c2.date_close<=:withtoday group by 1,2,3,4,5 order by 1,2,3 desc into :datech, :fktov, :fktov_mod, :name, :emktov, :cnt do begin if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin -- i'ts nabor for select n.fk_bd_tovar_dop, n.fk_bd_tovar_dop_mod, t.name||coalesce(' ['||m.name||']',''), coalesce(n.cnt_dop*:cnt,0) from bd_tovar_nabor n join bd_tovar t on t.field_key=n.fk_bd_tovar_dop left join bd_tovar_mod m on m.field_key=n.fk_bd_tovar_dop_mod where n.fk_bd_tovar_master=:fktov order by 1,2 desc into :nabor_fktov, :nabor_fktov_mod, :name, :nabor_cnt_dop do begin z_tmp_stock=0; z_tmp_cnt=:nabor_cnt_dop; if (nabor_cnt_dop>0) then begin if (nabor_fktov_mod is null) then begin for select z.fk_tovar_mod, z.stock, z.date_pr i6N !!9WSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22 ( FKFIRM integer, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV fj from z_izl_stock z where z.date_pr<=:datech and z.fk_tovar=:nabor_fktov order by 1 into :z_fktov_mod, :z_stock, :z_date_pr do begin if (z_stock>=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock0) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; if (nabor_fktov_mod is null) then begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod is null)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod is null; else begin insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn); end end else begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod=:nabor_fktov_mod)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod=:nabor_fktov_mod; else insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash, fk_tovar_mod) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn, :nabor_fktov_mod); end end end -- nabor_cnt_dop>0 end -- получение состава набора end else begin -- i'ts not nabor --===================================================================================>> nabor_fktov=:fktov; nabor_fktov_mod=:fktov_mod; nabor_cnt_dop=:cnt; z_tmp_stock=0; z_tmp_cnt=:nabor_cnt_dop; if (nabor_cnt_dop>0) then begin if (nabor_fktov_mod is null) then begin for select z.fk_tovar_mod, z.stock, z.date_pr from z_izl_stock z where z.date_pr<=:datech and z.fk_tovar=:nabor_fktov l order by 1 into :z_fktov_mod, :z_stock, :z_date_pr do begin if (z_stock>=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock0) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; if (nabor_fktov_mod is null) then begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod is null)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod is null; else begin insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn); end end else begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod=:nabor_fktov_mod)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod=:nabor_fktov_mod; else insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash, fk_tovar_mod) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn, :nabor_fktov_mod); end end end nabor_fktov=null; --<<=================================================================================== end end for select zc.fk_tovar, zc.fk_tovar_mod, zc.cnt_in_stock, zc.cnt_rash, zc.cena_rash, trim(t.name)||coalesce(' ['||m.name||']','') from z_izl_check zc join bd_tovar t on zc.fk_tovar=t.field_key left join bd_tovar_mod m on zc.fk_tovar_mod=m.field_key order by 6 into :fktov, :fktov_mod, :stock, :cnt, :rozn_price, :name do begin sumrazn=coalesce(:rozn_price*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end delete from z_izl_stock; end^ SET TERM ; ^1не учитывать товары с автопроизводством15.12.27.1SP_GET_OUTOFSTOCK_CH22_MODn declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov; select FK_BD_FIRM_PROD from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END^ SET TERM ; ^1алгоритм учета мин норм изменен15.12.27.1SP_AVTOPR q >q1Q gM!#ZSET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variablep3P ;!YSET TERM ^ ; CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN decimal(15,2)) as declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3);mq AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; BEGIN create_7=coalesce(create_7,0); ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod is null or fk_bd_tovar_mod=:fk_bd_mod ) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все рrаспределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select FK_BD_Ttk_AVTOPR from BD_TOVAR where field_key=:FK_BD_TOVAR into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); cnt_11=cnt_11-cnt_22; if (cnt_11<0) then cnt_11=0; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_22; end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( (create_7=1) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем стрsоку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(cnt_11_stock+coalesce(cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock-coalesce(cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end --удаляем заголовки излишков без позиций --если расход по чекам, то помечаем чеки как переведенные в расход if ((fk_bd_kassa is not null)) then begin if (CREATE_7=1) then begin for SELECT a.FIELD_KEY FROM BD_ch2 a where fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and coalesce(accept_flag,0)=0 and (a.fk_bd_2=:fk_bd2 or summa=0) into :fk_ch2 do begin update BD_CH2 set accept_flag=1 where field_key=:fk_ch2; update BD_CH21 set accept_flag=1 where fk_bd_ch2=:fk_ch2; end end else begin execute procedure sp_set_accept_ch21_op(:fk_bd2,:fk_bd_kassa,:is_vozvrat,:date_rash); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and (fk_bd_2=:fk_bd2 or summa<=0) and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); end end update bd_2 set valid_flag=1 where field_key=:fk_bd2; execute procedure sp_bd2_to_ks1(:fk_bd2, 1); end --если у получателя включена галка "автопроведение прихода по ВП", то проводим приход if (1=coalesce((select min(BD_FIRM.AVTO_BD1_BY_BD2_VALID_FLAG) from BD_FIRM join bd_2 on bd_2.FK_RECIPIENT=bd_firm.FIELD_KEY where bd_2.FIELD_KEY=:fk_bd2 and BD_FIRM.SKLAD=1),0) ) then update bd_1 set valid_flag=1 where field_key=(select bd_2.FK_BD_1_6 from bd_2 where field_key=:fk_bd2); END^ SET TERM ; ^1при автопроизводстве в расход попадало все что произведено, даже если произведено больше (по нормам) чем нужно для расхода15.12.27.1SP_BD2_PROVvvariable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; BEGIN create_7=coalesce(create_7,0); ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod is null or fk_bd_tovar_mod=:fk_bd_mod ) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fwk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select FK_BD_Ttk_AVTOPR from BD_TOVAR where field_key=:FK_BD_TOVAR into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); cnt_11=cnt_11-cnt_avtopr; if (cnt_11<0) then cnt_11=0; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_22; end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( (create_7=1) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_dxate; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(cnt_11_stock+coalesce(cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock-coalesce(cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end --удаляем заголовки излишков без позиций --если расход по чекам, то помечаем чеки как переведенные в расход if ((fk_bd_kassa is not null)) then begin if (CREATE_7=1) then begin for SELECT a.FIELD_KEY FROM BD_ch2 a where fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and coalesce(accept_flag,0)=0 and (a.fk_bd_2=:fk_bd2 or summa=0) into :fk_ch2 do begin update BD_CH2 set accept_flag=1 where field_key=:fk_ch2; update BD_CH21 set accept_flag=1 where fk_bd_ch2=:fk_ch2; end end else begin execute procedure sp_set_accept_ch21_op(:fk_bd2,:fk_bd_kassa,:is_vozvrat,:date_rash); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and (fk_bd_2=:fk_bd2 or summa<=0) and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); end end update bd_2 set valid_flag=1 where field_key=:fk_bd2; execute procedure sp_bd2_to_ks1(:fk_bd2, 1); end --если у получателя включена галка "автопроведение прихода по ВП", то проводим приход if (1=coalesce((select min(BD_FIRM.AVTO_BD1_BY_BD2_VALID_FLAG) from BD_FIRM join bd_2 on bd_2.FK_RECIPIENT=bd_firm.FIELD_KEY where bd_2.FIELD_KEY=:fk_bd2 and BD_FIRM.SKLAD=1),0) ) then update bd_1 set valid_flag=1 where field_key=(select bd_2.FK_BD_1_6 from bd_2 where field_key=:fk_bd2); END^ SET TERM ; ^1исправления. версия 215.12.27.1SP_BD2_PROV ~R wY!#[SET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare ufield_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then exit; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else --((nac_matrix is null) or (trim(nac_matrix)='0') or (trim(nac_matrix)='')) then select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then exit; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена -- cenabase=round(:cenaprnew+((coalesce(:margin,0)/100)*:cenaprnew),2); ----[09.11.15] cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); if (:oldcenapr=0) then exit; --не засоряем журнал первыми приходами if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then exit; -- Если новая приходная цена не равна старой -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; /*$$IBEC$$ select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; $$IBEC$$*/ select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; -- cenabase=val; update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^2Не засоряем журнал расходных цен первыми приходами (со старой прих. ценой=0)16.1.4.1ALTER trigger bd_11_ai1 for bd_11 ;S O\SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(100); begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then exit; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then exit; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход является последним if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then exit; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where { L $LV !e_update or INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Редактирование шаблона импорта', 'com_import_shablon_edit', (select field_key from bd_users_rights_name where name_var='comming')) matching (name_var);2Права на редактирование шаблона импорта16.1.4.1BD_USERS_RIGHTS_NAME com_import_shablon_edit@U -I^ALTER TABLE BD_SPS11 ADD COD_POST_IMPORT VARCHAR(50); COMMENT ON COLUMN BD_SPS11.COD_POST_IMPORT IS 'Код товара у поставщика'; ALTER TABLE BD_TOVAR ADD COD_POST_IMPORT_DEFAULT VARCHAR(50); COMMENT ON COLUMN BD_TOVAR.COD_POST_IMPORT_DEFAULT IS 'Код товара у поставщика (может меняться, когда товар поставляют несколько фирм)';2Код товара у поставщика - в спецуху и в товар16.1.4.1ALTER TABLE BD_SPS11, BD_TOVARYT ;/C]SET TERM ^ ; CREATE OR ALTER procedure ROUND_RCENA ( FK_BD_TOVAR integer not null, CENA type of column BD_21.CENA_WITH_NDS) returns ( ROUNDEDCENA type of column BD_21.CENA_WITH_NDS) as declare variable STEP_R type of column BD_ROUND.STEP_ROUND; declare variable KOP type of column BD_21.CENA_WITH_NDS; declare variable MINCENA type of column BD_TOVAR.MINCENA; declare variable R_TYPE type of column BD_ROUND.ROUND_TYPE; declare variable TMP_MATH_ROUNDED type of column BD_21.CENA_WITH_NDS; begin if (cena is null) then cena=0; select coalesce(bd_tovar.mincena,0) from bd_tovar where field_key=:fk_bd_tovar into :mincena; if (mincena>0) then if (mincena>:cena) then cena=:mincena; roundedcena=:cena; select first 1 step_round, coalesce(minus_kop,0), coalesce(ROUND_TYPE,0) from BD_ROUND where :roundedcena between min_predel and max_predel order by min_predel into :step_r, :kop, :r_type; tmp_math_rounded=round(:roundedcena/iif(coalesce(coalesce(:step_r,0),0)=0,1,coalesce(:step_r,1)),0)*coalesce(:step_r,1); -- 1 - округляем в меньшую сторону, 2 - в большую, иначе математически, отбрасываем заданное число копеек if ((:r_type=1) and (:tmp_math_rounded>:roundedcena)) then tmp_math_rounded=tmp_math_rounded-step_r; if ((:r_type=2) and (:tmp_math_rounded<:roundedcena)) then tmp_math_rounded=tmp_math_rounded+step_r; roundedcena=tmp_math_rounded-(:kop/100); suspend; end^ SET TERM ; ^2Округление с вычетом желаемого числа копеек16.1.4.1ALTER procedure ROUND_RCENA SCS1Y ]-ObSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4), HIDE_IZLISH smallint = 1) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3)9X }UaUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('scanerprefix', '8', 'Код символа-префикса от сканера') MATCHING (paramname)3Префикс сканера: теперь не только backspace16.1.5.1UPDATE OR INSERT INTO GLOBAL_OPTIONS~W o/Y`SET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_BY_9 ( ID_9 integer) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; if (id_91 is distinct from null) then update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash where field_key=:id_91; end END^ SET TERM ; ^2Корректно заполняем новые столбцы в ревизии16.1.4.1ALTER procedure SP_FILL_91DATECNT_BY_9; declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', :hide_izlish); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce (BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0 where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1,8)) --излишки, бонусы, товарообмен, приход с пр-ва group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc, number_correct desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (7,9,1,8)) --излишки, бонусы, товарообмен, приход с пр-ва group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6 from sp_alc_move2(:fromdate,:todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6 do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and ((fk_creator=:FK_CREATOR)or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; if ((cnt_end<0)and(CNT_RASH_rozn>0)) then --если итог<0 корректируем остаток на конец за счет розничных продаж begin if (abs(cnt_end)>CNT_RASH_rozn) then CNT_RASH_rozn=0; else CNT_RASH_rozn=CNT_RASH_rozn+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if ((cnt_end<0)and(CNT_RASH_any>0)) then --если после коррекции розничных продаж итог<0 корректируем остаток на конец за счет прочих расходов begin if (abs(cnt_end)>CNT_RASH_any) then CNT_RASH_any=0; else CNT_RASH_any=CNT_RASH_any+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end end else begin ---считаем приблизительные расходы - решено не использовать CNT_PRIH_6=0; CNT_RASH_6=0; --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; -- if ((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)>0.1*CNT_PRIH_VSEGO) then CNT_RASH_rozn=((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)-0.1*CNT_PRIH_VSEGO); CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO>0)or(CNT_PRIH_VSEGO>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end execute procedure sp_alc_correct_6(:FK_DECLARE); END^ SET TERM ; ^4Приход с пр-ва в обычной декларации не брать16.1.12.1ALTER procedure SP_CREATE_NEW_ALCoin bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (9,1,8)) --бонусы, товарообмен и приход с пр-ва скрываем,излишки - нет and ( (/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (bd_1.cod_prih=7) ) group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc, number_correct desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER /*and sup.DECLAR_FLAG=1*/ where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (9,1,8)) --бонусы, товарообмен и приход с пр-ва скрываем,излишки - нет group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукии, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6, cnt_prih_vozv from sp_alc_move_TRUE(:fromdate, :todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6, :cnt_prih_vozvrat do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and (fk_creator=:FK_CREATOR --or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod and :fk_creator is distinct from null) --если производитель не указан - не декларируем into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6+CNT_PRIH_ANY; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_5+CNT_RASH_6+CNT_RASH_ANY; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; --здесь были корректировки на случай cnt_end<0 - в режиме честной декларации убраны end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO<>0)or(CNT_PRIH_VSEGO<>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end -- execute procedure SP_ALC_CORRECT_6(:FK_DECLARE); END^ SET TERM ; ^4Приход с пр-ва в честной декларации не брать16.1.12.1ALTER procedure SP_CREATE_NEW_ALC_TRUE 66;Z g-YcSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4)) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', 0); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce (BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) jsce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6 FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and skl.field_key<>sup.field_key --кроме излишков and not(bd_1.cod_prih in (7,9,1,8)) --излишки и бонусы и товарообмен, приходы с пр-ва group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM UNION SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when (bd_2.cod_rash=4) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and rec.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1,8)) --излишки и бонусы и товарообмен, приходы с пр-ва group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM) as p group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6 do begin suspend; end END^ SET TERM ; ^4Учет автопроизводства при формировании обычной декларации16.1.12.1ALTER procedure SP_ALC_MOVE2 77>[ IgEdSET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE2 ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,3), CNT_FROM_CR decimal(15,3), CNT_FROM_SUP decimal(15,3), CNT_1_6 decimal(15,3), CNT_7 decimal(15,3), CNT_ALL_RASH decimal(15,3), CNT_ROZN decimal(15,3), CNT_4 decimal(15,3), CNT_5 decimal(15,3), CNT_2_6 decimal(15,3)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)) then bd_11.CNT*coaleROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4,9)) ) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания и на пр-во) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения ,sum(case when (bd_2.cod_rash in (7)) then -bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and ((rec.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or (rec.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^4Учет автопроизводства при формировании честной декларации16.1.12.1ALTER procedure SP_ALC_MOVE_TRUE Z] ]q_gSET TERM ^ ; CREATE OR ALTER trigger bd_1_check_act_pr for bd_1 active after delete position 0 AS begin update BD_PR set fk_bd_1=null where fk_bd_1=old.FIELD_KEY; update bd_pr set bd_pr.valid_flag=0 where fk_bd_1 is null and fk_bd_2 is null; end^ SET TERM ; ^4Триггер-1 на распроведение Акта пр-ва при удалении Прих. и Расх.16.1.12.1CREATE trigger bd_1_check_act_pr for bd_1\ MgMeSET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,3), CNT_FROM_CR decimal(15,3), CNT_FROM_SUP decimal(15,3), CNT_1_6 decimal(15,3), CNT_7 decimal(15,3), CNT_ALL_RASH decimal(15,3), CNT_ROZN decimal(15,3), CNT_4 decimal(15,3), CNT_5 decimal(15,3), CNT_2_6 decimal(15,3), CNT_PRIH_VOZV decimal(15,3)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_P bb^ iqUhSET TERM ^ ; CREATE OR ALTER trigger tr_bd2_delete for bd_2 active after delete position 0 AS declare variable fk_ch2 integer; declare variable fk_bd_1 integer; declare variable ex_22 integer; BEGIN delete from BD_PR_ZAKAZ_6 where fk_bd_2=old.FIELD_KEY; update BD_PR set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr set bd_pr.valid_flag=0 where fk_bd_1 is null and fk_bd_2 is null; update bd_9 set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update BD_RETROBONUS set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr_zf_prod_prep set fk_bd_2=null, done=0 where fk_bd_2=old.field_key; delete from BD_WAY_LIST_11 where fk_bd_2 = old.FIELD_KEY; if ((old.COD_RASH='0')or(old.COD_RASH='7')) then begin if (exists(select first 1 1 from bd_22 where fk_bd_2=old.FIELD_KEY)) then ex_22=1; else ex_22=0; for select bd_ch2.FIELD_KEY from bd_ch2 where fk_bd_Firm=old.FK_BD_FIRM and date_close=old.DATE_RASH and fk_bd_2=old.FIELD_KEY into :fk_ch2 do begin update bd_ch2 set fk_bd_2=null, bd_ch2.ACCEPT_FLAG=0 where field_key=:fk_ch2; if (ex_22=1) then update bd_ch21 set bd_ch21.ACCEPT_FLAG=0 where fk_bd_ch2=:fk_ch2; end end --удаление излишков, созданных по расходу for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=old.FIELD_KEY into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end END^ SET TERM ; ^4Триггер-2 на распроведение Акта пр-ва при удалении Прих. и Расх.16.1.12.1ALTER trigger tr_bd2_delete for bd_2 Oa q;klSET TERM ^ ; CREATE OR ALTER trigger tr_ord_out_del for bd_order_out_1 active after delete position 0 AS BEGIN delete from BD_ORDER_OUT_11 where fk_bd_out_1=old.FIELD_KEY; update bd_zp_docs set fk_doc=null where type_doc=4 and fk_doc=old.FIELD_KEY; END^ SET TERM ; ^ 4Триггер на удаление заявки отвязывает вложения16.1.12.1ALTER trigger tr_ord_out_del for bd_order_out_1L` +IjUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('path_attach_img', 'c:\', 'Путь к прикрепленным файлам документов') MATCHING (PARAMNAME);4Путь к прикрепленным файлам документов16.1.12.1GLOBAL_OPTIONS path_attach_img^_ O+;iCREATE GENERATOR GEN_BD_ZP_DOCS_ID; CREATE TABLE BD_ZP_DOCS ( FIELD_KEY INTEGER NOT NULL, FK_DOC INTEGER, TYPE_DOC INTEGER NOT NULL, CAPTION VARCHAR(255), THUMB DOMN$BLOB_IMAGE /* DOMN$BLOB_IMAGE = BLOB SUB_TYPE 0 SEGMENT SIZE 8192 */, FILENAME VARCHAR(255), ATTACH_TIME TIMESTAMP DEFAULT current_timestamp ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_ZP_DOCS ADD CONSTRAINT PK_BD_ZP_DOCS_1 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_ZP_DOCS_IDX1 ON BD_ZP_DOCS (FK_DOC); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_ZP_DOCS_BI */ CREATE OR ALTER TRIGGER BD_ZP_DOCS_BI FOR BD_ZP_DOCS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_BD_ZP_DOCS_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_ZP_DOCS.FK_DOC IS 'Ссылка на документ-основу, пустое у непривязанных файлов'; COMMENT ON COLUMN BD_ZP_DOCS.TYPE_DOC IS 'Тип документа: заявка покупателя, расход, приход и т.д.'; COMMENT ON COLUMN BD_ZP_DOCS.ATTACH_TIME IS 'Дата и время прикрепления'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_ZP_DOCS TO PUBLIC;4Таблица файлов, прикрепленных к документам16.1.12.1CREATE TABLE BD_ZP_DOCSect bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; SUSPEND; --остатки по группе товаров в указанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 --and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_1.VALID_FLAG=1) -- and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END END END^ SET TERM ; ^ 4убран баг в ревизии "ограничение 856 строк"16.1.12.1ALTER procedure SP_GET_REV_RASH_PRICE }c _GMnSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_REV ( ID_REV integer) returns ( FK_1 integer, FK_2 integer) as declare variable DAT date; declare variable TIM time; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CNT decimal(7,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS_TOVAR integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable OST_RASH decimal(7,3); declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable NEDOSTACHA varchar(200); declare variable IZLISHKI varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable FK_SUPPLIER integer; declare variable FK_RECIPIENT integer; declare variable FK_COD_PRIH integer; declare variable FK_COD_RASH integer; declare variable IN_PRIH_CENA integer; BEGIN /* создание прихода и расхода по ревизии */ lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); nedostacha=(select TR_NAME from SP_TRANSLATE('Недостача',:lang)); izlishki=(select TR_NAME from SP_TRANSLATE('Излишки',:lang)); id_user=(select first 1 field_key from bd_users where upper(login)=upper(current_user)); select date_rev, time_rev, fk_bd_firm, FK_FACE, FK_BD_SMENA, coalesce(fk_supplier,1), coalesce(fk_recipient,1), coalesce(fk_cod_prih,7) , coalesce(fk_cod_rash,4), coalesce(IN_PRIH_PRICE,0) from BD_9 where field_key=:id_rev into :dat, :tim, :id_skl, :fk_face, :fk_smena, :fk_supplier, :fk_recipient, :fk_cod_prih, :fk_cod_rash, :in_prih_cena; if (exists (select bd_91.FK_BD_TOVAR --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RWb -#WmSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN selECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:nedostacha,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:fk_recipient,:fk_face,:fk_cod_rash, null, :id_user, null, 0, null, null, null, :id_skl, null, 0, null, null, :in_prih_cena, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_11,0)-coalesce(count_real,0), cena --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0 into :fk_bd_tovar, :ost_rash, :cena DO BEGIN --заполняем расход insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds) values (:fk_2,:fk_bd_tovar,:ost_rash,:cena); --эта цена будет изменена на партионную через SP_22_BY_21, вызываемую внутри проведения расхода, в случае ревизии в ПЦ, а в случае ревизии в РЦ - останется, -- признак - bd_2.in_prih_cena --примечание: TR_BD_21_FK_TOVAR сохраняет прих. цену как доп. инфу в BD_21 END --считаем сумму расхода update bd_2 main set main.SUMMA=(select sum(bd_21.CENA_WITH_NDS*bd_21.CNT) from bd_21 where fk_bd_2=main.field_key) where main.field_key=:fk_2; execute procedure SP_BD2_PROV(:fk_2,:lang,0,:id_user, 1); --для ревизий не учитываем запрет на создание излишков данного товара if (exists (select bd_91.FK_BD_TOVAR --излишки from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-(coalesce(count_11,0))>0))) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat,current_time, :izlishki, null, null, :fk_supplier, :fk_face, :fk_cod_prih, null, null, null, 0, 0, 1, null, :id_user, 1, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_real,0)-coalesce(count_11,0), cena, --излишки BD_TOVAR.NDS, gtd, articul, inplace from bd_91 join bd_tovar on bd_tovar.field_key=bd_91.FK_BD_TOVAR where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))>0 into :fk_bd_tovar, :cnt, :cena, :NDS_tovar, :gtd, :articul, :inplace do BEGIN --находим сроки годности из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:id_skl and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; --заполняем приход INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, ARTICUL,date_save, date_make) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds_tovar, --date_save ? :GTD, :cena, --в приходе какую ставим цену??? (100*:cena)/(100+:nds_tovar), :cena*:cnt, (100*:cena*:cnt)/(100+:nds_tovar), :cnt, 0, :INPLACE, :ARTICUL, :date_save, :date_make); END update bd_9 set fk_bd_1=:fk_1, fk_bd_2=:fk_2 where field_key=:id_rev; -- execute procedure sp_22_by_21(:fk_2,0); END^ SET TERM ; ^5Проведение Ревизии в РЦ будет брать цены для Расхода (при наличии недостач) из Ревизии16.1.13.1ALTER procedure SP_CREATE_BY_REV @ 2@:f E'rSET TERM ^ ; CREATE OR ALTER procedure SP_BD2_TO_KS1 ( FK_DOC_OPL integer, VALID_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable FK_KS_SHET integer; declare variable FK_KS_SHET2 integer; declare variable SUMMA_DOLG decimal(15,2); declare variable FK_REC integer; declare variable SKLAD integer; declare variable FK_SELFUL integer; declare variable COD_RASH integer; declare variable FK_SELFUL2 integer; declare variable FK_KS_KODI integer; declare variable PRIH integer; declare variable FK_KS_1 integer; declare variable SUMKS1 decimal(15,2); declare variable SUMKS11 decimal(15,2); declare variable FK_KS_11 integer; declare variable FK_DOGOVOR integer; declare variable AVTO_FLAG smallint; declare variable AVTO_FLAG_BEZNAL smallint; declare variable FK_KS_SHET_BEZNAL integer; begin if (valid_flag is null) then exit; select coalesce(bd_2.summa_dolg,0), bd_2.fk_bd_firm, bd_2.cod_rash from bd_2 where field_key=:fk_doc_opl into :summa_dolg, :fk_bd_firm, :cod_rash; select bd_firm.fk_ks_shet, AVTO_BD2_TO_KS1_FLAG, bd_firm.avto_bd2_beznal_to_ks1_flag, bd_firm.fk_ks_shet_beznal from bd_firm where field_key=:fk_bd_firm into :fk_ks_shet, :avto_flag, :avto_flag_beznal, :fk_ks_shet_beznal; if (coalesce(cod_rash,-1) in (0,7)) then begin if (:fk_ks_shet is null) then exit; if (coalesce(:AVTO_FLAG,0)=0) then exit; end else if (coalesce(cod_rash,-1)=3) then begin if (:fk_ks_shet_beznal is*e 3#wpALTER TABLE BD_FIRM ADD AVTO_BD2_BEZNAL_TO_KS1_FLAG INT_DEF0; ALTER TABLE BD_FIRM ADD FK_KS_SHET_BEZNAL INTEGER; ALTER TABLE BD_FIRM ADD CONSTRAINT FK_BD_FIRM_1 FOREIGN KEY (FK_KS_SHET_BEZNAL) REFERENCES KS_SCHET(FIELD_KEY) ON DELETE SET NULL;6Новые поля для созд оплат по чекам безнал16.1.14.1 BD_FIRM ADD AVTO_BD2_BEZNAL_TO_KS1 FK_KS_SHET_BEZNALKd k5ooSET TERM ^ ; CREATE OR ALTER procedure SP_UPD_COUNT_11_BD_91_2 ( ID_REVISION integer) as declare variable STOCK decimal(12,3); declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable MAS_RB integer; declare variable MAS_LB integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable FK_BD_GRP_TOVAR integer; declare variable FK_BD_FIRM integer; declare variable FK_SMENA integer; begin select fk_bd_firm, coalesce(fk_bd_grp_tovar, 0) as fk_bd_grp_tovar, in_prih_price, fk_bd_cena, fk_bd_smena from bd_9 where field_key = :id_revision into :fk_bd_firm, :fk_bd_grp_tovar, :in_prih_price, :fk_bd_cena, :fk_smena; -- update bd_91 set count_11 = 0 where fk_bd_9 = :id_revision; for select fk_bd_tovar from bd_91 where fk_bd_9 = :id_revision into :fk_bd_tovar do begin stock=0; select sum(coalesce(stock,0)) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_11.fk_bd_firm =:fk_bd_firm and bd_11.valid_flag=1 and coalesce(stock,0)>0 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_11.fk_bd_tovar=:fk_bd_tovar group by fk_bd_tovar into :stock; stock=coalesce(stock,0); update bd_91 set count_11=:stock where fk_bd_9=:id_revision and fk_bd_tovar=:fk_bd_tovar; end end^ SET TERM ; ^5Новая хранимка для кнопки "Пересчет" в Ревизии16.1.13.1CREATE OR ALTER procedure SP_UPD_COUNT_11_BD_91_2 null) then exit; if (coalesce(:avto_flag_beznal,0)=0) then exit; end else exit; --if (not(coalesce(cod_rash,-1) in (0,7))) then exit; if (valid_flag=1) then begin -- проведение расхода if (summa_dolg<=0) then exit; --fk_bd_firm=null; --fk_ks_shet=null; fk_ks_shet2=null; select bd_2.fk_recipient, bd_firm.sklad, BD_2.fk_selful, BD_2.fk_selful2, bd_2.fk_bd_dogovor from BD_2 join BD_FIRM on (bd_firm.field_key=BD_2.fk_recipient) where BD_2.field_key=:fk_doc_opl into :fk_rec, :sklad, :fk_selful, :fk_selful2, :fk_dogovor; if (coalesce(cod_rash,-1) in (0,7)) then select bd_firm.fk_ks_shet from bd_firm where field_key=:fk_bd_firm into :fk_ks_shet; else select bd_firm.fk_ks_shet_beznal from bd_firm where field_key=:fk_bd_firm into :fk_ks_shet; fk_bd_firm=null; if (sklad=1) then -- //по внутренним перемещениям оплаты не делаем begin -- //внутреннее перемещение -- //отправитель платежа - счет 1 -- //счет юр.лица склада-поставщика по умолчанию prih=2; fk_rec=0; select min(ks_schet.field_key) from BD_2 join ks_schet on ks_schet.fk_selful=BD_2.fk_selful where BD_2.field_key=:fk_doc_opl into :fk_ks_shet2; if (fk_ks_shet2 is null) then exit; -- //получатель платежа - счет 2 if (fk_ks_shet is null) then select min(ks_schet.field_key) from BD_2 join ks_schet on ks_schet.fk_selful=BD_2.fk_selful2 where BD_2.field_key=:fk_doc_opl into :fk_ks_shet; if (fk_ks_shet is null) then exit; end else begin -- //входящая оплата if (cod_rash=7) then -- //по возврату от получателя делаем оплату исходящую (0) prih=0; else prih=1; -- //отправитель платежа - счет 1 -- //счет по договору if (fk_ks_shet is null) then select min(bd_dogovor.fk_ks_schet) from BD_DOGOVOR where valid_flag=1 and fk_recipient=:fk_rec and fk_selful=:fk_selful into :fk_ks_shet; if (fk_ks_shet is null) then -- //счет у своего юр.лица -получателя товара select min(field_key) from ks_schet where fk_selful=:fk_selful into :fk_ks_shet; if (fk_ks_shet is null) then exit; -- //получатель платежа - контрагент fk_bd_firm=fk_rec; end fk_ks_kodi=2; fk_ks_1=gen_id(GEN_KS_1_ID,1); insert into KS_1 (field_key, prih, fk_bd_firm, fk_ks_kodi, fk_ks_schet, fk_ks_shet2, summa, date_create, time_create, oper_create,valid_flag, fk_bd_dogovor) values (:fk_ks_1, :prih, :fk_bd_firm, :fk_ks_kodi, :fk_ks_shet, :fk_ks_shet2, :summa_dolg, current_date, current_time, (select field_key from bd_users where upper(login)=current_user) ,1, :fk_dogovor); insert into KS_11(field_key, fk_ks_1, fk_bd_2, summa) values (gen_id(gen_ks_11_id,1), :fk_ks_1, :fk_doc_opl, :summa_dolg); end if (valid_flag=0) then begin -- распроведение расхода /*$$IBEC$$ if (exists(select fk_bd_2 from ks_11 where fk_bd_2=:fk_doc_opl)) then begin for select field_key, fk_ks_1, summa from ks_11 where fk_bd_2=:fk_doc_opl into :fk_ks_11, :fk_ks_1, :sumks11 do begin select summa from ks_1 where field_key=:fk_ks_1 into :sumks1; if (sumks1=sumks11) then begin delete from ks_1 where field_key=:fk_ks_1; end else begin delete from ks_11 where field_key=:fk_ks_11; end end end $$IBEC$$*/ end end^ SET TERM ; ^6автопр. безнал оплат по чекам (код расх реализация)16.1.14.1SP_BD2_TO_KS1e CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; BEGIN create_7=coalesce(create_7,0); ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod is null or fk_bd_tovar_mod=:fk_bd_mod ) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); cnt_11=cnt_11-cnt_avtopr; if (cnt_11<0) then cnt_11=0; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_22; end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( (create_7=1) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(cnt_11_stock+coalesce(cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock-coalesce(cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end --удаляем заголовки излишков без позиций --если расход по чекам, то помечаем чеки как переведенные в расход if ((fk_bd_kassa is not null)) then begin if (CREATE_7=1) then begin for SELECT a.FIELD_KEY FROM BD_ch2 a where fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and coalesce(accept_flag,0)=0 and (a.fk_bd_2=:fk_bd2 or summa=0) into :fk_ch2 do begin update BD_CH2 set accept_flag=1 where field_key=:fk_ch2; update BD_CH21 set accept_flag=1 where fk_bd_ch2=:fk_ch2; end end else begin execute procedure sp_set_accept_ch21_op(:fk_bd2,:fk_bd_kassa,:is_vozvrat,:date_rash); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and (fk_bd_2=:fk_bd2 or summa<=0) and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); end end update bd_2 set valid_flag=1 where field_key=:fk_bd2; execute procedure sp_bd2_to_ks1(:fk_bd2, 1); end --если у получателя включена галка "автопроведение прихода по ВП", то проводим приход if (1=coalesce((select min(BD_FIRM.AVTO_BD1_BY_BD2_VALID_FLAG) from BD_FIRM join bd_2 on bd_2.FK_RECIPIENT=bd_firm.FIELD_KEY where bd_2.FIELD_KEY=:fk_bd2 and BD_FIRM.SKLAD=1),0) ) then update bd_1 set valid_flag=1 where field_key=(select bd_2.FK_BD_1_6 from bd_2 where field_key=:fk_bd2); END^ SET TERM ; ^6автопр. брать первую ТТК по продукту16.1.14.1SP_BD2_PROV pa`p_i m9tSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22 ( FKFIRM integer, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV rh QW3sSET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; g I#qSET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variabl declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena into :date_close, :is_vozvrat, :is_bank, :smena do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, fk_bd_tovar_mod, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, fk_bd_tovar_mod, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :fk_tovar_mod, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, null, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :fk_tovar_mod, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^6перевод чеков в расход, группировать по сменам и безнал16.1.14.1SP_CH_TO_RASH_22_OPdecimal(7,3), FKTOV_MOD integer) as declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; BEGIN rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; for select sum(bd_ch21.cnt), bd_tovar.name, bd_ch21.fk_bd_tovar, bd_ch2.date_close, emktov --, bd_ch21.scancod from bd_ch2 join bd_ch21 on bd_ch21.fk_bd_ch2=bd_ch2.field_key join bd_tovar on bd_tovar.field_key=bd_ch21.fk_bd_tovar where bd_ch2.fk_bd_firm=:fkfirm and bd_ch21.accept_flag<>1 /* не учитывать товары с автопроизводством */ and not exists(select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=bd_tovar.field_key and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0) and bd_ch2.date_open<=:withtoday group by 2,3,4,5 order by 3,4 into :cnt, :name, :fktov, :datech, :emktov --, :scan do begin --if (substring(scan from 1 for 2)='99') then begin -- emktov=null; -- select emktov from bd_tovar where field_key=:fktov into :emktov; if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; -- end nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin for select n.fk_bd_tovar_dop, t.name, n.cnt_dop from bd_tovar_nabor n left join bd_tovar t on (t.field_key=n.fk_bd_tovar_dop) where n.fk_bd_tovar_master=:fktov into :nabor_fktov, :name, :nabor_cnt_dop do begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:nabor_fktov)) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:nabor_fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:nabor_fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:nabor_cnt_dop and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if ((:cnt*:nabor_cnt_dop)>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=coalesce(:sumrazn*((:cnt*:nabor_cnt_dop)-:stock),0); razn=0; razn=coalesce((:cnt*:nabor_cnt_dop)-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:nabor_fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-(:cnt*:nabor_cnt_dop) where fk_tovar=:nabor_fktov and frmhandle=123; end end else begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:fktov)) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:fktov and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if (:cnt>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=:sumrazn*(:cnt-:stock); --coalesce((select first 1 bd_11.cena_pr_with_nds from bd_11 where bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech order by field_key desc)*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-:cnt where fk_tovar=:fktov and frmhandle=123; end end END^ SET TERM ; ^6проверка на излишки, не учитывать товары с автопроизводством16.1.14.1SP_GET_OUTOFSTOCK_CH22 from z_izl_stock z where z.date_pr<=:datech and z.fk_tovar=:nabor_fktov order by 1 into :z_fktov_mod, :z_stock, :z_date_pr do begin if (z_stock>=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock0) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; if (nabor_fktov_mod is null) then begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod is null)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod is null; else begin insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn); end end else begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod=:nabor_fktov_mod)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod=:nabor_fktov_mod; else insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash, fk_tovar_mod) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn, :nabor_fktov_mod); end end end -- nabor_cnt_dop>0 end -- получение состава набора end else begin -- i'ts not nabor --===================================================================================>> nabor_fktov=:fktov; nabor_fktov_mod=:fktov_mod; nabor_cnt_dop=:cnt; z_tmp_stock=0; z_tmp_cnt=:nabor_cnt_dop; if (nabor_cnt_dop>0) then begin if (nabor_fktov_mod is null) then begin for select z.fk_tovar_mod, z.stock, z.date_pr from z_izl_stock z where z.date_pr<=:datech and z.fk_tovar=:nabor_fktov order by 1 into :z_fktov_mod, :z_stock, :z_date_pr do begin if (z_stock>=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod --=:nabor_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock=:nabor_cnt_dop) then begin if (z_fktov_mod is null) then update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod is null and z_izl_stock.date_pr=:z_date_pr; else update z_izl_stock set stock=stock-:nabor_cnt_dop where z_izl_stock.fk_tovar=:nabor_fktov and z_izl_stock.fk_tovar_mod=:z_fktov_mod and z_izl_stock.date_pr=:z_date_pr; nabor_cnt_dop=0; end else begin -- z_stock0) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; if (nabor_fktov_mod is null) then begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod is null)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod is null; else begin insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn); end end else begin if (exists(select * from z_izl_check z where z.fk_tovar=:nabor_fktov and z.fk_tovar_mod=:nabor_fktov_mod)) then update z_izl_check set cnt_in_stock=0, cnt_rash=:nabor_cnt_dop where frmhandle=123 and fk_tovar=:nabor_fktov and fk_tovar_mod=:nabor_fktov_mod; else insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, cnt_rash, cena_rash, fk_tovar_mod) values (:nabor_fktov, 123, 0, :nabor_cnt_dop, :sumrazn, :nabor_fktov_mod); end end end nabor_fktov=null; --<<=================================================================================== end end for select zc.fk_tovar, zc.fk_tovar_mod, zc.cnt_in_stock, zc.cnt_rash, zc.cena_rash, trim(t.name)||coalesce(' ['||m.name||']','') from z_izl_check zc join bd_tovar t on zc.fk_tovar=t.field_key left join bd_tovar_mod m on zc.fk_tovar_mod=m.field_key order by 6 into :fktov, :fktov_mod, :stock, :cnt, :rozn_price, :name do begin sumrazn=coalesce(:rozn_price*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end delete from z_izl_stock; end^ SET TERM ; ^6не учитывать товары с автопроизводством16.1.14.1SP_GET_OUTOFSTOCK_CH22_MOD ``j %!AuSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22_MOD ( FKFIRM integer not null, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV decimal(7,3), FKTOV_MOD integer, NABOR_FKTOV_MOD integer) as declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; declare variable Z_FKTOV_MOD integer; declare variable Z_STOCK decimal(7,3); declare variable Z_DATE_PR date; declare variable Z_TMP_CNT decimal(7,3); declare variable Z_TMP_STOCK decimal(7,3); begin rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; delete from z_izl_stock; insert into z_izl_stock select bd_11.date_prih, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, sum(bd_11.stock) from bd_11 where bd_11.valid_flag=1 and bd_11.fk_bd_firm=:fkfirm and bd_11.stock>0 and bd_11.priority>0 group by 1,2,3 order by 1,2,3 desc; for select c2.date_close, c21.fk_bd_tovar, c21.fk_bd_tovar_mod, trim(t.name)||coalesce(' ['||m.name||']','') name, t.emktov, sum(c21.cnt) from bd_ch2 c2 join bd_ch21 c21 on c21.fk_bd_ch2=c2.field_key join bd_tovar t on t.field_key=c21.fk_bd_tovar left join bd_tovar_mod m on m.field_key=c21.fk_bd_tovar_mod where c2.fk_bd_firm=:fkfirm and coalesce(c21.accept_flag,0)<>1 /* не учитывать товары с автопроизводством */ and not exists(select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=t.field_key and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0) and c2.date_close<=:withtoday group by 1,2,3,4,5 order by 1,2,3 desc into :datech, :fktov, :fktov_mod, :name, :emktov, :cnt do begin if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin -- i'ts nabor for select n.fk_bd_tovar_dop, n.fk_bd_tovar_dop_mod, t.name||coalesce(' ['||m.name||']',''), coalesce(n.cnt_dop*:cnt,0) from bd_tovar_nabor n join bd_tovar t on t.field_key=n.fk_bd_tovar_dop left join bd_tovar_mod m on m.field_key=n.fk_bd_tovar_dop_mod where n.fk_bd_tovar_master=:fktov order by 1,2 desc into :nabor_fktov, :nabor_fktov_mod, :name, :nabor_cnt_dop do begin z_tmp_stock=0; z_tmp_cnt=:nabor_cnt_dop; if (nabor_cnt_dop>0) then begin if (nabor_fktov_mod is null) then begin for select z.fk_tovar_mod, z.stock, z.date_pr ok ![[vSET TERM ^ ; CREATE OR ALTER procedure SP_UPD_COUNT_11_BD_91_2 ( ID_REVISION integer) as declare variable STOCK decimal(12,3); declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable MAS_RB integer; declare variable MAS_LB integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable FK_BD_GRP_TOVAR integer; declare variable FK_BD_FIRM integer; declare variable FK_SMENA integer; declare variable DATE_REV date; begin select fk_bd_firm, coalesce(fk_bd_grp_tovar, 0) as fk_bd_grp_tovar, in_prih_price, fk_bd_cena, fk_bd_smena, date_rev from bd_9 where field_key = :id_revision into :fk_bd_firm, :fk_bd_grp_tovar, :in_prih_price, :fk_bd_cena, :fk_smena, :date_rev; -- update bd_91 set count_11 = 0 where fk_bd_9 = :id_revision; for select fk_bd_tovar from bd_91 where fk_bd_9 = :id_revision into :fk_bd_tovar do begin stock=0; --поиск остатков на текущую дату заменили на дату ревизии /*$$IBEC$$ select sum(coalesce(stock,0)) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_11.fk_bd_firm =:fk_bd_firm and bd_11.valid_flag=1 and coalesce(stock,0)>0 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_11.fk_bd_tovar=:fk_bd_tovar group by fk_bd_tovar into :stock; $$IBEC$$*/ select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:fk_bd_firm and date_morning<=:date_rev into :stock; stock=coalesce(stock,0); update bd_91 set count_11=:stock where fk_bd_9=:id_revision and fk_bd_tovar=:fk_bd_tovar; end end^ SET TERM ; ^7Пересчет count_11 в ревизии - на дату ревизии, а не на текущую16.1.18.1ALTER procedure SP_UPD_COUNT_11_BD_91_2 nl uYwSET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_BY_9 ( ID_9 integer) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, COUNT_11 type of column BD_STOCK_1.CNT ) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; if (id_91 is distinct from null) then update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, count_11=:count_11 where field_key=:id_91; end END^ SET TERM ; ^7При пересчете полей ревизии, зависящих от даты, пересчитываем и count_1116.1.18.1ALTER procedure SP_FILL_91DATECNT_BY_9 m Ym[xSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE_T ( ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT ) as --DECLARE VARIABLE variable_name < datatype>; BEGIN --остатки по товару в приходных ценах for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN --находим последнюю приходную цену --находим общее количество for select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.field_key desc into :cena do break; cena=coalesce(cena,0); if (cena=0) then select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.field_key desc into :cena; --устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 -- into :cnt_11; sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; fk_revsp=GEN_ID(GEN_BD_91_ID,1); suspend; END END^ SET TERM ; ^7Добавление товара в ревизию по ПЦ - count_11 берем на дату ревизии16.1.18.1ALTER procedure SP_GET_OST_PRIH_PRICE_T  n Im[ySET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE_T ( ID_CENA integer, ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT ) as declare variable IS_OPT integer; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 for select bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena do break; end ELSE BEGIN --bd_cpr for select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena do break; END sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; fk_revsp=GEN_ID(GEN_BD_91_ID,1); -- устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 into :cnt_11; suspend; END END^ SET TERM ; ^7Добавление товара в ревизию по РЦ - count_11 берем на дату ревизии16.1.18.1ALTER procedure SP_GET_OST_RASH_PRICE_T Xp -O/{SET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROVCANCEL ( FK_BD2 integer) returns ( RESULT integer, RESULT_TXT varchar(100)) as declare variable FK11 integer; BEGIN --распроводим расход update bd_2 set valid_flag=0 where field_key=:fk_bd2; if (not exists(select bd_11.field_key from bd_11 join bd_21 on bd_11.FIELD_KEY=bd_21.FK_BD_11_6 where bd_11.cnt<>stock and bd_21.FK_BD_2=:fk_bd2)) then begin for select bd_11.field_key from bd_11 join bd_21 on bd_11.FIELD_KEY=bd_21.FK_BD_11_6 where bd_21.FK_BD_2=:fk_bd2 into :fk11 do delete from bd_11 where field_key=:fk11; delete from BD_21 where fk_bd_2=:fk_bd2; -- execute procedure sp_bd2_to_ks1(:fk_bd2, 0); result=1; end else result=2; suspend; END^ SET TERM ; ^8Убраны автооплаты16.1.19.1SP_BD2_PROVCANCEL%o QYzSET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_BY_9 ( ID_9 integer, set_real integer = 0) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, COUNT_11 type of column BD_STOCK_1.CNT) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; if (id_91 is distinct from null) then begin update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, count_11=:count_11 where field_key=:id_91; if (set_real=1) then update bd_91 set count_real=:count_11 where field_key=:id_91; end end END^ SET TERM ; ^7Заполнение расчетных полей ревизии с учетом "Заполнить реальные данные.."16.1.18.1ALTER procedure SP_FILL_91DATECNT_BY_9ecimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; BEGIN create_7=coalesce(create_7,0); ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod is null or fk_bd_tovar_mod=:fk_bd_mod ) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); cnt_11=cnt_11-cnt_avtopr; if (cnt_11<0) then cnt_11=0; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_22; end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( (create_7=1) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(cnt_11_stock+coalesce(cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock-coalesce(cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end --удаляем заголовки излишков без позиций --если расход по чекам, то помечаем чеки как переведенные в расход if ((fk_bd_kassa is not null)) then begin if (CREATE_7=1) then begin for SELECT a.FIELD_KEY FROM BD_ch2 a where fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and coalesce(accept_flag,0)=0 and (a.fk_bd_2=:fk_bd2 or summa=0) into :fk_ch2 do begin update BD_CH2 set accept_flag=1 where field_key=:fk_ch2; update BD_CH21 set accept_flag=1 where fk_bd_ch2=:fk_ch2; end end else begin execute procedure sp_set_accept_ch21_op(:fk_bd2,:fk_bd_kassa,:is_vozvrat,:date_rash); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and (fk_bd_2=:fk_bd2 or summa<=0) and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); end end update bd_2 set valid_flag=1 where field_key=:fk_bd2; --execute procedure sp_bd2_to_ks1(:fk_bd2, 1); end --если у получателя включена галка "автопроведение прихода по ВП", то проводим приход if (1=coalesce((select min(BD_FIRM.AVTO_BD1_BY_BD2_VALID_FLAG) from BD_FIRM join bd_2 on bd_2.FK_RECIPIENT=bd_firm.FIELD_KEY where bd_2.FIELD_KEY=:fk_bd2 and BD_FIRM.SKLAD=1),0) ) then update bd_1 set valid_flag=1 where field_key=(select bd_2.FK_BD_1_6 from bd_2 where field_key=:fk_bd2); END^ SET TERM ; ^8Убраны автооплаты16.1.19.1SP_BD2_PROV ;t ASET TERM ^ ; CREATE trigger bd_z_ad0 for bd_z active after delete position 0 AS begin if (old.fk_ks_1_sales is not null) then delete from ks_1 where field_key=OLD.fk_ks_1_sales; if (old.fk_ks_1_sales4 is not null) then delete from ks_1 where field_key=OLD.fk_ks_1_sales4; end^ SET TERM ; ^8Удаление оплаты при удалении з отчета16.1.19.1 trigger bd_z_ad0 for bd_zZs s#~SET TERM ^ ; create or alter procedure SP_Z_TO_KS1 ( FK_DOC_OPL integer, VALID_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable FK_KS_SHET integer; declare variable FK_KS_SHET2 integer; declare variable FK_KS_KODI integer; declare variable PRIH integer; declare variable FK_KS_1 integer; declare variable AVTO_FLAG smallint; declare variable AVTO_FLAG_BEZNAL smallint; declare variable FK_KS_SHET_BEZN3r Wu}ALTER TABLE BD_Z ADD FK_KS_1_SALES INTEGER; ALTER TABLE BD_Z ADD FK_KS_1_SALES4 INTEGER;8Ссылки на оплаты по z отчетам16.1.19.1BD_Zcq MO#|SET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD dAL integer; declare variable SUMZ decimal(15,2); declare variable SUMZ4 decimal(15,2); declare variable DATEZ date; declare variable TIMEZ time; declare variable ISMANUALLY integer; declare variable FKKSSALES integer; declare variable FKKSSALES4 integer; begin if (valid_flag is null) then exit; select z.fk_bd_firm, z.date_z, z.time_z, z.revenue, z.revenue4, z.ismanually, z.fk_ks_1_sales, z.fk_ks_1_sales4 from bd_z z where z.field_key=:fk_doc_opl into :fk_bd_firm, :datez, :timez, :sumz, :sumz4, :ismanually, :fkksSales, :fkksSales4; if (fkkssales is not null) then delete from ks_1 where field_key=:fkkssales; if (fkkssales4 is not null) then delete from ks_1 where field_key=:fkkssales4; select bd_firm.fk_ks_shet, AVTO_BD2_TO_KS1_FLAG, bd_firm.avto_bd2_beznal_to_ks1_flag, bd_firm.fk_ks_shet_beznal from bd_firm where field_key=:fk_bd_firm into :fk_ks_shet, :avto_flag, :avto_flag_beznal, :fk_ks_shet_beznal; if ((coalesce(:AVTO_FLAG,0)=0)and(coalesce(:avto_flag_beznal,0)=0)and(coalesce(:ismanually,0)=0)) then exit; if ((:fk_ks_shet is null)and(:fk_ks_shet_beznal is null)) then exit; if (valid_flag=1) then begin -- проведение оплаты fk_ks_shet2=null; -- //входящая оплата prih=1; fk_ks_kodi=2; if (((coalesce(:AVTO_FLAG,0)=1)or(coalesce(:ismanually,0)=1))and(sumz>0)and(fk_ks_shet is not null)) then begin fk_ks_1=gen_id(GEN_KS_1_ID,1); insert into KS_1 (field_key, prih, fk_bd_firm, fk_ks_kodi, fk_ks_schet, fk_ks_shet2, summa, date_create, time_create, oper_create,valid_flag, fk_bd_dogovor, fk_sklad) values (:fk_ks_1, :prih, 2, :fk_ks_kodi, :fk_ks_shet, :fk_ks_shet2, :sumz, :datez, :timez, (select field_key from bd_users where upper(login)=current_user) ,1, null, :fk_bd_firm); update bd_z set fk_ks_1_sales=:fk_ks_1 where field_key=:fk_doc_opl; end if (((coalesce(:avto_flag_beznal,0)=1)or(coalesce(:ismanually,0)=1))and(sumz4>0)and(fk_ks_shet_beznal is not null)) then begin fk_ks_1=gen_id(GEN_KS_1_ID,1); insert into KS_1 (field_key, prih, fk_bd_firm, fk_ks_kodi, fk_ks_schet, fk_ks_shet2, summa, date_create, time_create, oper_create,valid_flag, fk_bd_dogovor, fk_sklad) values (:fk_ks_1, :prih, 2, :fk_ks_kodi, :fk_ks_shet_beznal, :fk_ks_shet2, :sumz4, :datez, :timez, (select field_key from bd_users where upper(login)=current_user) ,1, null, :fk_bd_firm); update bd_z set fk_ks_1_sales4=:fk_ks_1 where field_key=:fk_doc_opl; end end if (valid_flag=0) then begin -- распроведение /*$$IBEC$$ if (exists(select fk_bd_2 from ks_11 where fk_bd_2=:fk_doc_opl)) then begin for select field_key, fk_ks_1, summa from ks_11 where fk_bd_2=:fk_doc_opl into :fk_ks_11, :fk_ks_1, :sumks11 do begin select summa from ks_1 where field_key=:fk_ks_1 into :sumks1; if (sumks1=sumks11) then begin delete from ks_1 where field_key=:fk_ks_1; end else begin delete from ks_11 where field_key=:fk_ks_11; end end end $$IBEC$$*/ end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT,UPDATE ON BD_Z TO PROCEDURE SP_Z_TO_KS1; GRANT SELECT,INSERT,DELETE ON KS_1 TO PROCEDURE SP_Z_TO_KS1; GRANT SELECT ON BD_FIRM TO PROCEDURE SP_Z_TO_KS1; GRANT SELECT ON BD_USERS TO PROCEDURE SP_Z_TO_KS1; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_Z_TO_KS1 TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_Z_TO_KS1 TO SYSDBA;8Процедура создания оплаты по З отчету16.1.19.1SP_Z_TO_KS1D_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash do BEGIN for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы ончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,0); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, bd_pr_product.inplace, bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, bd_pr_product.inplace, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save do BEGIN --заполняем приход --находим цену if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save)); END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^8Автопроизводство смена сортировки остатком первично по приоритету потом дата16.1.19.1SP_CREATE_BY_PR x:x?v {aupdate or INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Редактирование шаблона импорта', 'com_import_shablon_edit', (select field_key from bd_users_rights_name where name_var='comming')) matching (name_var);9права на Редактирование шаблона импорта - теперь скрипт работает16.1.20.1update or INSERT INTO BD_USERS_RIGHTS_NAME7u  -+SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr; summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_B vw +1SET TERM ^ ; create or alter procedure SP_GET_STOCKWITHPR ( FK_TOVAR integer, FK_FIRM integer, DATE_PRIH date) returns ( STOCK decimal(15,3)) as declare variable NORMA_MIN decimal(15,4); declare variable FK_CALC integer; declare variable FK_FIRM_PROD integer; declare variable NORMA_COMP decimal(15,4); declare variable FK_TOVAR_COMP integer; declare variable CNT_PR_PROD decimal(15,4); begin if (date_prih is null) then date_prih=current_date; select first 1 bd_calc.field_key, bd_calc.fk_bd_firm_prod, bd_calc.norma_min from bd_calc where bd_calc.fk_bd_tovar=:fk_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :fk_calc, :fk_firm_prod, :norma_min; select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm and bd_11.date_prih<=:date_prih and bd_11.fk_bd_tovar=:fk_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0 into :stock; if (fk_calc is null) then begin suspend; exit; end if (fk_firm_prod is null) then fk_firm_prod=:fk_firm; /*tov = 0 bd_calc_component bd_11 fk_tov norma fk_tov stock 1 3 1 7 2 8 2 10 3 2 3 4 */ select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm_prod and bd_11.date_prih<=:date_prih and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/norma),0) from bd_calc_component where fk_calc=:fk_calc group by 1 order by 2 into :fk_tovar_comp, :cnt_pr_prod; --колво возможных производств исходя из мин остатков товара с зависимостью от нормы из ттк -- select sum(cc.norma) from bd_calc_component cc where cc.fk_calc=:fk_calc and cc.fk_bd_tovar=:fk_tovar_comp into :norma_comp; -- результат остатки с учетом автопроизводства без излишек stock=:stock+(:norma_min*:cnt_pr_prod); suspend; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_CALC TO PROCEDURE SP_GET_STOCKWITHPR; GRANT SELECT ON BD_11 TO PROCEDURE SP_GET_STOCKWITHPR; GRANT SELECT ON BD_CALC_COMPONENT TO PROCEDURE SP_GET_STOCKWITHPR; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_GET_STOCKWITHPR TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_STOCKWITHPR TO SYSDBA;:проверка остатков с учетом предстоящего производства с учетом остатков сырья16.1.22.1SP_GET_STOCKWITHPR if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END^ SET TERM ; ^:автопроизводство только по доступным остаткам сырья16.1.22.1SP_AVTOPR AA0x gOSET TERM ^ ; CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN decimal(15,2)) as declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov; select FK_BD_FIRM_PROD, bd_calc.norma_min from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and (:fk_bd_mod is null or fk_bd_tovar_mod is null or fk_bd_tovar_mod=:fk_bd_mod ) and (:fk_22_11 is null or bd_11.field_key=:fk_22_11) and date_prih<=:date_rash and bd_11.PRIORITY>0 order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(cnt_11_stock+coalesce(cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock-coalesce(cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end --удаляем заголовки излишков без позиций --если расход по чекам, то помечаем чеки как переведенные в расход if ((fk_bd_kassa is not null)) then begin if (CREATE_7=1) then begin for SELECT a.FIELD_KEY FROM BD_ch2 a where fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and coalesce(accept_flag,0)=0 and (a.fk_bd_2=:fk_bd2 or summa=0) into :fk_ch2 do begin update BD_CH2 set accept_flag=1 where field_key=:fk_ch2; update BD_CH21 set accept_flag=1 where fk_bd_ch2=:fk_ch2; end end else begin execute procedure sp_set_accept_ch21_op(:fk_bd2,:fk_bd_kassa,:is_vozvrat,:date_rash); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_kassa=:fk_bd_kassa and date_close=:date_rash and (fk_bd_2=:fk_bd2 or summa<=0) and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); end end update bd_2 set valid_flag=1 where field_key=:fk_bd2; --execute procedure sp_bd2_to_ks1(:fk_bd2, 1); end --если у получателя включена галка "автопроведение прихода по ВП", то проводим приход if (1=coalesce((select min(BD_FIRM.AVTO_BD1_BY_BD2_VALID_FLAG) from BD_FIRM join bd_2 on bd_2.FK_RECIPIENT=bd_firm.FIELD_KEY where bd_2.FIELD_KEY=:fk_bd2 and BD_FIRM.SKLAD=1),0) ) then update bd_1 set valid_flag=1 where field_key=(select bd_2.FK_BD_1_6 from bd_2 where field_key=:fk_bd2); END^ SET TERM ; ^:Проведение расхода с учетом новых условий автопроизводства16.1.22.1SP_BD2_PROV W{ QQALTER TABLE BD_TOVAR ADD AVTOPR_ON_COMP_EXISTS INT_DEF0;;Применять автопроизводство, только при наличии сырья16.1.26.1BD_TOVAR ADD AVTOPR_ON_COMP_EXISTSz a9SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22 ( FKFIRM integer, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV decimal(7,3), FKTOV_MOD integer) as gy 7i#SET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_ declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; BEGIN rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; for select sum(bd_ch21.cnt), bd_tovar.name, bd_ch21.fk_bd_tovar, bd_ch2.date_close, emktov --, bd_ch21.scancod from bd_ch2 join bd_ch21 on bd_ch21.fk_bd_ch2=bd_ch2.field_key join bd_tovar on bd_tovar.field_key=bd_ch21.fk_bd_tovar where bd_ch2.fk_bd_firm=:fkfirm and bd_ch21.accept_flag<>1 /* не учитывать товары с автопроизводством */ --and not exists(select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=bd_tovar.field_key and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0) and bd_ch2.date_open<=:withtoday group by 2,3,4,5 order by 3,4 into :cnt, :name, :fktov, :datech, :emktov --, :scan do begin --if (substring(scan from 1 for 2)='99') then begin -- emktov=null; -- select emktov from bd_tovar where field_key=:fktov into :emktov; if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; -- end nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin for select n.fk_bd_tovar_dop, t.name, n.cnt_dop from bd_tovar_nabor n left join bd_tovar t on (t.field_key=n.fk_bd_tovar_dop) where n.fk_bd_tovar_master=:fktov into :nabor_fktov, :name, :nabor_cnt_dop do begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:nabor_fktov)) then begin /*select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0*/ select stock from sp_get_stockwithpr(:nabor_fktov,:fkfirm,:datech) into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:nabor_fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:nabor_fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:nabor_cnt_dop and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if ((:cnt*:nabor_cnt_dop)>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=coalesce(:sumrazn*((:cnt*:nabor_cnt_dop)-:stock),0); razn=0; razn=coalesce((:cnt*:nabor_cnt_dop)-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:nabor_fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-(:cnt*:nabor_cnt_dop) where fk_tovar=:nabor_fktov and frmhandle=123; end end else begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:fktov)) then begin /* select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0*/ select stock from sp_get_stockwithpr(:fktov,:fkfirm,:datech) into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:fktov and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if (:cnt>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=:sumrazn*(:cnt-:stock); --coalesce((select first 1 bd_11.cena_pr_with_nds from bd_11 where bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech order by field_key desc)*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-:cnt where fk_tovar=:fktov and frmhandle=123; end end END^ SET TERM ; ^:Проверка излишек с учетом новых условий автопроизводства16.1.22.1SP_GET_OUTOFSTOCK_CH22 #3Cm UY%CREATE INDEX BD_BUDGET_CFO_IDX1 ON BD_BUDGET_CFO (FK_CFO); CREATE INDEX BD_BUDGET_CFO_IDX2 ON BD_BUDGET_CFO (FK_BD_USERS); CREATE INDEX BD_BUDGET_CFO11_IDX1 ON BD_BUDGET_CFO11 (FK_BD_BUDGET_CFO); CREATE INDEX BD_BUDGET_CFO11_IDX2 ON BD_BUDGET_CFO11 (FK_STAT);<Индексы для бюджетов16.1.30.1CREATE INDEXM~  eSET TERM ^ ; CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN W} m9SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22 ( FKFIRM integer, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV Z| a1SET TERM ^ ; CREATE OR ALTER procedure SP_GET_STOCKWITHPR ( FK_TOVAR integer, FK_FIRM integer, DATE_PRIH date) returns ( STOCK decimal(15,3)) as declare variable NORMA_MIN decimal(15,4); declare variable FK_CALC integer; declare variable FK_FIRM_PROD integer; declare variable NORMA_COMP decimal(15,4); declare variable FK_TOVAR_COMP integer; declare variable CNT_PR_PROD decimal(15,4); begin if (date_prih is null) then date_prih=current_date; select first 1 bd_calc.field_key, bd_calc.fk_bd_firm_prod, bd_calc.norma_min from bd_calc where bd_calc.fk_bd_tovar=:fk_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :fk_calc, :fk_firm_prod, :norma_min; select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm and bd_11.date_prih<=:date_prih and bd_11.fk_bd_tovar=:fk_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0 into :stock; stock=coalesce(:stock, 0); if (fk_calc is null) then begin suspend; exit; end if (fk_firm_prod is null) then fk_firm_prod=:fk_firm; /*tov = 0 bd_calc_component bd_11 fk_tov norma fk_tov stock 1 3 1 7 2 8 2 10 3 2 3 4 */ select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm_prod and bd_11.date_prih<=:date_prih and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/norma),0) from bd_calc_component where fk_calc=:fk_calc group by 1 order by 2 into :fk_tovar_comp, :cnt_pr_prod; --колво возможных производств исходя из мин остатков товара с зависимостью от нормы из ттк -- select sum(cc.norma) from bd_calc_component cc where cc.fk_calc=:fk_calc and cc.fk_bd_tovar=:fk_tovar_comp into :norma_comp; -- результат остатки с учетом автопроизводства без излишек stock=:stock+(coalesce(:norma_min,0)*coalesce(:cnt_pr_prod,0)); suspend; end^ SET TERM ; ^;расчет остатков для процедуры излишек16.1.26.1SP_GET_STOCKWITHPRdecimal(7,3), FKTOV_MOD integer) as declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; BEGIN rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; for select sum(bd_ch21.cnt), bd_tovar.name, bd_ch21.fk_bd_tovar, bd_ch2.date_close, emktov --, bd_ch21.scancod from bd_ch2 join bd_ch21 on bd_ch21.fk_bd_ch2=bd_ch2.field_key join bd_tovar on bd_tovar.field_key=bd_ch21.fk_bd_tovar where bd_ch2.fk_bd_firm=:fkfirm and bd_ch21.accept_flag<>1 /* не учитывать товары с автопроизводством */ --and not exists(select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=bd_tovar.field_key and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0) and bd_ch2.date_open<=:withtoday group by 2,3,4,5 order by 3,4 into :cnt, :name, :fktov, :datech, :emktov --, :scan do begin --if (substring(scan from 1 for 2)='99') then begin -- emktov=null; -- select emktov from bd_tovar where field_key=:fktov into :emktov; if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; -- end nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin for select n.fk_bd_tovar_dop, t.name, n.cnt_dop from bd_tovar_nabor n left join bd_tovar t on (t.field_key=n.fk_bd_tovar_dop) where n.fk_bd_tovar_master=:fktov into :nabor_fktov, :name, :nabor_cnt_dop do begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:nabor_fktov)) then begin /*select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0*/ select stock from sp_get_stockwithpr(:nabor_fktov,:fkfirm,:datech) into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:nabor_fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:nabor_fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:nabor_fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:nabor_cnt_dop and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if ((:cnt*:nabor_cnt_dop)>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=coalesce(:sumrazn*((:cnt*:nabor_cnt_dop)-:stock),0); razn=0; razn=coalesce((:cnt*:nabor_cnt_dop)-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:nabor_fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-(:cnt*:nabor_cnt_dop) where fk_tovar=:nabor_fktov and frmhandle=123; end end else begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:fktov)) then begin /* select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0*/ select stock from sp_get_stockwithpr(:fktov,:fkfirm,:datech) into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock) values (:fktov,123,:stock); old_date_ch=:datech; end else begin select coalesce(sum(bd_11.stock),0) from bd_11 where coalesce(bd_11.stock,0)>0 and bd_11.fk_bd_tovar=:fktov and bd_11.date_prih between :old_date_ch+1 and :datech and bd_11.fk_bd_firm=:fkfirm and bd_11.valid_flag=1 and bd_11.PRIORITY>0 into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:fktov and zi.frmhandle=123; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:fktov and zi.frmhandle=123 into :stock; old_date_ch=:datech; end razn=0; if (:cnt>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=:sumrazn*(:cnt-:stock); --coalesce((select first 1 bd_11.cena_pr_with_nds from bd_11 where bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech order by field_key desc)*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:fktov and frmhandle=123; else update z_izl_check set cnt_in_stock=cnt_in_stock-:cnt where fk_tovar=:fktov and frmhandle=123; end end END^ SET TERM ; ^;процедура расчета излишек16.1.26.1SP_GET_OUTOFSTOCK_CH22decimal(15,2)) as declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END^ SET TERM ; ^;процедура автопроизводства (учет галки Применять автопроизводство, только при наличии сырья)16.1.26.1SP_AVTOPR !![  KWSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(200), CENA decimal(12,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(12,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^=1. В ревизию брать ПЦ из спецухи, если нету в приходах16.2.3.1ALTER procedure SP_GET_OST_PRIH_PRICE suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and ( bd_11.FK_BD_FIRM=:id_sklad ) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END END END^ SET TERM ; ^=2. В ревизию брать ПЦ из спецухи, если нету в приходах16.2.3.1ALTER procedure SP_GET_REV_PRIH_PRICE 5 3KeSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE ( BY_MATRIX integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES (:fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real); END END^ SET TERM ; ^=3. В ревизию брать ПЦ из спецухи, если нету в приходах16.2.3.1ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICEg %KWSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9);  QUALTER TABLE BD_ORDER_IN_1 ADD DAY_TORG_MANUALLY INTEGER;=Поле дней торговли16.2.3.1 BD_ORDER_IN_1 ADD DAY_TORG_MANUALLY^ K[SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE_T ( ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT) as --DECLARE VARIABLE variable_name < datatype>; BEGIN --остатки по товару в приходных ценах for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN --находим последнюю приходную цену --находим общее количество for select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.field_key desc into :cena do break; cena=coalesce(cena,0); if (cena=0) then select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.field_key desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи --устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 -- into :cnt_11; sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; fk_revsp=GEN_ID(GEN_BD_91_ID,1); suspend; END END^ SET TERM ; ^=4. В ревизию брать ПЦ из спецухи, если нету в приходах16.2.3.1ALTER procedure SP_GET_OST_PRIH_PRICE_T  K 3SET TERM ^ ; CREATE OR ALTER procedure SP_GETKOEFTOVAR_NEW ( FK_TOVAR integer, CURRSKL integer, FK_FIRM integer, STOCK decimal(7,3), IFMINTHENMAX integer, DAY_TORG_MANUALLY integer = null) returns ( MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SOLD decimal(7,3)) as declare variable DNEY_ANALIZ integer; declare variable DNEY_ZAKAZ integer; declare variable CNT decimal(7,3); declare variable ROUND_DOST integer; BEGIN select first 1 minstock, mincnt, avgcnt, maxcnt, avgrash from bd_norma where fk_bd_tovar=:fk_tovar and fk_bd_firm=:currskl into :minstock, :mincnt, :avgcnt, :maxcnt, :avgrash; minstock=coalesce(minstock,0); mincnt=coalesce(mincnt,0); avgcnt=COALESCE(avgcnt,0); maxcnt=coalesce(maxcnt,0); select first 1 coalesce(dney_torg,0), coalesce(ROUND_MINPARTY,0), coalesce(dney_zakaz,0) from bd_firm where field_key=:fk_firm into :dney_torg, :round_dost, :dney_zakaz; if (:day_torg_manually is not null) then dney_torg=:day_torg_manually; /* select first 1 avg(cnt_sum) FROM (select case when coalesce(max(date_rash)-bd_11.date_prih,0)=0 then 0 else sum(bd_21.CNT)/coalesce(max(date_rash)-bd_11.date_prih,0) end as cnt_sum from BD_2 join bd_21 on bd_2.field_key=bd_21.FK_BD_2 join bd_11 on bd_11.field_key=bd_21.FK_BD_11 --join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where date_rash>(current_date-:dney_analiz) and bd_11.fk_bd_tovar=:fk_tovar and BD_2.fk_bd_firm=:currskl group by bd_11.date_prih) as rash into :avgrash; */ select first 1 coalesce(sum(bd_21.cnt),0) from BD_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where bd_21.fk_bd_tovar=:fk_tovar and bd_2.fk_bd_firm=:currskl and bd_2.cod_rash in (0,2,3) and bd_2.date_rash between (current_date-:dney_torg) and (current_date) into :sold; avgrash=coalesce(avgrash,0); select first 1 current_date-bd_11.date_prih from bd_11 where bd_11.valid_flag=1 and fk_bd_tovar=:fk_tovar and bd_11.fk_bd_firm=:currskl order by bd_11.date_prih desc into :dney_last; if ((ifminthenmax=1)and(stockmaxcnt)) then AVTOZAK=maxcnt; if (avtozak<0) then avtozak=0; SUSPEND; END^ SET TERM ; ^=16.2.3.1SP_GETKOEFTOVAR_NEWLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name do BEGIN cnt=0; self_stock=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select sum(coalesce(stock,0)) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) into :self_stock; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; END end else begin -- no specifications if ((sklad=1)and(transit=0)) then begin if (rezerv_allow=1) then begin for select bd_tovar.inplace,bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, bd_11.field_key, bd_11.cena_pr_with_nds, bd_11.cena_pr_without_nds, ed_izm_name, date_save, sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), --bd_tovar.field_key (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :date_save, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; cena_nds=0; cena_not_nds=0; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; end end end else begin -- no sklad for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name from bd_tovar where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/) and coalesce(bd_tovar.IS_old_flag,0)=0 order by name into :inplace ,:fk_bd_tovar, :name, :fullname, :ed_izm_name do BEGIN cnt=0; self_stock=0; cena_nds=0; cena_not_nds=0; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select sum(coalesce(stock,0)) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into self_stock; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold; suspend; END end end -- suspend; end^ SET TERM ; ^=16.2.3.1SP_GET_TOV_FOR_ZAK   5 i=?ALTER TABLE Z_IZL_CHECK ADD DATE_RASH DATE;>врем.хранения даты расходов при расчете излишек16.2.4.1Z_IZL_CHECK ADD DATE_RASH.  1SET TERM ^ ; CREATE OR ALTER procedure SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ integer) returns ( FK_BD_TOVAR integer, NAME char(100), CNT decimal(7,3), CENA_NDS decimal(12,5), CENA_NOT_NDS decimal(12,5), SUMMA_NDS decimal(12,5), SUMMA_NOT_NDS decimal(12,5), STOCK decimal(7,3), SELF_STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME char(200), INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, ED_IZM_NAME varchar(30), DATE_SAVE date, NEXT_AKC integer, SOLD decimal(7,3)) as declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from G zz [s1SET TERM ^ ; CREATE OR ALTER procedure SP_GET_STOCKWITHPR ( FK_TOVAR integer, FK_FIRM integer, DATE_PRIH date, DATE_PRIH_DO date = null) returns ( STOCK decimal(15,3)) as declare variable NORMA_MIN decimal(15,4); declare variable FK_CALC integer; declare variable FK_FIRM_PROD integer; declare variable NORMA_COMP decimal(15,4); declare variable FK_TOVAR_COMP integer; declare variable CNT_PR_PROD decimal(15,4); begin if (date_prih is null) then date_prih=current_date; select first 1 bd_calc.field_key, bd_calc.fk_bd_firm_prod, bd_calc.norma_min from bd_calc where bd_calc.fk_bd_tovar=:fk_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :fk_calc, :fk_firm_prod, :norma_min; if (date_prih_do is null) then select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm and bd_11.date_prih<=:date_prih and bd_11.fk_bd_tovar=:fk_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0 into :stock; else select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm and bd_11.date_prih between :date_prih and :date_prih_do and bd_11.fk_bd_tovar=:fk_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0 into :stock; stock=coalesce(:stock, 0); if (fk_calc is null) then begin suspend; exit; end if (fk_firm_prod is null) then fk_firm_prod=:fk_firm; /*tov = 0 bd_calc_component bd_11 fk_tov norma fk_tov stock 1 3 1 7 2 8 2 10 3 2 3 4 */ if (date_prih_do is null) then select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm_prod and bd_11.date_prih<=:date_prih and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/coalesce(norma,1)),0) from bd_calc_component where fk_calc=:fk_calc group by 1 order by 2 into :fk_tovar_comp, :cnt_pr_prod; --колво возможных производств исходя из мин остатков товара с зависимостью от нормы из ттк else select first 1 fk_bd_tovar, trunc(min((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_firm_prod and bd_11.date_prih between :date_prih and :date_prih_do and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0)/coalesce(norma,1)),0) from bd_calc_component where fk_calc=:fk_calc group by 1 order by 2 into :fk_tovar_comp, :cnt_pr_prod; --колво возможных производств исходя из мин остатков товара с зависимостью от нормы из ттк -- select sum(cc.norma) from bd_calc_component cc where cc.fk_calc=:fk_calc and cc.fk_bd_tovar=:fk_tovar_comp into :norma_comp; -- результат остатки с учетом автопроизводства без излишек stock=:stock+(coalesce(:norma_min,1)*coalesce(:cnt_pr_prod,0)); suspend; end^ SET TERM ; ^>остатки при расчете излишек16.2.4.1SP_GET_STOCKWITHPRd_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:nabor_fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=coalesce(:sumrazn*((:cnt*:nabor_cnt_dop)-:stock),0); razn=0; razn=coalesce((:cnt*:nabor_cnt_dop)-:stock,0); suspend; end -- edit with date_rash field if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:nabor_fktov and frmhandle=123 and date_rash=:datech; else update z_izl_check set cnt_in_stock=cnt_in_stock-(:cnt*:nabor_cnt_dop) where fk_tovar=:nabor_fktov and frmhandle=123 and date_rash=:datech; end end else begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:fktov and frmhandle=123 and zi.date_rash=:datech)) then begin select stock from sp_get_stockwithpr(:fktov,:fkfirm,:datech) into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, date_rash) values (:fktov,123,:stock, :datech); old_date_ch=:datech; end else begin select stock from sp_get_stockwithpr(:fktov,:fkfirm,:old_date_ch+1,:datech) into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock where zi.fk_tovar=:fktov and zi.frmhandle=123 and zi.date_rash=:datech; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:fktov and zi.frmhandle=123 and zi.date_rash=:datech into :stock; old_date_ch=:datech; end razn=0; if (:cnt>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :sumrazn; if (coalesce(sumrazn,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fkfirm where fk_bd_tovar=:fktov and valid_flag=1 order by nomer_spec into :sumrazn; sumrazn=:sumrazn*(:cnt-:stock); --coalesce((select first 1 bd_11.cena_pr_with_nds from bd_11 where bd_11.fk_bd_tovar=:fktov and bd_11.date_prih<=:datech order by field_key desc)*(:cnt-:stock),0); razn=0; razn=coalesce(:cnt-:stock,0); suspend; end if (razn>0) then update z_izl_check set cnt_in_stock=0 where fk_tovar=:fktov and frmhandle=123 and date_rash=:datech; else update z_izl_check set cnt_in_stock=cnt_in_stock-:cnt where fk_tovar=:fktov and frmhandle=123 and date_rash=:datech; end end END^ SET TERM ; ^>Расчет излишек16.2.4.1SP_GET_OUTOFSTOCK_CH22 ` ?C9SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OUTOFSTOCK_CH22 ( FKFIRM integer, WITHTODAY date) returns ( CNT decimal(7,3), NAME char(200), FKTOV integer, STOCK decimal(7,3), DATECH date, RAZN decimal(7,3), SUMRAZN decimal(12,5), FK_ZAMENA integer, NAME_ZAMENA varchar(100), ROZN_PRICE decimal(15,2), ROZN_PRICE_ZAMENA decimal(15,2), NABOR_FKTOV integer, EMKTOV decimal(7,3), FKTOV_MOD integer) as declare variable NABOR_CNT_DOP decimal(7,3); declare variable OLD_DATE_CH date; BEGIN rozn_price=0; rozn_price_zamena=0; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); if (exists(select frmhandle from z_izl_check where frmhandle=123)) then delete from z_izl_check zi where zi.frmhandle=123; for select sum(bd_ch21.cnt), bd_tovar.name, bd_ch21.fk_bd_tovar, bd_ch2.date_close, emktov from bd_ch2 join bd_ch21 on bd_ch21.fk_bd_ch2=bd_ch2.field_key join bd_tovar on bd_tovar.field_key=bd_ch21.fk_bd_tovar where bd_ch2.fk_bd_firm=:fkfirm and bd_ch21.accept_flag<>1 /* не учитывать товары с автопроизводством */ --and not exists(select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=bd_tovar.field_key and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0) and bd_ch2.date_open<=:withtoday group by 2,3,4,5 order by 3,4 into :cnt, :name, :fktov, :datech, :emktov do begin if ((emktov is null)or(emktov=0)) then emktov=1; cnt=:cnt/:emktov; nabor_fktov=null; if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fktov)) then begin for select n.fk_bd_tovar_dop, t.name, n.cnt_dop from bd_tovar_nabor n left join bd_tovar t on (t.field_key=n.fk_bd_tovar_dop) where n.fk_bd_tovar_master=:fktov into :nabor_fktov, :name, :nabor_cnt_dop do begin if (not exists(select zi.fk_tovar from z_izl_check zi where zi.fk_tovar=:nabor_fktov and zi.date_rash=:datech)) then begin select stock from sp_get_stockwithpr(:nabor_fktov,:fkfirm,:datech) into :stock; insert into z_izl_check (fk_tovar, frmhandle, cnt_in_stock, date_rash,CNT_RASH) values (:nabor_fktov,123,:stock, :datech, coalesce(:cnt*:nabor_cnt_dop,0)); old_date_ch=:datech; end else begin select stock from sp_get_stockwithpr(:nabor_fktov,:fkfirm, :old_date_ch+1,:datech) into :stock; update z_izl_check zi set zi.cnt_in_stock=zi.cnt_in_stock+:stock, zi.cnt_rash=zi.cnt_rash+coalesce(:cnt*:nabor_cnt_dop,0) where zi.fk_tovar=:nabor_fktov and zi.frmhandle=123 and zi.date_rash=:datech; select zi.cnt_in_stock from z_izl_check zi where zi.fk_tovar=:nabor_fktov and zi.frmhandle=123 and zi.date_rash=:datech into :stock; old_date_ch=:datech; end razn=0; if ((:cnt*:nabor_cnt_dop)>:stock) then begin sumrazn=0; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fkfirm and fk_bd_tovar=:nabor_fktov and valid_flag=1 order by date_prih desc, fk_bd_1 desc, fiel y D@y;  %A CREATE GENERATOR GEN_BD_EGAIS_DOCS_ID; CREATE TABLE BD_EGAIS_DOCS ( FIELD_KEY INTEGER NOT NULL, FK_BD_E_DOC_TYPES INTEGER NOT NULL, FK_DOC INTEGER, CAPTION VARCHAR(255), XML_FILE BLOB SUB_TYPE 0 SEGMENT SIZE 80, OUT_NUMBER INTEGER, IMPORT_DATE DATE DEFAULT current_date, IMPORT_TIME TIME DEFAULT current_time, IDENTITY VARCHAR(50), WBR_WBREGID VARCHAR(50), SHIPPER_NAME VARCHAR(200), CONSIGNEE_NAME VARCHAR(200), REPLY_ID VARCHAR(60) DEFAULT '', E_STATUS SMALLINT DEFAULT 0, WBR_WBNUMBER VARCHAR(50), WBR_WBDATE VARCHAR(50), WB_SHIPPINGDATE VARCHAR(50), FSRAR_ID VARCHAR(50), SHIPPER_FULLNAME VARCHAR(200), CONSIGNEE_FULLNAME VARCHAR(200) ); /******************************************************************************/ /*** Primary Keys ***/ /*******************************************************̈́ Wo3ALTER TABLE BD_FIRM ADD EG_SERVER VARCHAR(200) DEFAULT 'localhost' ; COMMENT ON COLUMN BD_FIRM.EG_SERVER IS 'сервер ЕГАИС'; ALTER TABLE BD_FIRM ADD EG_PORT INTEGER DEFAULT 8080 ; COMMENT ON COLUMN BD_FIRM.EG_PORT IS 'Порт ЕГАИС'; ALTER TABLE BD_FIRM ADD EG_FSRAR_ID VARCHAR(30); COMMENT ON COLUMN BD_FIRM.EG_FSRAR_ID IS 'FSRAR_ID ЕГАИС';@параметры ЕГАИС для склада16.2.15.1ALTER TABLE BD_FIRM` M _UPDATE BD_USERS_RIGHTS_NAME SET NAME = 'ТТК' where NAME_VAR = 'clc_card'; UPDATE BD_USERS_RIGHTS_NAME SET NAME = 'Проводка ТТК' where NAME_VAR = 'clc_card_valid_flag'; UPDATE BD_USERS_RIGHTS_NAME SET NAME = 'Удаление ТТК' where NAME_VAR = 'clc_card_delete';@16.2.15.1BD_USERS_RIGHTS_NAME Кальк в ТТКT a+SET TERM ^ ; CREATE OR ALTER trigger tr_stock_1_aiud for bd_stock_1 inactive after insert or update or delete position 0 AS BEGIN if (inserting) then begin if (new.DATE_MORNING2 and wbr_wbregid=:regid returning identity into :iden; update bd_egais_docs set e_status=1, wait_status=1 where fk_bd_e_doc_types=1 and e_status<>2 and identity=:iden; end END^ SET TERM ; ^AЕГАИС: установка накладным статуса "утверждена в ЕГАИС" по квитанциям16.2.22.1CREATE procedure SP_EG_SET_NAKL_STATUSES: IINSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (9, 'Запрос алк. продукции', 'QueryAP'); INSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (10, 'Запрос контрагента', 'QueryPartner');AЕГАИС: дополнение таблицы типов док-тов16.2.22.1INSERT INTO BD_EGAIS_DOC_TYPES+ 7W?ALTER TABLE BD_EGAIS_DOCS ADD WAIT_STATUS SMALLINT; COMMENT ON COLUMN BD_EGAIS_DOCS.WAIT_STATUS IS '1 - накладная помечена и ждет утверждения, 2 - помечена на отказ, 0 - не помечена'; ALTER TABLE BD_EGAIS_DOCS ALTER COLUMN WAIT_STATUS SET DEFAULT 0 ; ALTER TABLE BD_EGAIS_DOCS ADD TC_DOCID VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.TC_DOCID IS 'tc:DocID из док-тов Ticket'; ALTER TABLE BD_EGAIS_DOCS ADD TC_DOCTYPE INTEGER DEFAULT 1 ; COMMENT ON COLUMN BD_EGAIS_DOCS.TC_DOCTYPE IS 'по tc:DocType из Ticket находим код типа документа из BD_EGAIS_DOC_TYPES'; ALTER TABLE BD_EGAIS_DOCS ADD TC_COMMENT VARCHAR(255); COMMENT ON COLUMN BD_EGAIS_DOCS.TC_COMMENT IS 'tc:operationcomment или tc:comments, смотря что заполнено'; ALTER TABLE BD_EGAIS_DOCS ADD TC_CONCLUSION VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.TC_CONCLUSION IS 'tc:conclusion если есть, обычно для акта, а не накладной'; ALTER TABLE BD_EGAIS_DOCS ADD TC_OPERNAME VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.TC_OPERNAME IS 'tc:operationname'; ALTER TABLE BD_EGAIS_DOCS ADD TC_OPERRES VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.TC_OPERRES IS 'tc:operationresult';AЕГАИС: статусы ожидания у накладных, поля для Квитанций16.2.22.1ALTER TABLE BD_EGAIS_DOCS 9aupdate or INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('ЕГАИС', 'EGAIS', (select field_key from bd_users_rights_name where name_var='menu_retail')) matching (name_var);@ЕГАИС: права16.2.15.1update or INSERT INTO BD_USERS_RIGHTS_NAME suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and ( bd_11.FK_BD_FIRM=:id_sklad ) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END END END^ SET TERM ; ^A1. Исправления поиска ПЦ для ревизий16.2.22.1ALTER procedure SP_GET_REV_PRIH_PRICEfk_9); suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^A2. Исправления поиска ПЦ для ревизий16.2.22.1ALTER procedure SP_GET_OST_PRIH_PRICE IIB eSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE ( BY_MATRIX integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES (:fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real); END END^ SET TERM ; ^A3. Исправления поиска ПЦ для ревизий16.2.22.1ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICEv }WSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(200), CENA decimal(12,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(12,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=: y Q=[SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE_T ( ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT) as --DECLARE VARIABLE variable_name < datatype>; BEGIN --остатки по товару в приходных ценах for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN cena=0; --находим последнюю приходную цену select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; --устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 -- into :cnt_11; sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; fk_revsp=GEN_ID(GEN_BD_91_ID,1); suspend; END END^ SET TERM ; ^A4. Исправления в добавлении товара в ревизию в ПЦ16.2.22.1ALTER procedure SP_GET_OST_PRIH_PRICE_T 9 9  ;_qSET TERM ^ ; CREATE trigger bd_egais_docs_ad0 for bd_egais_docs active after delete position 0 AS begin delete from bd_egais_doc_replies where fk_edocs=old.field_key; end^ SET TERM ; ^ AЕГАИС: триггер очистки таблицы ответов при удалении док-в16.2.22.1CREATE trigger bd_egais_docs_ad0 for bd_egais_docsm -1sSET TERM ^ ; CREATE OR ALTER trigger bd_egais_docs_aiu0 for bd_egais_docs active after insert or update position 0 AS begin if (inserting) then begin insert into bd_egais_doc_replies (fk_edocs, reply_id, fk_bd_e_doc_types) values (new.field_key, new.reply_id, new.fk_bd_e_doc_types); end if (updating) then begin if (new.reply_id is distinct from old.reply_id) then insert into bd_egais_doc_replies (fk_edocs, reply_id, fk_bd_e_doc_types) values (new.field_key, new.reply_id, new.fk_bd_e_doc_types); end end^ SET TERM ; ^ AЕГАИС: триггер на заполнение таблицы ответов16.2.22.1CREATE trigger bd_egais_docs_aiu0 for bd_egais_docsP oOYCREATE INDEX BD_EGAIS_DOC_REPLIES_IDX1 ON BD_EGAIS_DOC_REPLIES (FK_EDOCS); ALTER TABLE BD_EGAIS_DOC_REPLIES ALTER COLUMN ADD_TIME SET DEFAULT current_timestamp ; AЕГАИС: индекс на таблицу ответов и время по умолчанию16.2.22.1CREATE INDEX BD_EGAIS_DOC_REPLIES_IDX1p kOCREATE GENERATOR GEN_BD_EGAIS_DOC_REPLIES_ID; CREATE TABLE BD_EGAIS_DOC_REPLIES ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER NOT NULL, REPLY_ID VARCHAR(60), ADD_TIME TIMESTAMP ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_DOC_REPLIES ADD CONSTRAINT PK_BD_EGAIS_DOC_REPLIES_1 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_DOC_REPLIES_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_DOC_REPLIES_BI FOR BD_EGAIS_DOC_REPLIES ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_BD_EGAIS_DOC_REPLIES_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_EGAIS_DOC_REPLIES.FK_EDOCS IS 'ссылка на BD_EGAIS_DOCS'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_DOC_REPLIES TO PUBLIC;AЕГАИС: таблица идентификаторов ответов16.2.22.1CREATE table BD_EGAIS_DOC_REPLIES $$W sSaCOMMENT ON COLUMN BD_EGAIS_DOCS.WAIT_STATUS IS '1 - накладная помечена и ждет утверждения, 2 - помечена на отказ, 3 - послан акт рассогласования, 0 - не помеч.';AЕГАИС: новый статус16.2.22.1COMMENT ON COLUMN BD_EGAIS_DOCS.WAIT_STATU MCREATE GENERATOR GEN_BD_EGAIS_FORMB_REGS_ID; CREATE TABLE BD_EGAIS_FORMB_REGS ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER NOT NULL, POSIT INTEGER, BREG_ID VARCHAR(50) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_FORMB_REGS ADD CONSTRAINT PK_BD_EGAIS_FORMB_REGS_1 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_FORMB_REGS_IDX1 ON BD_EGAIS_FORMB_REGS (FK_EDOCS); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_FORMB_REGS_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_FORMB_REGS_BI FOR BD_EGAIS_FORMB_REGS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_BD_EGAIS_FORMB_REGS_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_EGAIS_FORMB_REGS.FK_EDOCS IS 'ссылка на BD_EGAIS_DOCS'; COMMENT ON COLUMN BD_EGAIS_FORMB_REGS.POSIT IS '№ позиции в справке Б'; COMMENT ON COLUMN BD_EGAIS_FORMB_REGS.BREG_ID IS ''; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_FORMB_REGS TO PUBLIC; AЕГАИС: таблица разделов Справок формы Б16.2.22.1CREATE table BD_EGAIS_FORMB_REGSr K ALTER TABLE BD_EGAIS_DOCS DROP CAPTION; ALTER TABLE BD_EGAIS_DOC_REPLIES ADD FK_BD_E_DOC_TYPES INTEGER; COMMENT ON COLUMN BD_EGAIS_DOC_REPLIES.FK_BD_E_DOC_TYPES IS 'ссылка на BD_EGAIS_DOC_TYPES'; AЕГАИС: добавление и удаление полей16.2.22.1ALTER table BD_EGAIS_DOCS; ALTER table BD_EGAIS_DOC_REPLIES > %?ALTER TABLE BD_EGAIS_DOCS ADD FK_SKLAD INTEGER; COMMENT ON COLUMN BD_EGAIS_DOCS.FK_SKLAD IS 'Ссылка на BD_FIRM'; CREATE INDEX BD_EGAIS_DOCS_IDX2 ON BD_EGAIS_DOCS (FK_SKLAD);BЕГАИС: деление хранилища по складам16.2.25.1ALTER TABLE BD_EGAIS_DOCS; k5MCREATE GENERATOR GEN_BD_EGAIS_NAKL_FACTS_ID; CREATE TABLE BD_EGAIS_NAKL_FACTS ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER NOT NULL, POSIT INTEGER, FACT INTEGER ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_NAKL_FACTS ADD CONSTRAINT PK_BD_EGAIS_NAKL_FACTS_1 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_NAKL_FACTS_IDX1 ON BD_EGAIS_NAKL_FACTS (FK_EDOCS); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_NAKL_FACTS_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_NAKL_FACTS_BI FOR BD_EGAIS_NAKL_FACTS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_BD_EGAIS_NAKL_FACTS_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_EGAIS_NAKL_FACTS.FK_EDOCS IS 'ссылка на BD_EGAIS_DOCS'; COMMENT ON COLUMN BD_EGAIS_NAKL_FACTS.POSIT IS '№ позиции в накладной'; COMMENT ON COLUMN BD_EGAIS_NAKL_FACTS.FACT IS 'фактическое кол-во, введенное в позицию накладной'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_NAKL_FACTS TO PUBLIC;AЕГАИС: храним фактические данные по накладной16.2.22.1CREATE TABLE BD_EGAIS_NAKL_FACTS_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt прихода)16.2.25.1SP_BD2_PROV Q~Q)" }9ALTER TABLE BD_TOVAR ADD TRACE_UNITAR_FLAG INT_DEF0; ALTER TABLE BD_TOVAR ADD TRACE_PROSLEJ_FLAG INT_DEF0; ALTER TABLE BD_TOVAR ADD TRACE_NERAZRIV_FLAG INT_DEF0;BГалочки трейсабилити в ассортименте16.2.25.1BD_TOVAR ADD TRACE_XXXe! ;a#SET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa from bd_2 where field_key=:fk ?@?}$ YMKSET TERM ^ ; CREATE OR ALTER trigger bd_egais_docs_ad0 for bd_egais_docs active after delete position 0 AS begin delete from bd_egais_doc_replies where fk_edocs=old.field_key; delete from bd_egais_formb_regs where fk_edocs=old.field_key; delete from bd_egais_nakl_facts where fk_edocs=old.field_key; end^ SET TERM ; ^BЕГАИС: дополнение триггера очистки связанных таблиц16.2.25.1ALTER trigger bd_egais_docs_ad0<# IgACREATE GENERATOR GEN_BD_EGAIS_REQS_ID; CREATE TABLE BD_EGAIS_REQS ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER NOT NULL, FK_BD_E_DOC_TYPES INTEGER NOT NULL, SENT SMALLINT DEFAULT 0, XML_FILE BLOB SUB_TYPE 0 SEGMENT SIZE 80, CREATE_DATE DATE DEFAULT current_date, CREATE_TIME TIME DEFAULT current_time, SENT_DATE DATE, SENT_TIME TIME ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_REQS ADD CONSTRAINT PK_BD_EGAIS_REQS_1 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_REQS_IDX1 ON BD_EGAIS_REQS (FK_EDOCS); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_REQS_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_REQS_BI FOR BD_EGAIS_REQS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_BD_EGAIS_REQS_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_EGAIS_REQS.FK_EDOCS IS 'ссылка на BD_EGAIS_DOCS'; COMMENT ON COLUMN BD_EGAIS_REQS.SENT IS '0 - исходящий, 1 - отправленный'; COMMENT ON COLUMN BD_EGAIS_REQS.FK_BD_E_DOC_TYPES IS 'ссылка на BD_EGAIS_DOC_TYPES'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_REQS TO PUBLIC;BЕГАИС: таблица исходящих16.2.25.1create table BD_EGAIS_REQS  ( UgESET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE2 ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=b߂/' ?ALTER TABLE BD_EGAIS_DOCS ADD DELETED SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_EGAIS_DOCS.DELETED IS 'Признак того, что документ "в корзине"';CЕГАИС: признак удаленного документа16.3.3.1ALTER TABLE BD_EGAIS_DOCSK& S}Aupdate RDB$RELATION_FIELDS set RDB$NULL_FLAG = NULL where (RDB$FIELD_NAME = 'FK_EDOCS') and (RDB$RELATION_NAME = 'BD_EGAIS_REQS') ; ALTER TABLE BD_EGAIS_REQS ADD FK_SKLAD INTEGER; COMMENT ON COLUMN BD_EGAIS_REQS.FK_SKLAD IS 'Ссылка на BD_FIRM'; CREATE INDEX BD_EGAIS_REQS_IDX2 ON BD_EGAIS_REQS (FK_SKLAD);CЕГАИС: правки структуры таблиц16.3.3.1update RDB$RELATION_FIELDSL% %!IINSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (11, 'Акт подтверждения накл.', NULL); INSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (12, 'Акт отказа от накл.', NULL); INSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (13, 'Акт расхождения накл.', NULL);BЕГАИС: дополнение табл. типов документов16.2.25.1INSERT INTO BD_EGAIS_DOC_TYPESd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6 FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and skl.field_key<>sup.field_key --кроме излишков and not(bd_1.cod_prih in (7,9,1,8)) --излишки и бонусы и товарообмен, приходы с пр-ва group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM UNION SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when (bd_2.cod_rash=4) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and rec.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1,8)) --излишки и бонусы и товарообмен, приходы с пр-ва group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM) as p group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6 do begin suspend; end END^ SET TERM ; ^CИсправление декларации 116.3.3.1ALTER procedure SP_ALC_MOVE2_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4,9)) ) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания и на пр-во) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения ,sum(case when (bd_2.cod_rash in (7)) then -bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and ((rec.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or (rec.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^CИсправление декларации 216.3.3.1ALTER procedure SP_ALC_MOVE_TRUE 11C) MgMSET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5), CNT_PRIH_VOZV decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK rr * OgYSET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE2_NO_SVERKA ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, ALC_VID_KOD, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6 FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and skl.field_key<>sup.field_key --кроме излишков and coalesce(sup.ALC_DECLARE_BY_SVERKA,0)=0 and not(bd_1.cod_prih in (7,9,1)) --излишки и бонусы и товарообмен group by bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD ) as p group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6 do begin suspend; end END^ SET TERM ; ^CИсправление декларации 316.3.3.1ALTER procedure SP_ALC_MOVE2_NO_SVERKAтип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else --((nac_matrix is null) or (trim(nac_matrix)='0') or (trim(nac_matrix)='')) then select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then exit; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена -- cenabase=round(:cenaprnew+((coalesce(:margin,0)/100)*:cenaprnew),2); ----[09.11.15] cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); if (:oldcenapr=0) then exit; --не засоряем журнал первыми приходами if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then exit; -- Если новая приходная цена не равна старой -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^Dcenarlog, часть116.3.6.1ALTER trigger bd_11_ai1 for bd_11 u+ _7OSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then exit; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then exit; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход является последним if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then exit; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then exit; -- insert into tmp(prim) values ('проверка на  { c_>1 ]i/ALTER TABLE BD_91 ADD OLD_COUNT_11 DECIMAL(12,3); COMMENT ON COLUMN BD_91.OLD_COUNT_11 IS 'Значение для сравнения докум. остатков после перевода чеков в расход';FРабота с чеками в ревизии16.3.12.1ALTER TABLE BD_91s0 UiALTER TABLE BD_TOVAR ADD IMPORT_ALC_FLAG SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_TOVAR.IMPORT_ALC_FLAG IS 'Признак импортного алкоголя для отчетов';E[У Огурца есть]Признак импортного алкоголя для отчетов16.3.10.1[У Огурца есть]ALTER table BD_TOVAR / )_SET TERM ^ ; CREATE OR ALTER trigger bd_selful_au0 for bd_selful active after update position 0 AS begin update bd_firm set bd_firm.inn=new.ow_inn where bd_firm.fk_selful=new.field_key; update bd_firm set bd_firm.kpp=new.kpp where bd_firm.fk_selful=new.field_key; -- update bd_firm set bd_firm.kpp_sklad=new.kpp_struct where bd_firm.fk_selful=new.field_key; update bd_firm set bd_firm.ogrn=new.ogrn where bd_firm.fk_selful=new.field_key; update bd_firm set bd_firm.okpo=new.okpo where bd_firm.fk_selful=new.field_key; update bd_firm set bd_firm.okonh=new.okonh where bd_firm.fk_selful=new.field_key; update bd_firm set bd_firm.uaddr=new.ow_adres where bd_firm.fk_selful=new.field_key; end^ SET TERM ; ^EУбрали смену КПП складов при правке юрлица16.3.10.1ALTER trigger bd_selful_au0 for bd_selful4. s77CREATE DOMAIN ZAMETKA AS VARCHAR(200) CHARACTER SET WIN1251 COLLATE WIN1251 ; COMMENT ON DOMAIN ZAMETKA IS 'для полей примечаний'; update RDB$RELATION_FIELDS set RDB$FIELD_SOURCE = 'ZAMETKA' where (RDB$FIELD_NAME = 'PRIM') and (RDB$RELATION_NAME = 'KS_1') ;DУдлиняем поле примечания в платежке до 200 симв.16.3.6.1CREATE DOMAIN ZAMETKA\- mAUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('auto_rise_cenar', '0', 'Автоматически поднимать расходную цену при увеличении приходной') MATCHING (paramname)Dauto_rise_cenar, глобальная опция16.3.6.1INSERT INTO GLOBAL_OPTIONS, Y7mSET TERM ^ ; CREATE OR ALTER trigger bd_cenar_log_aiu0 for bd_cenar_log active after insert or update position 0 AS begin if ((updating)and((new.modifytype=1)and(old.modifytype<>1))) then insert into bd_cpr (fk_bd_tovar, fk_bd_cena, cena, last_date, last_time, operator, workplace, fk_bd_operation,cena_pr) values (new.fk_bd_tovar, new.fk_bd_cena, new.cenanew, current_date, current_time, (select first 1 bd_users.field_key from bd_users where upper(bd_users.login)=upper(current_user)), 'cenar_log',0,new.cenaprnew); if ((inserting) and (new.modifytype=1)) then insert into bd_cpr (fk_bd_tovar, fk_bd_cena, cena, last_date, last_time, operator, workplace, fk_bd_operation,cena_pr) values (new.fk_bd_tovar, new.fk_bd_cena, new.cenanew, current_date, current_time, (select first 1 bd_users.field_key from bd_users where upper(bd_users.login)=upper(current_user)), 'cenar_log',0,new.cenaprnew); end^ SET TERM ; ^Dcenarlog, часть216.3.6.1ALTER trigger bd_cenar_log_aiu0 for bd_cenar_log  4 '5SET TERM ^ ; CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN d%3 3SET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declared2 qq]SET TERM ^ ; create or alter procedure SP_UPD_COUNT_11_BD_91_3 ( ID_REVISION integer) as declare variable STOCK decimal(12,3); declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable MAS_RB integer; declare variable MAS_LB integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable FK_BD_GRP_TOVAR integer; declare variable FK_BD_FIRM integer; declare variable FK_SMENA integer; declare variable DATE_REV date; begin select fk_bd_firm, coalesce(fk_bd_grp_tovar, 0) as fk_bd_grp_tovar, in_prih_price, fk_bd_cena, fk_bd_smena, date_rev from bd_9 where field_key = :id_revision into :fk_bd_firm, :fk_bd_grp_tovar, :in_prih_price, :fk_bd_cena, :fk_smena, :date_rev; -- update bd_91 set count_11 = 0 where fk_bd_9 = :id_revision; for select fk_bd_tovar from bd_91 where fk_bd_9 = :id_revision into :fk_bd_tovar do begin stock=0; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:fk_bd_firm and date_morning<=:date_rev into :stock; stock=coalesce(stock,0); update bd_91 set old_count_11=count_11, count_11=:stock where fk_bd_9=:id_revision and fk_bd_tovar=:fk_bd_tovar; end end^ SET TERM ; ^FНовая хранимка пересчета ревизии - запоминает старые значения16.3.12.1create procedure SP_UPD_COUNT_11_BD_91_3 variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, fk_bd_tovar_mod, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, fk_bd_tovar_mod, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :fk_tovar_mod, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, null, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :fk_tovar_mod, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^Fправка привязок расходов к чекам16.3.12.1SP_CH_TO_RASH_22_OPecimal(15,2)) as declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем переещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END^ SET TERM ; ^Fавтопроизв16.3.12.1SP_AVTOPR }5  aSET TERM ^ ; create or alter procedure SP_FILL_91DATECNT_saveold ( ID_9 integer, SET_REAL integer = 0) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, COUNT_11 type of column BD_STOCK_1.CNT) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; if (id_91 is distinct from null) then begin update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, old_count_11=count_11, count_11=:count_11 where field_key=:id_91; if (set_real=1) then update bd_91 set count_real=:count_11 where field_key=:id_91; end end END^ SET TERM ; ^GНовая хранимка для чеков в ревизии16.3.16.1create procedure SP_FILL_91DATECNT_SAVEOLD O6 3SSET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_dolg for bd_1 active before update position 0 AS declare variable summa_real decimal(15,2); declare variable summa_vozvrat decimal(15,2); declare variable summa_opl decimal(15,2); declare variable fk_11 integer; declare variable cena_pr decimal(8,2); BEGIN if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin new.DOLGFROMDATE=new.DATE_PRIH+iif(new.COD_PRIH in (2),coalesce(new.DAY_CONS_PRIH,0),0); --сумма по документу new.SUMMA=coalesce((select sum(summa_with_nds) from bd_11 where fk_bd_1=new.FIELD_KEY),0); if (not(coalesce(new.COD_PRIH,0) in (7,8,9,1))) then --не: излишки, бонусный товар, товарообмен, пр-во begin --сумма возвратов summa_vozvrat=0; --по коду реализация возвраты раньше не считали --[18.09.2015] возвраты вообще не влияют на сумму долга по документу /*$$IBEC$$ for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_vozvrat=summa_vozvrat +cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21 where p.cod_rash=5 and fk_recipient=new.FK_SUPPLIER),0); end $$IBEC$$*/ --сумма оплат summa_opl=coalesce((select sum(summa) from ks_11 where fk_bd_1=new.FIELD_KEY),0); new.SUMMA_DOLG=new.SUMMA-summa_vozvrat-summa_opl; end /*$$IBEC$$ else begin new.summa=0; --сумма реализации summa_real=0; if (new.cod_prih=3) then --реализация --[18.09.2015] приравнено к консигнации begin for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_real=summa_real+cena_pr*coalesce((SELECT sum(bd_21.CNT) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21),0); end end $$IBEC$$*//*$$IBEC$$ if (new.cod_prih=1) then --реализация РЦ --[18.09.2015] убрано begin for select bd_11.FIELD_KEY, cena_pr_with_nds from bd_11 where fk_bd_1=new.FIELD_KEY into :fk_11, :cena_pr do begin summa_real=summa_real+coalesce((SELECT sum(bd_21.SUMMA) FROM SP_GET_PARENT_FK21_LAST(:fk_11) p join bd_21 on bd_21.FIELD_KEY=p.FK_BD_21),0); end end $$IBEC$$*//*$$IBEC$$ --сумма оплат summa_opl=coalesce((select sum(summa) from ks_11 where fk_bd_1=new.FIELD_KEY),0); new.SUMMA_DOLG=summa_real-summa_opl; end $$IBEC$$*/ end update bd_2 set summa_dolg=new.SUMMA_DOLG where fk_bd_1_6=new.FIELD_KEY; if ((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0)) then begin new.DOLGFROMDATE=new.DATE_PRIH+iif(new.COD_PRIH in (2),coalesce(new.DAY_CONS_PRIH,0),0); new.SUMMA_DOLG=0; --coalesce(new.SUMMA_DOLG,0)-new.SUMMA; [06.11.15] end if (new.cod_prih in (7,8,9,1)) then --излишки, бонусный товар, товарообмен, пр-во begin new.dolgfromdate=null; new.summa_dolg=0; end END^ SET TERM ; ^GИсправление смены даты долга при смене кода Прихода с консигнации на реализацию16.3.16.1ALTER trigger tr_bd_1_dolg for bd_1   < K/ALTER TABLE BD_11 ADD EG_ID_SPRB VARCHAR(50); COMMENT ON COLUMN BD_11.EG_ID_SPRB IS 'ЕГАИС: ID раздела Б справки по ТТН';IЕГАИС: импорт приходов, продолжение16.4.4.1ALTER TABLE BD_11; I1SET TERM ^ ; CREATE OR ALTER trigger tr_bd_2_date_nakl for bd_2 active before insert or update position 4 AS BEGIN /* if (not(old.DATE_RASH is distinct from new.DATE_RASH) --дата расхода изменилась and(old.DATE_rash is distinct from new.DATE_NAKL ) --дата накладной равна старой дате расхода and(old.DATE_NAKL is distinct from new.DATE_NAKL)) then --дата накладной не менялась new.DATE_NAKL=new.DATE_RASH; --тогда выравниваем дату накладной по дате расхода */ if ((inserting)or((new.DATE_NAKL=old.DATE_NAKL)and(new.DATE_rash is distinct from old.DATE_RASH))) then new.DATE_NAKL=new.DATE_RASH; if ( (inserting) or (new.nomer_NAKL is null) ) then begin new.nomer_nakl=(select n_rash_nakl+1 from bd_selful where bd_selful.field_key=new.fk_selful); if (new.nomer_NAKL is null) then new.nomer_NAKL=new.nomer_RASH; update bd_selful set n_rash_nakl=n_rash_nakl+1 where field_key=new.fk_selful and n_rash_nakl is not null; end END^ SET TERM ; ^Hне обн ном накл в юл если он нулл16.3.23.1 tr_bd_2_date_naklA: + Cupdate bd_users_rights_name set parent=0 where trim(upper(name_var))='EGAIS'HПеренос ЕГАИС в корень дерева прав16.3.23.1update bd_users_rights_name$9 {3COMMENT ON COLUMN BD_FIRM.EG_FSRAR_ID IS 'У склада для соединения с ЕГАИС'; ALTER TABLE BD_FIRM ADD EG_CLIENTREGID VARCHAR(30); COMMENT ON COLUMN BD_FIRM.EG_CLIENTREGID IS 'ФСРАР ID поставщиков ЕГАИС'; ALTER TABLE BD_TOVAR ADD EG_ALCCODE VARCHAR(64); COMMENT ON COLUMN BD_TOVAR.EG_ALCCODE IS 'Уникальный код товара в ЕГАИС';HЕГАИС подготовка к импорту приходов16.3.23.1ALTER table BD_FIRM%8 S%IINSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (14, 'Запрос Справки А', 'QueryFormA'); INSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (15, 'Справка А', 'ReplyFormA');HДополнение списка типов документов ЕГАИС16.3.23.1insert into BD_EGAIS_DOC_TYPESV7 GGALTER TABLE BD_CALC_COMPONENT ADD TRACK_FLAG SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_CALC_COMPONENT.TRACK_FLAG IS 'Сборная ТТК: Если на одном из компонентов устанавливаем этот флаг - на остальных компонентах он снимается. Если ниодного флага не стоит, готовому изделию будет сгенерирован новый трек'; ALTER TABLE BD_CALC_COMPONENT ADD TRACK_VARIANT SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_CALC_COMPONENT.TRACK_VARIANT IS 'Разборная ТТК: Товар не прослеживается, Создать новый трек, Использовать трек сырья';HADD TRACK_FLAG, TRACK_VARIANT16.3.23.1ALTER table BD_CALC_COMPONENTfrom bd_11 where fk_bd_1=new.field_key and stock>0 and cod_prih<>8 into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поздних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7 do begin --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2 from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2 do begin if ((stock>0)and(cnt_21<=stock)) then begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7 do begin --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2 from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2 do begin if ((stock>0)and(cnt_21<=stock)) then begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^Iкомпенсация излишек: не учитывать приход с производства16.4.4.1tr_bd_1_check_7 l 2lBC A /SET TERM ^ ; CREATE OR ALTER trigger tr_bd_21_fk_tovar for bd_21 active before insert position 0 AS DECLARE VARIABLE fk_tovar integer; DECLARE VARIABLE nds integer; DECLARE VARIABLE cena_pr type of column bd_21.CENA_PR; declare variable track_11 type of column bd_11.track_11; BEGIN select first 1 fk_bd_tovar, nds, cena_pr_with_nds, track_11 from bd_11 where field_key=new.FK_BD_11 into :fk_tovar, :nds, :cena_pr, :track_11; new.FK_BD_TOVAR=:fk_tovar; new.nds=:nds; new.CENA_PR=cena_pr; new.track_21=:track_11; END^ SET TERM ; ^Iзаполнение track_21 расхода из прихода16.4.4.1tr_bd_21_fk_tovarKB I)SET TERM ^ ; CREATE OR ALTER trigger bd_11_track_11 for bd_11 active before insert position 20 AS declare variable trace_flag integer; declare variable track_21_6 type of column bd_21.track_21; begin select coalesce(bd_tovar.trace_proslej_flag,0) from bd_tovar where field_key=new.fk_bd_tovar into :trace_flag; if (trace_flag=1) then begin /* if (exists(select field_key from bd_2 where fk_bd_1_6 = new.fk_bd_1)) then begin new.track_11 end*/ if (new.track_11 is null) then begin new.track_11=lpad(cast(gen_id(track_key,1) as varchar(20)), 20,'0'); end end end^ SET TERM ; ^Iгенерация track_11 для прихода (пока без внутр.перемещ.)16.4.4.1bd_11_track_11>A uO3CREATE SEQUENCE TRACK_KEY; ALTER TABLE BD_11 ADD TRACK_11 VARCHAR(30); CREATE INDEX BD_11_IDX4 ON BD_11 (TRACK_11); ALTER TABLE BD_21 ADD TRACK_21 VARCHAR(30); CREATE INDEX BD_21_IDX1 ON BD_21 (TRACK_21);Iполя трейсабилити16.4.4.1traceability_fieldsK@ 1 SSET TERM ^ ; CREATE OR ALTER trigger bd_operat_bi for bd_operat active before insert position 0 as begin if (new.key_field is null) then new.key_field = gen_id(gen_bd_operat_id,1); new.field_key = new.key_field; end^ SET TERM ; ^I16.4.4.1триггер операторовw?]1]update bd_operat set field_key=key_fieldIЛеха-леха.16.4.4.1update bd_operat set field_key=key_fieldY>k 7ALTER TABLE BD_OPERAT ADD FIELD_KEY INTEGER;I16.4.4.1ALTER TABLE BD_OPERAT =  [+SET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_check_7 for bd_1 active after update position 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на остатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select field_key, fk_bd_tovar, fk_bd_tovar_mod, stock, cena_pr_with_nds  (aH  /ALTER TABLE BD_91 ADD CNT_IZL DECIMAL(12,3); COMMENT ON COLUMN BD_91.CNT_IZL IS 'Излишки за период';LИзлишки за ревизионный период 116.4.13.1ALTER TABLE BD_91uG  CSET TERM ^ ; CREATE OR ALTER procedure ROUND_RCENA ( FK_BD_TOVAR integer not null, CENA type of column BD_21.CENA_WITH_NDS) returns ( ROUNDEDCENA type of column BD_21.CENA_WITH_NDS) as declare variable STEP_R type of column BD_ROUND.STEP_ROUND; declare variable KOP type of column BD_21.CENA_WITH_NDS; declare variable MINCENA type of column BD_TOVAR.MINCENA; declare variable R_TYPE type of column BD_ROUND.ROUND_TYPE; declare variable TMP_MATH_ROUNDED type of column BD_21.CENA_WITH_NDS; begin if (cena is null) then cena=0; select coalesce(bd_tovar.mincena,0) from bd_tovar where field_key=:fk_bd_tovar into :mincena; if (mincena>0) then if (mincena>:cena) then cena=:mincena; roundedcena=:cena; select first 1 step_round, coalesce(minus_kop,0), coalesce(ROUND_TYPE,0) from BD_ROUND where :roundedcena between min_predel and max_predel order by min_predel into :step_r, :kop, :r_type; tmp_math_rounded=round(:roundedcena/iif(coalesce(coalesce(:step_r,0),0)=0,1,coalesce(:step_r,1)),0)*coalesce(:step_r,1); -- 1 - округляем в меньшую сторону, 2 - в большую, иначе математически, отбрасываем заданное число копеек if ((:r_type=1) and (:tmp_math_rounded>:roundedcena)) then tmp_math_rounded=tmp_math_rounded-step_r; if ((:r_type=2) and (:tmp_math_rounded<:roundedcena)) then tmp_math_rounded=tmp_math_rounded+step_r; roundedcena=tmp_math_rounded-(:kop/100); if (roundedcena<0) then roundedcena=0; suspend; end^ SET TERM ; ^JИсправление процедуры округления16.4.7.1ALTER procedure ROUND_RCENAF KaWSET TERM ^ ; CREATE OR ALTER trigger tr_cpr_round for bd_cpr active before insert or update position 0 AS /*DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer;*/ declare variable rcena decimal(8,2); BEGIN /* округляем расходную цену*/ /*select coalesce(bd_tovar.mincena,0) from bd_tovar where field_key=new.fk_bd_tovar into :mincena; if (mincena>0) then if (mincena>new.cena) then new.cena=:mincena; val=coalesce(new.CENA,0); select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; new.cena=val;*/ select roundedcena from round_rcena(new.fk_bd_tovar, coalesce(new.cena,0)) into :rcena; new.cena=:rcena; END^ SET TERM ; ^JИсправление окргуления расх. цен в при добавлении их в BD_CPR16.4.7.1ALTER trigger tr_cpr_round for bd_cpr?E ! KALTER TABLE BD_TOVAR ADD KASSA_EDIT_PRICE_FLAG BOOLFIELD DEFAULT 0 ; Iполе признак редактир.цен на кассе16.4.4.1KASSA_EDIT_PRICE_FLAG BOOLFIELDD U5SET TERM ^ ; CREATE OR ALTER trigger tr_bd_11_setcashcena for bd_11 active after insert or update position 0 AS BEGIN if (coalesce(old.CENA_PR_WITH_NDS,0)<>coalesce(new.CENA_PR_WITH_NDS,0)) THEN update bd_tovar set BD_TOVAR.LAST_CENA_PR=coalesce(new.CENA_PR_WITH_NDS,0) where field_key=new.fk_bd_tovar and BD_TOVAR.LAST_CENA_PR<>coalesce(new.CENA_PR_WITH_NDS,0); END^ SET TERM ; ^ Iактивация заполнения посл прих цены16.4.4.1tr_bd_11_setcashcena  I 3YSET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_BY_9 ( ID_9 integer, SET_REAL integer = 0) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, CNT_IZL type of column BD_91.CNT_IZL, COUNT_11 type of column BD_STOCK_1.CNT) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and (bd_1.date_prih between :bd and :ed) and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tov and bd_1.fk_bd_firm=:skl into :cnt_izl; if (id_91 is distinct from null) then begin update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, count_11=:count_11, cnt_izl=:cnt_izl where field_key=:id_91; if (set_real=1) then update bd_91 set count_real=:count_11 where field_key=:id_91; end end END^ SET TERM ; ^LИзлишки за ревизионный период 216.4.13.1ALTER procedure SP_FILL_91DATECNT_BY_9 $J c_SET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_SAVEOLD ( ID_9 integer, SET_REAL integer = 0) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, CNT_IZL type of column BD_91.CNT_IZL, COUNT_11 type of column BD_STOCK_1.CNT) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tov and bd_1.fk_bd_firm=:skl into :cnt_izl; if (id_91 is distinct from null) then begin update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, old_count_11=count_11, count_11=:count_11, cnt_izl=:cnt_izl where field_key=:id_91; if (set_real=1) then update bd_91 set count_real=:count_11 where field_key=:id_91; end end END^ SET TERM ; ^LИзлишки за ревизионный период 316.4.13.1ALTER procedure SP_FILL_91DATECNT_SAVEOLD }K [SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE_T ( ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, CNT_IZL type of column BD_91.CNT_IZL, OST_BEGIN type of column BD_STOCK_1.CNT) as --DECLARE VARIABLE variable_name < datatype>; BEGIN --остатки по товару в приходных ценах for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN cena=0; --находим последнюю приходную цену select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; --устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 -- into :cnt_11; sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tovar and bd_1.fk_bd_firm=:id_sklad into :cnt_izl; fk_revsp=GEN_ID(GEN_BD_91_ID,1); suspend; END END^ SET TERM ; ^LИзлишки за ревизионный период 416.4.13.1ALTER procedure SP_GET_OST_PRIH_PRICE_T nnM wqCUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('track_prefix', '31337', 'Префикс кодов трейсабилити') MATCHING (PARAMNAME);LПрефикс кодов трейсабилити16.4.13.1GLOBAL_OPTIONS track_prefixqL [SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE_T ( ID_CENA integer, ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, CNT_IZL type of column BD_91.CNT_IZL, OST_BEGIN type of column BD_STOCK_1.CNT) as declare variable IS_OPT integer; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 for select bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena do break; end ELSE BEGIN --bd_cpr for select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena do break; END sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tovar and bd_1.fk_bd_firm=:id_sklad into :cnt_izl; fk_revsp=GEN_ID(GEN_BD_91_ID,1); -- устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 into :cnt_11; suspend; END END^ SET TERM ; ^LИзлишки за ревизионный период 516.4.13.1ALTER procedure SP_GET_OST_RASH_PRICE_T e eO S'%SET TERM ^ ; CREATE OR ALTER trigger bd_2_ins_1_6 for bd_2 active before insert or update position 3 AS declare variable fk1_6 integer; declare variable fk21 integer; declare variable fkuser integer; declare variable price_nds integer; declare variable skl integer; declare variable fktov integer; declare variable priority integer; declare variable nds integer; declare variable date_save date; declare variable date_make date; declare variable gtd varchar(26); declare variable cena_nds decimal(12,5); declare variable cena_nonds decimal(12,5); declare variable summa_nds decimal(12,5); declare variable summa_w_nds decimal(12,5); declare variable summa_wo_nds decimal(12,5); declare variable cnt_ decimal(7,3); declare variable inplace decimal(7,3); declare variable articul varchar(20); declare variable newcod_prih type of column bd_1.cod_prih; declare variable newfk_11_6 integer; declare variable summa_21 decimal(12,5); declare variable man_flag integer; declare variable fk_supplier_6 integer; declare variable fk_bd_11_6_main integer; declare variable fk_bd_21_6 integer; declare variable track_21 type of column bd_21.track_21; begin /* Trigger text */ --приход по расходу уже есть, обрабатываем смену кода расхода, даты расхода, юр.лица получателя, юр.лица отправителя if ((new.FK_BD_1_6 is not null)and((coalesce(old.COD_RASH,'0')<>coalesce(new.COD_RASH,'0'))or(coalesce(old.FK_SELFUL2,0)<>coalesce(new.FK_SELFUL2,0)) or(coalesce(old.DATE_RASH,'1.1.1800')<>coalesce(new.DATE_RASH,'1.1.1800'))or(coalesce(old.FK_SELFUL,0)<>coalesce(new.FK_SELFUL,0))or(coalesce(old.FK_BD_SMENA2,0)<>coalesce(new.FK_BD_SMENA2,0)))) then begin newcod_prih=coalesce((select min(COD_PRIH_6) from BD_COD_RASH where field_key=new.COD_RASH),'0'); update bd_1 set cod_prih=:newcod_prih, fk_selful_from=new.FK_SELFUL, fk_selful=new.FK_SELFUL2, date_prih=new.DATE_RASH, fk_bd_smena=new.FK_BD_SMENA2 where field_key=new.FK_BD_1_6; end --прихода по расходу еще нет и контрагент - не склад if ((new.cod_rash in ('0','1','2','3','8','6'))and((new.fk_bd_firm<>new.fk_recipient)or(coalesce(new.FK_BD_SMENA,0)<>coalesce(new.FK_BD_SMENA2,0)))and (new.fk_bd_1_6 is null)and(coalesce(new.VALID_FLAG,0)<>coalesce(old.VALID_FLAG,0))and(new.VALID_FLAG=1)) then BEGIN if (not exists(select coalesce(bd_firm.sklad,0) from bd_firm where bd_firm.field_key=new.fk_recipient and sklad=1)) then exit; ---------------------------------->>------------ select field_key from bd_users where upper(login)=upper(current_user) into fkuser; /* newcod_prih='0'; if (new.cod_rash='0') thwN )SET TERM ^ ; CREATE OR ALTER trigger bd_11_track_11 for bd_11 active before insert position 20 AS declare variable trace_flag integer; declare variable track_21_6 type of column bd_21.track_21; begin select coalesce(bd_tovar.trace_proslej_flag,0) from bd_tovar where field_key=new.fk_bd_tovar into :trace_flag; if (trace_flag=1) then begin /* if (exists(select field_key from bd_2 where fk_bd_1_6 = new.fk_bd_1)) then begin new.track_11 end*/ if (new.track_11 is null) then begin new.track_11=coalesce((select paramvalue from global_options where paramname='track_prefix'),'31337')||lpad(cast(gen_id(track_key,1) as varchar(20)), 20-char_length(coalesce((select paramvalue from global_options where paramname='track_prefix'),'31337')),'0'); end end end^ SET TERM ; ^Lгенерация кодов трейс с учетом префикса16.4.13.1bd_11_track_11en newcod_prih='0'; if (new.cod_rash='1') then newcod_prih='1'; if (new.cod_rash='2') then newcod_prih='2'; if (new.cod_rash='3') then newcod_prih='3'; if (new.cod_rash='8') then newcod_prih='4'; if (new.cod_rash='6') then newcod_prih='6'; */ newcod_prih=coalesce((select min(COD_PRIH_6) from BD_COD_RASH where field_key=new.COD_RASH),'0'); fk1_6=gen_id(gen_bd_1_id,1); /*UPDATE OR*/ INSERT INTO BD_1 ( FIELD_KEY /*INTEGER NOT NULL*/, FK_BD_FIRM /*INTEGER*/, NOMER_PRIH /*INTEGER*/, DATE_PRIH /*DATE*/, TIME_PRIH /*TIME*/, NOMER_NAKL /*CHAR(25)*/, DATE_NAKL /*DATE*/, NOMER_SF /*CHAR(25)*/, FK_SUPPLIER /*INTEGER*/, FK_FACE /*INTEGER*/, COD_PRIH /*CHAR(1)*/, DAY_CONS_PRIH /*INTEGER*/, DATE_SF /*DATE*/, POST_FLAG /*INTEGER*/, EXPORT_FLAG /*INTEGER*/, VALID_FLAG /*INTEGER*/, FK_BD_PFIRM /*INTEGER*/, FK_BD_USERS /*INTEGER*/, PRICE_NDS_FLAG/*BOOLFIELD BOOLFIELD = INTEGER */, FK_BD_SF_IN /*INTEGER*/, FK_SPS1 /*INTEGER*/, MARKER /*INTEGER NOT NULL*/, FK_SELFUL_FROM, FK_SELFUL, DATE_CONS, fk_bd_smena, COMM ) values (:fk1_6,new.fk_recipient,(select coalesce(max(nomer_prih)+1,1) from bd_1 where fk_bd_firm=new.fk_recipient), new.date_rash,current_time,new.nomer_rash,new.date_nakl,null,new.fk_bd_firm,new.fk_face,:newcod_prih,new.day_cons_rash,null, 0,0,0,new.fk_bd_pfirm,:fkuser,:price_nds,null, null, 0,new.fk_selful,new.fk_selful2,new.date_rash+new.day_cons_rash, new.FK_BD_SMENA2, new."COMMENT"); --matching () new.fk_bd_1_6=:fk1_6; if (updating) then begin --если это создание прихода при обновлении, то мы добавляем позиции в новый приход for select bd_11.fk_bd_tovar, bd_21.field_key, bd_21.cnt, bd_21.cena_with_nds, bd_21.CENA_WITHOUT_NDS, bd_11.NDS, bd_11.PRIORITY, bd_11.GTD, bd_11.ARTICUL, bd_11.INPLACE, bd_11.DATE_SAVE, bd_11.date_make, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, coalesce(bd_11.FK_SUPPLIER_6,bd_11.FK_SUPPLIER), coalesce(bd_11.fk_bd_11_6_main,bd_11.field_key), bd_21.field_key, bd_21.track_21 from bd_21 join bd_11 on bd_11.FIELD_KEY=bd_21.FK_BD_11 where fk_bd_2=new.FIELD_KEY into :fktov, :fk21, :cnt_, :cena_nds, :cena_nonds, :nds, :priority, :gtd, :articul, :inplace, :date_save, :date_make, :summa_21, :man_flag, :fk_supplier_6, :fk_bd_11_6_main, :fk_bd_21_6, :track_21 do begin summa_w_nds=(iif(man_flag=1,SUMMA_21,(cnt_*cena_nds))); --cnt_*cena_nds; summa_wo_nds=summa_w_nds/(100.00+nds)*100.00; summa_nds=summa_w_nds-summa_wo_nds; insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE, date_make, GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main,fk_bd_21_6, track_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make, :gtd, :cena_nds, :cena_nonds, :cnt_, :summa_w_nds,:summa_wo_nds,0,:inplace,:articul, :summa_nds, :fk_supplier_6, :fk_bd_11_6_main, :fk_bd_21_6, :track_21) returning (FIELD_KEY) into :newfk_11_6; update bd_21 set bd_21.fk_bd_11_6=:newfk_11_6 where bd_21.field_key=:fk21; track_21=null; end end ----------------------------------<<------------ END end^ SET TERM ; ^Lпередача кода трека по внутр.перемещениям16.4.13.1bd_2_ins_1_6  | R Y!SET TERM ^ ; CREATE OR ALTER trigger tr_ks1_del for ks_1 active after delete position 0 AS declare variable ks1 integer; BEGIN delete from ks_11 where fk_ks_1=old.FIELD_KEY and coalesce(is_zv,0)=0; update ks_11 set fk_ks_1=null, summa=0 where fk_ks_1=old.FIELD_KEY and coalesce(is_zv,0)=1; update bd_z set fk_ks_1_sales=null where fk_ks_1_sales=old.field_key; update bd_z set fk_ks_1_sales4=null where fk_ks_1_sales4=old.field_key; END^ SET TERM ; ^Mудаление привязок з отчета к оплате при удалении оплаты16.4.14.1tr_ks1_del,Q 3{#SET TERM ^ ; CREATE OR ALTER procedure SP_Z_TO_KS1 ( FK_DOC_OPL integer, VALID_FLAG integer = 0, CHECK_FLAGS integer = 1) as declare variable FK_BD_FIRM integer; declare variable FK_KS_SHET integer; declare variable FK_KS_SHET2 integer; declare variable FK_KS_KODI integer; declare variable PRIH integer; declare variable FK_KS_1 integer; declare variable AVTO_FLAG smallint; declare variable AVTO_FLAG_BEZNAL smallint; P -uUSET TERM ^ ; CREATE OR ALTER trigger tr_ks11_6_ad for ks_11 active after delete position 0 AS DECLARE VARIABLE fk_bd_1 integer; DECLARE VARIABLE fk_bd_2 integer; DECLARE VARIABLE fk_ks1 integer; DECLARE VARIABLE new_ks11 integer; BEGIN --удаление разнесения update ks_11 set NO_RAZNES_KS1=1 where FK_KS11_6=old.field_key; update ks_11 set NO_RAZNES_KS1=1 where field_key=old.FK_KS11_6; delete from ks_11 where FK_KS11_6=old.field_key; delete from ks_11 where field_key=old.FK_KS11_6; -- if (coalesce(old.NO_RAZNES_KS1,0)=0) then execute procedure SP_KS1_RAZNES(old.fk_ks_1); --убрали 13.04.16 END^ SET TERM ; ^MОтключили авторазнесение платежки при удалении одного платежа16.4.14.1ALTER trigger tr_ks11_6_ad for ks_11declare variable FK_KS_SHET_BEZNAL integer; declare variable SUMZ decimal(15,2); declare variable SUMZ4 decimal(15,2); declare variable DATEZ date; declare variable TIMEZ time; declare variable ISMANUALLY integer; declare variable FKKSSALES integer; declare variable FKKSSALES4 integer; declare variable COMMTXT varchar(30); begin if (valid_flag is null) then exit; select z.fk_bd_firm, z.date_z, z.time_z, z.revenue, z.revenue4, z.ismanually, z.fk_ks_1_sales, z.fk_ks_1_sales4, cast(z.kassa||'-'||z.nomer as varchar(30)) from bd_z z where z.field_key=:fk_doc_opl into :fk_bd_firm, :datez, :timez, :sumz, :sumz4, :ismanually, :fkksSales, :fkksSales4, :commtxt; select bd_firm.fk_ks_shet, AVTO_BD2_TO_KS1_FLAG, bd_firm.avto_bd2_beznal_to_ks1_flag, bd_firm.fk_ks_shet_beznal from bd_firm where field_key=:fk_bd_firm into :fk_ks_shet, :avto_flag, :avto_flag_beznal, :fk_ks_shet_beznal; if (fkkssales is not null) then delete from ks_1 where field_key=:fkkssales; if (fkkssales4 is not null) then delete from ks_1 where field_key=:fkkssales4; if (check_flags=1) then if ((coalesce(:AVTO_FLAG,0)=0)and(coalesce(:avto_flag_beznal,0)=0)and(coalesce(:ismanually,0)=0)) then exit; if ((:fk_ks_shet is null)and(:fk_ks_shet_beznal is null)) then exit; if (valid_flag=1) then begin -- проведение оплаты fk_ks_shet2=null; -- //входящая оплата prih=1; fk_ks_kodi=2; if (((coalesce(:AVTO_FLAG,0)=1)or(coalesce(:ismanually,0)=1)or(check_flags=0))and(sumz>0)and(fk_ks_shet is not null)) then begin fk_ks_1=gen_id(GEN_KS_1_ID,1); insert into KS_1 (field_key, prih, fk_bd_firm, fk_ks_kodi, fk_ks_schet, fk_ks_shet2, summa, date_create, time_create, oper_create,valid_flag, fk_bd_dogovor, fk_sklad, prim, comm) values (:fk_ks_1, :prih, 2, :fk_ks_kodi, :fk_ks_shet, :fk_ks_shet2, :sumz, :datez, :timez, (select field_key from bd_users where upper(login)=current_user) ,1, null, :fk_bd_firm,:commtxt,:commtxt); update bd_z set fk_ks_1_sales=:fk_ks_1 where field_key=:fk_doc_opl; end if (((coalesce(:avto_flag_beznal,0)=1)or(coalesce(:ismanually,0)=1)or(check_flags=0))and(sumz4>0)and(fk_ks_shet_beznal is not null)) then begin fk_ks_1=gen_id(GEN_KS_1_ID,1); insert into KS_1 (field_key, prih, fk_bd_firm, fk_ks_kodi, fk_ks_schet, fk_ks_shet2, summa, date_create, time_create, oper_create,valid_flag, fk_bd_dogovor, fk_sklad, prim, comm) values (:fk_ks_1, :prih, 2, :fk_ks_kodi, :fk_ks_shet_beznal, :fk_ks_shet2, :sumz4, :datez, :timez, (select field_key from bd_users where upper(login)=current_user) ,1, null, :fk_bd_firm,:commtxt,:commtxt); update bd_z set fk_ks_1_sales4=:fk_ks_1 where field_key=:fk_doc_opl; end end if (valid_flag=0) then begin -- распроведение /*$$IBEC$$ if (exists(select fk_bd_2 from ks_11 where fk_bd_2=:fk_doc_opl)) then begin for select field_key, fk_ks_1, summa from ks_11 where fk_bd_2=:fk_doc_opl into :fk_ks_11, :fk_ks_1, :sumks11 do begin select summa from ks_1 where field_key=:fk_ks_1 into :sumks1; if (sumks1=sumks11) then begin delete from ks_1 where field_key=:fk_ks_1; end else begin delete from ks_11 where field_key=:fk_ks_11; end end end $$IBEC$$*/ end end^ SET TERM ; ^Mкомент в оплате 'касса-номер з'16.4.14.1SP_Z_TO_KS1 B0B_V 33OALTER TABLE BD_PR_COMPONENT_TRACK ADD CNT_MAX DECIMAL(15,4); COMMENT ON COLUMN BD_PR_COMPONENT_TRACK.CNT_MAX IS 'Кол-во из трека - нужно для разрываемых партий';NКол-во из трека - нужно для разрываемых партий16.4.18.1ALTER TABLE BD_PR_COMPONENT_TRACKU %OCREATE INDEX BD_PR_COMPONENT_IDX1 ON BD_PR_COMPONENT (FK_TRACK);Nиндекс16.4.18.1CREATE INDEX BD_PR_COMPONENT_IDX1kT } CALTER TABLE BD_PR_COMPONENT ADD FK_TRACK INTEGER; COMMENT ON COLUMN BD_PR_COMPONENT.FK_TRACK IS 'Ссылка на последний привязанный трек - уже просто признак наличия хоть одного привязанного'; COMMENT ON COLUMN BD_PR_COMPONENT_TRACK.FK_CMP IS 'Ссылка на BD_PR_COMPONENT';Nсвязи между треками и компонентами16.4.18.1ALTER TABLE BD_PR_COMPONENT]S  UQCREATE GENERATOR GEN_BD_PR_COMPONENT_TRACK_ID; CREATE TABLE BD_PR_COMPONENT_TRACK ( FIELD_KEY INTEGER NOT NULL, FK_PR INTEGER, FK_BD_TOVAR INTEGER, CNT DECIMAL(15,4), FK_CMP INTEGER, NUMBER INTEGER, TRACK VARCHAR(30) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_PR_COMPONENT_TRACK ADD PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Foreign Keys ***/ /******************************************************************************/ ALTER TABLE BD_PR_COMPONENT_TRACK ADD CONSTRAINT FK_BD_PR_COMPONENT_TRACK_1 FOREIGN KEY (FK_BD_TOVAR) REFERENCES BD_TOVAR (FIELD_KEY) ON DELETE CASCADE; /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_PR_COMPONENT_TRACK_IDX1 ON BD_PR_COMPONENT_TRACK (FK_CMP); CREATE INDEX IDX_BD_PR_COMPONENT_TRACK1 ON BD_PR_COMPONENT_TRACK (FK_PR); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_PR_COMPONENT_TRACK_BI */ CREATE OR ALTER TRIGGER BD_PR_COMPONENT_TRACK_BI FOR BD_PR_COMPONENT_TRACK ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_PR_COMPONENT_TRACK_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_PR_COMPONENT_TRACK_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_PR_COMPONENT_TRACK_ID, new.FIELD_KEY-tmp); END END ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_PR_COMPONENT_TRACK TO PUBLIC;NТаблица BD_PR_COMPONENT_TRACK16.4.18.1create table BD_PR_COMPONENT_TRACK _w > L_q] o;/SET TERM ^ ; CREATE trigger bd_ch21_cena_cpr for bd_ch21 active before insert position 0 AS declare variable fk_cena integer; begin if (coalesce(new.cena_cpr,0)=0) then begin select fk_bd_cena_basic from bd_firm where field_key=(select fk_bd_firm from bd_ch2 where field_key=new.fk_bd_ch2) into :fk_cena; select first 1 cena from bd_cpr_now where fk_bd_tovar=new.fk_bd_tovar and fk_bd_cena=:fk_cena into new.cena_cpr; end end^ SET TERM ; ^Oпри вставке позиции в чек заполнять цену прайса16.4.21.1 bd_ch21_cena_cpru\oA5ALTER TABLE BD_CH21 ADD CENA_CPR DECIMAL(8,2);Oцена из прайса16.4.21.1BD_CH21 ADD CENA_CPR=[ %/ALTER TABLE BD_11 ADD PARENT_TRACK VARCHAR(30); COMMENT ON COLUMN BD_11.PARENT_TRACK IS 'Родительский трек';OPARENT_TRACK16.4.21.1ALTER TABLE BD_11Z oy5update bd_child_docs set sql='select a.FIELD_KEY, ''Акт производства № ''||a.nomer_pr, a.date_pr, a.fk_bd_firm, skl.NAME, null, null , iif(coalesce(a.valid_flag,0)=0,0,(SELECT coalesce( sum(bd_11.summa_with_nds), 0 ) FROM bd_pr join bd_1 on bd_pr.fk_bd_1=bd_1.field_key join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_pr.field_key=:fk_parent)) as sum_by_prih , a.VALID_FLAG from BD_PR a join BD_FIRM skl on skl.FIELD_KEY=a.FK_BD_FIRM where a.FIELD_KEY=:fk_parent' where (doc_type=6) and (fk_parent is null)NОтображение связей акта пр-ва16.4.18.1update bd_child_docs Y a#SET TERM ^ ; CREATE OR ALTER trigger bd_21_biud2 for bd_21 active before insert or update or delete position 30 AS declare variable cr char(1); declare variable fk1_6 integer; declare variable fktov integer; declare variable priority integer; declare variable nds integer; declare variable date_save date; declare variable date_make date; declare variable gtd varchar(26); declare variable cena_pr_nds decimal(12,5); declare variable cena_pr_wo_nds decimal(12,5); declare variable inplace decimal(7,3); declare variable articul varchar(20); declare variable cnt decimal(7,3); declare variable stock decimal(7,3); declare variable fk11 integer; declare variable new_fk_11_6 integer; declare variable fk_supplier_6 integer; declare variable fk_bd_11_6_main integer; declare variable new_cnt_11 decimal(7,3); dec5X }ssCOMMENT ON COLUMN BD_CALC_COMPONENT.TRACK_FLAG IS 'Сборная ТТК, продолжаем трек: 0 нет, 1 продолжить, 2 наследовать'; COMMENT ON COLUMN BD_CALC_COMPONENT.TRACK_VARIANT IS 'Разборная ТТК: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья';Nварианты наследования в ТТК16.4.18.1варианты наследования в ТТКW WgCALTER TABLE BD_PR_COMPONENT ADD NORMA_REQ DECIMAL(15,4); COMMENT ON COLUMN BD_PR_COMPONENT.NORMA_REQ IS 'Сколько требуется компонента для заданного кол-ва продукта';NСколько требуется компонента для заданного кол-ва продукта16.4.18.1ALTER TABLE BD_PR_COMPONENTlare variable fk_1_izl integer; declare variable fk_recipient integer; declare variable date_prih date; declare variable no_izlish_flag integer; begin if ((inserting)or(updating)) then select fk_bd_1_6 from bd_2 where field_key=new.fk_bd_2 into :fk1_6; if (fk1_6 is not null) then begin if ((inserting)or(updating)) then begin select bd_11.fk_bd_tovar, bd_11.priority,bd_11.nds,bd_11.date_save,bd_11.date_make, bd_11.gtd, bd_11.inplace,bd_11.articul, coalesce(bd_11.FK_SUPPLIER_6, bd_11.FK_SUPPLIER), coalesce(fk_bd_11_6_main,bd_11.FIELD_KEY) from bd_11 where field_key=new.fk_bd_11 into :fktov,:priority,:nds,:date_save,:date_make,:gtd,:inplace,:articul, :fk_supplier_6, :fk_bd_11_6_main; cena_pr_nds=new.cena_with_nds; cena_pr_wo_nds=new.cena_without_nds; end if (inserting) then begin insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE,date_make,GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main, fk_bd_21_6, track_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make,:gtd,:cena_pr_nds,:cena_pr_wo_nds,new.cnt, (iif(new.SUM_INPUT_MAN_FLAG=1,new.SUMMA,(new.cnt*:cena_pr_nds))),(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*100),0,:inplace, :articul,(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*:nds), :fk_supplier_6, :fk_bd_11_6_main, new.FIELD_KEY, new.track_21 ) RETURNING (FIELD_KEY) into :new_fk_11_6; new.fk_bd_11_6=:new_fk_11_6; end if (updating) then begin fk11=null; select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0), bd_11.FK_BD_FIRM, bd_11.date_prih from bd_11 where ((field_key=new.fk_bd_11_6)and(fk_bd_1=:fk1_6)) into :fk11, :cnt, :stock, :fk_recipient, :date_prih; /* if (fk11 is null) then select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0) from bd_11 where ((fk_bd_1=:fk1_6) and (fk_bd_tovar=:fktov) and (cnt=old.cnt)) into :fk11, :cnt, :stock; */ if ((:cnt-:stock)>new.cnt) then begin --если мы меняем количество на меньшее, чем возможно, то -- 0) проверяем, разрешены ли излишки по данному товару -- 1) выносим эту позицию в излишки -- 2) в приход вставляем новую позицию, в ней кол-во=колво из расхода, в расходе ссылку на новую позицию select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fktov into :NO_IZLISH_FLAG; if (no_izlish_flag=1) then exception E_ZAPRET_IZLISH; if (fk_1_izl is null) then begin fk_1_izl=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG) VALUES (:fk_1_izl, :fk_recipient,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_recipient), :date_prih,current_time, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ','RU')), :date_prih, :fk_recipient, 7, (select TR_NAME from SP_TRANSLATE('Излишки по перемещению','RU')), 1, (select field_key from BD_USERS where upper(login)=current_user), 1); end new_cnt_11=cnt-stock; update bd_11 set fk_bd_1=:fk_1_izl, cnt=:new_cnt_11, summa_with_nds=cena_pr_with_nds*:new_cnt_11, summa_without_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*100.00, summa_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*nds, fk_supplier_6=:fk_recipient, fk_bd_11_6_main=null where field_key=:fk11; insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE,date_make,GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main, fk_bd_21_6,track_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make,:gtd,:cena_pr_nds,:cena_pr_wo_nds,new.cnt, (iif(new.SUM_INPUT_MAN_FLAG=1,new.SUMMA,(new.cnt*:cena_pr_nds))),(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*100),0,:inplace, :articul,(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*:nds), :fk_supplier_6, :fk_bd_11_6_main, new.FIELD_KEY, new.track_21 ) RETURNING (FIELD_KEY) into :new_fk_11_6; new.fk_bd_11_6=:new_fk_11_6; end else --если все хорошо, просто меняем количество update bd_11 set cnt=new.cnt, NDS=:nds, CENA_PR_with_nds=:cena_pr_nds, cena_pr_without_nds=:cena_pr_wo_nds, summa_with_nds=(iif(new.SUM_INPUT_MAN_FLAG=1,new.SUMMA,(new.cnt*:cena_pr_nds))), summa_without_nds=(new.cnt*:cena_pr_nds/(100+:nds)*100), summa_nds=(new.cnt*:cena_pr_nds-(new.cnt*:cena_pr_nds/(100+:nds)*100)), fk_supplier_6=:fk_supplier_6, fk_bd_11_6_main=:fk_bd_11_6_main where ((field_key=:fk11) and (fk_bd_1=:fk1_6) and (fk_bd_tovar=:fktov) and (cnt=:cnt) and (stock=:stock)); end end if (deleting) then begin select fk_bd_1_6 from bd_2 where field_key=old.fk_bd_2 into :fk1_6; if (fk1_6 is not null) then begin --select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0) from bd_11 where (field_key=old.FK_BD_11_6) --into :fk11, :cnt, :stock; select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0), bd_11.FK_BD_FIRM, bd_11.date_prih from bd_11 where ((field_key=old.fk_bd_11_6)and(fk_bd_1=:fk1_6)) into :fk11, :cnt, :stock, :fk_recipient, :date_prih; if (:cnt<>:stock) then --exception E_BD_21_6_DELETE; begin --если мы меняем количество на меньшее, чем возможно, то -- 0) проверяем, разрешены ли излишки по данному товару -- 1) выносим эту позицию в излишки select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fktov into :NO_IZLISH_FLAG; if (no_izlish_flag=1) then exception E_ZAPRET_IZLISH; if (fk_1_izl is null) then begin fk_1_izl=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG) VALUES (:fk_1_izl, :fk_recipient,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_recipient), :date_prih,current_time, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ','RU')), :date_prih, :fk_recipient, 7, (select TR_NAME from SP_TRANSLATE('Излишки по перемещению','RU')), 1, (select field_key from BD_USERS where upper(login)=current_user), 1); end new_cnt_11=cnt-stock; update bd_11 set fk_bd_1=:fk_1_izl, cnt=:new_cnt_11, summa_with_nds=cena_pr_with_nds*:new_cnt_11, summa_without_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*100.00, summa_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*nds, fk_supplier_6=:fk_recipient, fk_bd_11_6_main=null where field_key=:fk11; end else delete from bd_11 where (field_key=:fk11) and (fk_bd_1=:fk1_6); end end end^ SET TERM ; ^Nчтоб при перепроведении расх вн.перемещ не терялись треки16.4.18.1bd_21_biud2  K K1^ O/[SET TERM ^ ; CREATE OR ALTER procedure SP_EG_SET_NAKL_STATUSES as declare variable REGID type of column BD_EGAIS_DOCS.WBR_WBREGID; declare variable IDEN type of column BD_EGAIS_DOCS.IDENTITY; declare variable tmpid integer; BEGIN FOR select wbr_wbregid from bd_egais_docs where fk_bd_e_doc_types=4 and tc_doctype=1 and tc_opername containing 'confirm' and tc_operres containing 'accepted' order by field_key asc into :regid do begin for select field_key, identity from bd_egais_docs where fk_bd_e_doc_types=2 and e_status<>2 and wbr_wbregid=:regid into tmpid, iden do begin update bd_egais_docs set e_status=1, wait_status=1 where --fk_bd_e_doc_types=2 and e_status<>2 and wbr_wbregid=:regid and field_key=:tmpid; --returning identity into :iden update bd_egais_docs set e_status=1, wait_status=1 where fk_bd_e_doc_types=1 and e_status<>2 and identity=:iden; end end END^ SET TERM ; ^PЕГАИС: новая процедура озеленения накладных16.4.26.1ALTER procedure SP_EG_SET_NAKL_STATUSESскаем suspend внутреннего расхода и на пр-во, чтобы отобразить только приход end for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS do begin suspend; end end end if (DTYPE_IN=2) then begin for select 1, bd_1.cod_prih , (select TR_NAME from SP_TRANSLATE('Приход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_prih where field_key=bd_1.cod_prih),:lang)) , bd_1.field_key, bd_11.field_key, bd_1.nomer_prih, bd_1.date_prih, bd_1.fk_bd_firm , skl.name, sup.name , bd_tovar.name, fk_bd_tovar, cnt, cena_pr_with_nds, summa_with_nds, track_11, parent_track , coalesce(bd_1.valid_flag,0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar join bd_firm skl on skl.field_key=bd_1.fk_bd_firm join bd_firm sup on sup.field_key=bd_1.fk_supplier where ( (BD_11.track_11=:track_in) or (bd_11.parent_track=:track_in and bd_1.cod_prih=8) -- с пр-ва ) and ( (bd_11.fk_bd_21_6=:d11id_in) or (bd_1.field_key in (select fk_bd_1 from bd_pr where fk_bd_2=:did_in))) order by bd_1.date_prih, bd_1.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS do begin id=cast(dtype as varchar(15))||'_'||cast(d11id as varchar(15)); if (dcod_in not in (6,9)) then begin parent=id_in; suspend; end else begin parent=parent_in; if (dcod_in=6) then begin dname=(select TR_NAME from SP_TRANSLATE('Перемещение',:lang)); if (status_in=0) then status=0; if ((status_in<>0) and (status=0)) then status=3; --статус внутреннего перемещения "в пути" if ((status_in<>0) and (status=1)) then status=4; --статус внутреннего перемещения "проведено" end if (dcod_in=9) then begin dname=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); if (status=1) then status=4; --у прихода статус "проведено", если он с пр-ва end dnum=dnum_in||'/'||dnum; suspend; end for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS do begin suspend; end end end END^ SET TERM ; ^PХранимка отслеживания 116.4.26.1CREATE procedure SP_TRACE4 U_ cASET TERM ^ ; CREATE OR ALTER procedure SP_TRACE4 ( DTYPE_IN integer, DCOD_IN integer, DNAME_IN varchar(100), DID_IN integer, D11ID_IN integer, DNUM_IN varchar(30), DDATE_IN timestamp, DSKL_IN integer, DSKLNAME_IN varchar(100), SUPNAME_IN varchar(100), TNAME_IN varchar(100), TID_IN integer, CNT_IN decimal(7,3), CENA_IN decimal(12,5), SUMMA_IN decimal(12,5), TRACK_IN varchar(30), PTRACK_IN varchar(30), ID_IN varchar(15), PARENT_IN varchar(15), STATUS_IN integer) returns ( DTYPE integer, DCOD integer, DNAME varchar(100), DID integer, D11ID integer, DNUM varchar(30), DDATE timestamp, DSKL integer, DSKLNAME varchar(100), SUPNAME varchar(100), TNAME varchar(100), TID integer, CNT decimal(7,3), CENA decimal(12,5), SUMMA decimal(12,5), TRACK varchar(30), PTRACK varchar(30), ID varchar(15), PARENT varchar(15), STATUS integer ) as --declare variable PAR_D11ID integer; declare variable LANG varchar(2); BEGIN --в качестве входящих данных - любой приход или расход LANG=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); --если приход: --ищем все расходы с этого прихода, в т.ч. внутренние перемещения, на пр-во if (DTYPE_IN=1) then begin FOR select 2, bd_2.cod_rash , (select TR_NAME from SP_TRANSLATE('Расход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_rash where field_key=bd_2.cod_rash),:lang)) , bd_2.field_key, bd_21.field_key, bd_2.nomer_rash, bd_2.date_rash, bd_2.fk_bd_firm , skl.name, rec.name , bd_tovar.name, bd_21.fk_bd_tovar, bd_21.cnt, bd_21.cena_with_nds, bd_21.summa, bd_21.track_21, null , coalesce(bd_2.valid_flag,0) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 join bd_tovar on bd_tovar.field_key=bd_21.fk_bd_tovar join bd_firm skl on skl.field_key=bd_2.fk_bd_firm join bd_firm rec on rec.field_key=bd_2.fk_recipient where bd_21.track_21=:track_in and bd_21.fk_bd_11=:d11id_in order by bd_2.date_rash, bd_2.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS do begin id=cast(dtype as varchar(15))||'_'||cast(d11id as varchar(15)); parent=id_in; if (status=1) then status=2; --у расхода статус "отгружен" при проведённости if (dcod not in (6,9)) then begin suspend; end else begin --пропу ` UcASET TERM ^ ; CREATE OR ALTER procedure SP_TRACE3 ( TRACK_IN varchar(30)) returns ( DTYPE integer, DCOD integer, DNAME varchar(100), DID integer, D11ID integer, DNUM varchar(30), DDATE timestamp, DSKL integer, DSKLNAME varchar(100), SUPNAME varchar(100), TNAME varchar(100), TID integer, CNT decimal(7,3), CENA decimal(12,5), SUMMA decimal(12,5), TRACK varchar(30), PTRACK varchar(30), ID varchar(15), PARENT varchar(15), STATUS integer --0 черновик, 1 принят, 2 отгружен, 3 в пути, 4 проведено ) as declare variable TEMP_ID integer; declare variable LANG varchar(2); BEGIN --ищем Первый приход с учетом наследования пр-ва if (coalesce(track_in,'')='') then exit; LANG=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); select first 1 bd_11.field_key from bd_11 where ( (BD_11.track_11=:track_in) ) into temp_id; if (temp_id is null) then begin dname=(select TR_NAME from SP_TRANSLATE('Трек ',:lang))||track_in||(select TR_NAME from SP_TRANSLATE(' не обнаружен',:lang)); id=1; parent=null; suspend; exit; end track='0'; ptrack=track_in; while ((coalesce(:track,'')<>'') and (coalesce(:ptrack,'')<>'')) do begin select first 1 1, bd_1.cod_prih, (select TR_NAME from SP_TRANSLATE('Первый приход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_prih where field_key=bd_1.cod_prih),:lang)) , bd_1.field_key, bd_11.field_key, bd_1.nomer_prih, bd_1.date_prih, bd_1.fk_bd_firm , skl.name, sup.name , bd_tovar.name, fk_bd_tovar, cnt, cena_pr_with_nds, summa_with_nds, track_11, parent_track, coalesce(bd_1.valid_flag,0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar join bd_firm skl on skl.field_key=bd_1.fk_bd_firm join bd_firm sup on sup.field_key=bd_1.fk_supplier where not(bd_1.cod_prih in (6)) --не внутр. and ( (BD_11.track_11=:track_in) or (bd_11.parent_track=:track_in) ) order by bd_1.date_prih, bd_1.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS; if (ptrack is distinct from null) then track_in=ptrack; end if (:track is distinct from null) then begin id='1_'||cast(dcod as varchar(15)); parent=null; if (dcod=8) then if (status=1) then status=4; --у прихода статус "проведено", если он с пр-ва suspend; for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS do begin suspend; end end END^ SET TERM ; ^PХранимка отслеживания 216.4.26.1CREATE procedure SP_TRACE3ix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else --((nac_matrix is null) or (trim(nac_matrix)='0') or (trim(nac_matrix)='')) then select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then exit; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена -- cenabase=round(:cenaprnew+((coalesce(:margin,0)/100)*:cenaprnew),2); ----[09.11.15] cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); if (:oldcenapr=0) then exit; --не засоряем журнал первыми приходами if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then exit; -- Если новая приходная цена не равна старой -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:modifytype=1,:cenabase,:oldcenar)) matching (FK_BD_11, FK_BD_CENA); update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^Qзаполнять bd_11516.4.27.1trigger bd_11_ai1   Ta 3?/SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then exit; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then exit; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход является последним if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then exit; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then exit; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matr1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else --((nac_matrix is null) or (trim(nac_matrix)='0') or (trim(nac_matrix)='')) then select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then exit; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена -- cenabase=round(:cenaprnew+((coalesce(:margin,0)/100)*:cenaprnew),2); ----[09.11.15] cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then exit; -- Если новая приходная цена не равна старой -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:modifytype=1,:cenabase,:oldcenar)) matching (FK_BD_11, FK_BD_CENA); update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^QУстановка расходной цены при первом приходе товара16.4.27.1ALTER trigger bd_11_ai1 for bd_11 *b 3IOSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then exit; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then exit; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход является последним if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then exit; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then exit; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first  приход end for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS, :STOCK) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK do begin suspend; end end end if (DTYPE_IN=2) then begin for select 1, bd_1.cod_prih , (select TR_NAME from SP_TRANSLATE('Приход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_prih where field_key=bd_1.cod_prih),:lang)) , bd_1.field_key, bd_11.field_key, bd_1.nomer_prih, bd_1.date_prih, bd_1.fk_bd_firm , skl.name, sup.name , bd_tovar.name, fk_bd_tovar, cnt, cena_pr_with_nds, summa_with_nds, track_11, parent_track , coalesce(bd_1.valid_flag,0), bd_11.stock from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar join bd_firm skl on skl.field_key=bd_1.fk_bd_firm join bd_firm sup on sup.field_key=bd_1.fk_supplier where ( (BD_11.track_11=:track_in) or (bd_11.parent_track=:track_in and bd_1.cod_prih=8) -- с пр-ва ) and ( (bd_11.fk_bd_21_6=:d11id_in) or (bd_1.field_key in (select fk_bd_1 from bd_pr where fk_bd_2=:did_in))) order by bd_1.date_prih, bd_1.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS, STOCK do begin id=cast(dtype as varchar(15))||'_'||cast(d11id as varchar(15)); if (dcod_in not in (6,9)) then begin parent=id_in; suspend; end else begin parent=parent_in; if (dcod_in=6) then begin dname=(select TR_NAME from SP_TRANSLATE('Перемещение: ',:lang))||trim(supname)||'->'||trim(dsklname); if (status_in=0) then status=0; if ((status_in<>0) and (status=0)) then status=3; --статус внутреннего перемещения "в пути" if ((status_in<>0) and (status=1)) then status=4; --статус внутреннего перемещения "проведено" end if (dcod_in=9) then begin dname=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); if (status=1) then status=4; --у прихода статус "проведено", если он с пр-ва end dnum=dnum_in||'/'||dnum; suspend; end for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS, :STOCK) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK do begin suspend; end end end END^ SET TERM ; ^QДоработки отслеживания 116.4.27.1ALTER procedure SP_TRACE4 [[c g?SET TERM ^ ; CREATE OR ALTER procedure SP_TRACE4 ( DTYPE_IN integer, DCOD_IN integer, DNAME_IN varchar(100), DID_IN integer, D11ID_IN integer, DNUM_IN varchar(30), DDATE_IN timestamp, DSKL_IN integer, DSKLNAME_IN varchar(100), SUPNAME_IN varchar(100), TNAME_IN varchar(100), TID_IN integer, CNT_IN decimal(7,3), CENA_IN decimal(12,5), SUMMA_IN decimal(12,5), TRACK_IN varchar(30), PTRACK_IN varchar(30), ID_IN varchar(15), PARENT_IN varchar(15), STATUS_IN integer, STOCK_IN decimal(7,3)) returns ( DTYPE integer, DCOD integer, DNAME varchar(100), DID integer, D11ID integer, DNUM varchar(30), DDATE timestamp, DSKL integer, DSKLNAME varchar(100), SUPNAME varchar(100), TNAME varchar(100), TID integer, CNT decimal(7,3), CENA decimal(12,5), SUMMA decimal(12,5), TRACK varchar(30), PTRACK varchar(30), ID varchar(15), PARENT varchar(15), STATUS integer, STOCK decimal(7,3)) as --declare variable PAR_D11ID integer; declare variable LANG varchar(2); BEGIN --в качестве входящих данных - любой приход или расход LANG=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); --если приход: --ищем все расходы с этого прихода, в т.ч. внутренние перемещения, на пр-во if (DTYPE_IN=1) then begin FOR select 2, bd_2.cod_rash , (select TR_NAME from SP_TRANSLATE('Расход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_rash where field_key=bd_2.cod_rash),:lang)) , bd_2.field_key, bd_21.field_key, bd_2.nomer_rash, bd_2.date_rash, bd_2.fk_bd_firm , skl.name, rec.name , bd_tovar.name, bd_21.fk_bd_tovar, bd_21.cnt, bd_21.cena_with_nds, bd_21.summa, bd_21.track_21, null , coalesce(bd_2.valid_flag,0), null from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 join bd_tovar on bd_tovar.field_key=bd_21.fk_bd_tovar join bd_firm skl on skl.field_key=bd_2.fk_bd_firm join bd_firm rec on rec.field_key=bd_2.fk_recipient where bd_21.track_21=:track_in and bd_21.fk_bd_11=:d11id_in order by bd_2.date_rash, bd_2.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS, STOCK do begin id=cast(dtype as varchar(15))||'_'||cast(d11id as varchar(15)); parent=id_in; if (status=1) then status=2; --у расхода статус "отгружен" при проведённости if (dcod not in (6,9)) then begin suspend; end else begin --пропускаем suspend внутреннего расхода и на пр-во, чтобы отобразить тольк kd )g?SET TERM ^ ; CREATE OR ALTER procedure SP_TRACE3 ( TRACK_IN varchar(30)) returns ( DTYPE integer, DCOD integer, DNAME varchar(100), DID integer, D11ID integer, DNUM varchar(30), DDATE timestamp, DSKL integer, DSKLNAME varchar(100), SUPNAME varchar(100), TNAME varchar(100), TID integer, CNT decimal(7,3), CENA decimal(12,5), SUMMA decimal(12,5), TRACK varchar(30), PTRACK varchar(30), ID varchar(15), PARENT varchar(15), STATUS integer, STOCK decimal(7,3)) as declare variable TEMP_ID integer; declare variable LANG varchar(2); BEGIN --ищем Первый приход с учетом наследования пр-ва if (coalesce(track_in,'')='') then exit; LANG=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); select first 1 bd_11.field_key from bd_11 where ( (BD_11.track_11=:track_in) ) into temp_id; if (temp_id is null) then begin dname=(select TR_NAME from SP_TRANSLATE('Трек ',:lang))||track_in||(select TR_NAME from SP_TRANSLATE(' не обнаружен',:lang)); id=1; parent=null; suspend; exit; end track='0'; ptrack=track_in; while ((coalesce(:track,'')<>'') and (coalesce(:ptrack,'')<>'')) do begin select first 1 1, bd_1.cod_prih, (select TR_NAME from SP_TRANSLATE('Первый приход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_prih where field_key=bd_1.cod_prih),:lang)) , bd_1.field_key, bd_11.field_key, bd_1.nomer_prih, bd_1.date_prih, bd_1.fk_bd_firm , skl.name, sup.name , bd_tovar.name, fk_bd_tovar, cnt, cena_pr_with_nds, summa_with_nds, track_11, parent_track, coalesce(bd_1.valid_flag,0), bd_11.stock from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar join bd_firm skl on skl.field_key=bd_1.fk_bd_firm join bd_firm sup on sup.field_key=bd_1.fk_supplier where not(bd_1.cod_prih in (6)) --не внутр. and ( (BD_11.track_11=:track_in) or (bd_11.parent_track=:track_in) ) order by bd_1.date_prih, bd_1.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS, STOCK; if (ptrack is distinct from null) then track_in=ptrack; end if (:track is distinct from null) then begin id='1_'||cast(dcod as varchar(15)); parent=null; if (dcod=8) then if (status=1) then status=4; --у прихода статус "проведено", если он с пр-ва suspend; for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS, :STOCK) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK do begin suspend; end end END^ SET TERM ; ^QДоработки отслеживания 216.4.27.1ALTER procedure SP_TRACE3 a, :fk_bd_kassa; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остат ок сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_sav e, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврта',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt'||trim(dsklname); if (status_in=0) then status=0; if ((status_in<>0) and (status=0)) then status=3; --статус внутреннего перемещения "в пути" if ((status_in<>0) and (status=1)) then status=4; --статус внутреннего перемещения "проведено" end if (dcod_in=9) then begin dname=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); if (status=1) then status=4; --у прихода статус "проведено", если он с пр-ва end dnum=dnum_in||'/'||dnum; OFFSET=OFFSET_IN||' '; DNAME_EXCEL=OFFSET||DNAME; suspend; end for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK, LEVELL, DNAME_EXCEL, OFFSET from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS, :STOCK, :LEVELL, :DNAME_EXCEL, :OFFSET) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK, LEVELL, DNAME_EXCEL, OFFSET do begin suspend; end end end END^ SET TERM ; ^RЕще доработки отслеживания 116.5.6.1ALTER procedure SP_TRACE4CK varchar(30), PTRACK varchar(30), ID varchar(15), PARENT varchar(15), STATUS integer, STOCK decimal(7,3), LEVELL integer, DNAME_EXCEL varchar(250), OFFSET varchar(100) ) as declare variable TEMP_ID integer; declare variable LANG varchar(2); BEGIN --ищем Первый приход с учетом наследования пр-ва if (coalesce(track_in,'')='') then exit; LANG=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); select first 1 bd_11.field_key from bd_11 where ( (BD_11.track_11=:track_in) ) into temp_id; if (temp_id is null) then begin dname=(select TR_NAME from SP_TRANSLATE('Трек ',:lang))||track_in||(select TR_NAME from SP_TRANSLATE(' не обнаружен',:lang)); id=1; parent=null; levell=0; suspend; exit; end track='0'; ptrack=track_in; while ((coalesce(:track,'')<>'') and (coalesce(:ptrack,'')<>'')) do begin select first 1 1, bd_1.cod_prih, (select TR_NAME from SP_TRANSLATE('Первый приход: ',:lang))||(select TR_NAME from SP_TRANSLATE((select name from bd_cod_prih where field_key=bd_1.cod_prih),:lang)) , bd_1.field_key, bd_11.field_key, bd_1.nomer_prih, bd_1.date_prih, bd_1.fk_bd_firm , skl.name, sup.name , bd_tovar.name, fk_bd_tovar, cnt, cena_pr_with_nds, summa_with_nds, track_11, parent_track, coalesce(bd_1.valid_flag,0), bd_11.stock from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar join bd_firm skl on skl.field_key=bd_1.fk_bd_firm join bd_firm sup on sup.field_key=bd_1.fk_supplier where not(bd_1.cod_prih in (6)) --не внутр. and ( (BD_11.track_11=:track_in) or (bd_11.parent_track=:track_in) ) order by bd_1.date_prih, bd_1.field_key INTO DTYPE , DCOD, DNAME , DID , D11ID , DNUM , DDATE , DSKL , DSKLNAME, SUPNAME, TNAME , TID , CNT , CENA, SUMMA, TRACK, PTRACK, STATUS, STOCK; if (ptrack is distinct from null) then track_in=ptrack; end if (:track is distinct from null) then begin id='1_'||cast(dcod as varchar(15)); parent=null; if (dcod=8) then if (status=1) then status=4; --у прихода статус "проведено", если он с пр-ва levell=0; DNAME_EXCEL=DNAME; OFFSET=''; suspend; for select DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK, LEVELL, DNAME_EXCEL, OFFSET from sp_trace4(:DTYPE, :DCOD, :DNAME, :DID, :D11ID, :DNUM, :DDATE, :DSKL, :DSKLNAME, :SUPNAME , :TNAME, :TID, :CNT, :CENA, :SUMMA, :TRACK, :PTRACK, :ID, :PARENT, :STATUS, :STOCK, :LEVELL, :DNAME_EXCEL, :OFFSET) into DTYPE, DCOD, DNAME, DID, D11ID, DNUM, DDATE, DSKL, DSKLNAME, SUPNAME, TNAME, TID, CNT, CENA, SUMMA, TRACK, PTRACK, ID, PARENT, STATUS, STOCK, LEVELL, DNAME_EXCEL, OFFSET do begin suspend; end end END^ SET TERM ; ^RЕще доработки отслеживания 216.5.6.1ALTER procedure SP_TRACE3,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track)  then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены  end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Rпроведение производства с учетом треков16.5.6.1SP_CREATE_BY_PR j 4{j r qWKALTER TABLE BD_EGAIS_NAKL_FACTS ADD TO_RETURN INTEGER; COMMENT ON COLUMN BD_EGAIS_NAKL_FACTS.TO_RETURN IS 'Кол-во для возврата поставщику';SНовые поля для ЕГАИС16.5.16.1ALTER table BD_EGAIS_NAKL_FACTS5q m{{execute block as declare variable fk_11 integer; declare variable fk_cena integer; declare variable cena decimal(12,3); begin for select bd_11.field_key, bd_firm.fk_bd_cena_basic, bd_cpr_now.cena from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm join bd_cpr_now on bd_cpr_now.fk_bd_tovar=bd_11.fk_bd_tovar and bd_cpr_now.fk_bd_cena=bd_firm.fk_bd_cena_basic into :fk_11, :fk_cena, :cena do if (not(exists (select first 1 fk_bd_11, fk_bd_cena from bd_115 where fk_bd_11=:fk_11 and fk_bd_cena=:fk_cena))) then update or insert into bd_115 (fk_bd_11, fk_bd_cena, cena_with_nds) values (:fk_11, :fk_cena, :cena) matching (fk_bd_11, fk_bd_cena); endSЗаполнение bd_115 без перезаписи16.5.16.1Заполнение bd_115 без перезаписиHp {qSET TERM ^ ; CREATE OR ALTER trigger tr_bdcenarlog_round for bd_cenar_log active before insert or update position 1 AS /*DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; declare variable mincena decimal(8,2);*/ BEGIN /* округляем расходную цену*/ /* val=new.cenanew; select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; new.cenanew=val; */ new.cenanew=(select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,new.cenanew)); END^ SET TERM ; ^SНовое округление перед вставкой в Журнал расх. цен - подстраховка16.5.16.1ALTER trigger tr_bdcenarlog_round for bd_cenar_logfirm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья  cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((in_prih_cena=1)and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_ rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_!firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce(BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON GLOBAL_OPTIONS TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT EXECUTE ON PROCEDURE SP_TRANSLATE TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT ON BD_PR_ZAKAZ TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT ON BD_PR_ZAKAZ_PR TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,DELETE ON BD_PR_RESULTPROV TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,UPDATE ON BD_PR TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT ON BD_PR_PRODUCT TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,INSERT ON BD_2 TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,INSERT,UPDATE ON BD_1 TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,INSERT ON BD_11 TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,INSERT ON BD_22 TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT ON BD_TOVAR_ZAMENA TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT EXECUTE ON PROCEDURE SP_BD2_PROV TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT,UPDATE ON BD_21 TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT EXECUTE ON PROCEDURE SP_22_BY_21 TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT ON BD_PR_COMPONENT TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; GRANT SELECT ON BD_TOVAR TO PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_TTKRAZBOR TO SYSDBA;Sпроизводство по разборной ТТК16.5.16.1SP_CREATE_BY_PR_TTKRAZBOR#clare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_calc.is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then $begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end % --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^SПри проведении производства учет ТТК на разборность16.5.16.1SP_CREATE_BY_PR - a K-zz #sWSET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_)0y sWSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); (}x )sW SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; SUSPEND; --остатки по группе товаров в ук'/w +Q[ SET TERM ^ ; CREATE OR ALTER trigger bd_tovar_bi0 for bd_tovar active before insert position 0 AS declare variable allow_nds_0 varchar(100); begin if (new.field_key is null) then new.field_key=gen_id(gen_bd_tovar_id,1); -- if (new.oldkey is null) then new.oldkey=gen_id(gen_oldkey_id,1); if (new.date_create is null) then new.date_create=current_date; if (coalesce(new.nds,0)=0) then begin select first 1 paramvalue from global_options where paramname='allow_nds_value_0' into :allow_nds_0; allow_nds_0=coalesce(:allow_nds_0,'0'); if (allow_nds_0='0') then begin if (coalesce(new.nds,0)=0) then select nds_grp from SP_GET_NDS_GRP_TOVAR(new.fk_grt) into new.nds; if(coalesce(new.nds,0)=0) then new.nds=18; end end -- new.in_price_flag='1'; end^ SET TERM ; ^ SТриггеры для oldkey - 216.5.16.1ALTER trigger bd_tovar_bi0 for bd_tovarv _Qm SET TERM ^ ; CREATE OR ALTER trigger tr_bd_tovar_oldkey_iu for bd_tovar active before insert position 0 AS BEGIN if (new.oldkey is null) then new.oldkey=1; if (exists(select first 1 oldkey from bd_tovar where oldkey=new.oldkey)) then new.oldkey=1; while (exists(select first 1 oldkey from bd_tovar where oldkey=new.oldkey)) do new.oldkey=new.oldkey+1; END^ SET TERM ; ^SТриггеры для oldkey - 116.5.16.1ALTER trigger tr_bd_tovar_oldkey_iu for bd_tovaru  M+ SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); de"азанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 --and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_1.VALID_FLAG=1) -- and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=0; if (is_opt=1) THEN BEGIN --bd_115 select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=0; if (is_opt=1) THEN BEGIN --bd_115 select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END END END^ SET TERM ; ^ SЦены при создании ревизии - 116.5.16.1ALTER procedure SP_GET_REV_RASH_PRICE suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and ( bd_11.FK_BD_FIRM=:id_sklad ) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); -- suspend; END END END^ SET TERM ; ^ SЦены при создании ревизии - 216.5.16.1ALTER procedure SP_GET_REV_PRIH_PRICEsmena=(select fk_bd_smena from bd_9 where field_key=:fk_9); select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю расходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю расходную цену if (is_opt=1) THEN BEGIN --bd_115 select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena; end ELSE BEGIN --bd_cpr select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^ SЦены при создании ревизии - 316.5.16.1ALTER procedure SP_GET_OST_RASH_PRICEk_9); suspend; --остатки по группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.FK_BD_1 desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^ SЦены при создании ревизии - 416.5.16.1ALTER procedure SP_GET_OST_PRIH_PRICE 33X| QseSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE ( BY_MATRIX integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES (:fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real); END END^ SET TERM ; ^SЦены при создании ревизии - 516.5.16.1ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE6{ sW SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE ( ID_GRUPPA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(200), CENA decimal(12,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(12,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:f* gg} KseSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_RASH_PRICE ( BY_MATRIX integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в РАСхОДНЫх ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; select coalesce ( (select first 1 coalesce(BD_CPR_NOW.CENA,0) from BD_CPR_NOW where BD_CPR_NOW.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR_NOW.fk_bd_cena=:id_cena) ,0) from rdb$database into :cena; --ищем цену по заданному типу цены; если нету - то по последней приходной --и находим общее количество if (coalesce(:cena,0)=0) then begin select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES (:fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real); END END^ SET TERM ; ^SЦены при создании ревизии - 616.5.16.1ALTER procedure SP_GET_REV_MATRIX_RASH_PRICE gg~ Us[SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE_T ( ID_CENA integer, ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, CNT_IZL type of column BD_91.CNT_IZL, OST_BEGIN type of column BD_STOCK_1.CNT) as declare variable IS_OPT integer; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN cena=0; --находим последнюю приходную цену if (is_opt=1) THEN BEGIN --bd_115 for select bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena do break; end ELSE BEGIN --bd_cpr for select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena do break; END cena=coalesce(:cena,0); sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tovar and bd_1.fk_bd_firm=:id_sklad into :cnt_izl; fk_revsp=GEN_ID(GEN_BD_91_ID,1); -- устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 into :cnt_11; suspend; END END^ SET TERM ; ^SЦены при создании ревизии - 716.5.16.1ALTER procedure SP_GET_OST_RASH_PRICE_T w   QALTER TABLE BD_TOVAR ADD KASSA_SALE_OUTOFSTOCK BOOLFIELD DEFAULT 1 ; update bd_tovar set KASSA_SALE_OUTOFSTOCK=1;Sкасса продажа товара без остатков16.5.16.1BD_TOVAR ADD KASSA_SALE_OUTOFSTOCK _s[SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_PRIH_PRICE_T ( ID_SKLAD integer, ID_TOVAR integer, BD date, ED date) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, CNT_IZL type of column BD_91.CNT_IZL, OST_BEGIN type of column BD_STOCK_1.CNT) as --DECLARE VARIABLE variable_name < datatype>; BEGIN --остатки по товару в приходных ценах for select bd_tovar.field_key, bd_tovar.name from bd_tovar where bd_tovar.FIELD_KEY=:id_tovar order by 2 into :fk_bd_tovar, :name do BEGIN cena=0; --находим последнюю приходную цену select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; cena=coalesce(:cena,0); --устарело 18.01.2016 -- select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:id_tovar and valid_flag=1 and stock>0 -- into :cnt_11; sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tovar) AND (bd_1.fk_bd_firm=:id_sklad) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tovar) AND (bd_2.fk_bd_firm=:id_sklad) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tovar and fk_bd_firm=:id_sklad and date_morning<=:ed into :cnt_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tovar and bd_1.fk_bd_firm=:id_sklad into :cnt_izl; fk_revsp=GEN_ID(GEN_BD_91_ID,1); suspend; END END^ SET TERM ; ^SЦены при создании ревизии - 816.5.16.1ALTER procedure SP_GET_OST_PRIH_PRICE_T  e e =WSET TERM ^ ; CREATE OR ALTER trigger tr_115_round for bd_115 active before insert or update position 5 AS DECLARE VARIABLE rcena DECIMAL(8,2); --DECLARE VARIABLE step_r DECIMAL(8,2); --DECLARE VARIABLE kop integer; BEGIN /* округляем расходную цену*/ /* val=new.CENA_WITH_NDS; select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; new.CENA_WITH_NDS=val; */ select roundedcena from round_rcena((select fk_bd_tovar from bd_11 where bd_11.field_key=new.fk_bd_11), coalesce(new.cena_with_nds,0)) into :rcena; new.cena_with_nds=:rcena; END^ SET TERM ; ^TОкругление 11516.5.19.1ALTER trigger tr_115_round for bd_115into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:modifytype=1,:cenabase,:oldcenar)) matching (FK_BD_11, FK_BD_CENA); if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^TГлавный триггер по bd_1116.5.19.1ALTER trigger bd_11_ai1 for bd_11 WW ]OSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); skip_cenarlog=0; if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') 03are variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_f4irm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce(BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Tпроизводство разборной ттк цену для продуктов брать у компонента16.5.19.1SP_CREATE_BY_PR_TTKRAZBOR  m h  [QALTER TABLE BD_2 ADD IN_BD115_CENA BOOLFIELD DEFAULT 0 ;Uфлаг "цены брать из 115"16.5.22.1ALTER TABLE BD_2 ADD IN_BD115_CENAW  _?ALTER TABLE BD_EGAIS_DOCS ADD RETURNED_FLAG SMALLINT; COMMENT ON COLUMN BD_EGAIS_DOCS.RETURNED_FLAG IS 'По накладной есть возврат (0,1)'; ALTER TABLE BD_EGAIS_DOCS ALTER COLUMN RETURNED_FLAG SET DEFAULT 0 ;TЕГАИС: новые поля 19 мая16.5.19.1ALTER TABLE BD_EGAIS_DOCSB A5ALTER TABLE BD_PR ADD PR_IS_SBOR BOOLFIELD DEFAULT 1 ;Tпризнак сборности разборности акта производства16.5.19.1bd_pr add pr_is_sbor` 3CCALTER TABLE BD_11 ADD FK_A_SECTOR INTEGER; ALTER TABLE BD_11 ADD POS_X VARCHAR(10); ALTER TABLE BD_11 ADD POS_Y VARCHAR(10);Tбд_11 новый поля16.5.19.1бд_11 новый поля 7}?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); decl2 AA; K#SET TERM ^ ; CREATE OR ALTER procedure SP_22_BY_21 ( FK_BD_2 integer, WITH_FK_11 integer) as declare variable FK_21 integer; declare variable FK_22 integer; declare variable FK_TOVAR integer; declare variable FK_MOD integer; declare variable CNT decimal(7,3); /* type of column bd_22.CNT; */ declare variable CENA_WITH_NDS decimal(8,2); /* type of column bd_22.CENA_WITH_NDS; */ declare variable CENA_WITHOUT_NDS decimal(8,2); /* type of column bd_22.CENA_WITHOUT_NDS; */ declare variable FK_11 integer; declare variable FK_BD_ORDER_OUT_11 integer; declare variable NDS integer; declare variable NAME_CENA varchar(10); declare variable FK_CENA integer; declare variable IN_PRIH_CENA integer; declare variable SUMMA_21 decimal(15,2); declare variable SUMMA_MAN integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable IN_115_CENA integer; BEGIN select coalesce(bd_2.IN_PRIH_CENA,0),coalesce(bd_2.in_bd115_cena,0) from bd_2 where field_key=:fk_bd_2 into :in_prih_cena, :in_115_cena; select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY join bd_2 on bd_2.FK_BD_FIRM=BD_Firm.FIELD_KEY where bd_2.FIELD_KEy=:FK_BD_2 into :fk_cena, :name_cena; if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd_2)) then begin update bd_21 set fk_bd_22=null where fk_bd_2=:fk_bd_2 and fk_bd_22 is not null; delete from bd_22 where fk_bd_2=:fk_bd_2; end for select bd_21.field_key, bd_21.fk_bd_tovar, bd_21.fk_bd_tovar_mod , (case when (coalesce(:with_fk_11,0)=0) then null else bd_21.fk_bd_11 end), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_with_nds,bd_11.CENA_PR_WITH_NDS)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_without_nds, bd_11.CENA_PR_WITHOUT_NDS)), bd_21.cnt, -- sum(bd_21.cnt), bd_11.nds, bd_21.FK_BD_ORDER_OUT_11, iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds*bd_21.cnt, iif(((:in_prih_cena=1)and(bd_21.CNT=bd_11.CNT)),bd_11.SUMMA_WITH_NDS,bd_21.SUMMA)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), 0, iif((:in_prih_cena=1) and (bd_21.cena_with_nds<>bd_11.CENA_PR_WITH_NDS), 0, bd_21.SUM_INPUT_MAN_FLAG)), bd_21.CNT_IN_INPLACE -- max(bd_11.NDS) from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 left join bd_115 on bd_115.fk_bd_11=bd_11.field_key where bd_21.fk_bd_2=:fk_bd_2 -- group by 1,2,3,4,5,6 into :fk_21, :fk_tovar, :fk_mod, :fk_11, :cena_with_nds, :cena_without_nds,:cnt, :nds,:FK_BD_ORDER_OUT_11, :summa_21, :summa_man, :cnt_in_inplace do begin cnt=abs(cnt); fk_22=gen_id(GEN_BD_22_ID,1); if (coalesce(with_fk_11,0)=0) then fk_11=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, FK_BD_ORDER_OUT_11, NDS, FK_BD_11, CNT, summa, SUM_INPUT_MAN_FLAG, cnt_in_inplace) VALUES (:fk_22,:FK_BD_2,:FK_TOVAR,:FK_MOD,:cena_with_nds,:cena_without_nds,:FK_BD_ORDER_OUT_11,:NDS,:FK_11,:cnt, :summa_21, :summa_man, :cnt_in_inplace); update bd_21 set fk_bd_22=:fk_22, cena_without_nds=:cena_without_nds, cena_with_nds=:cena_with_nds, SUM_INPUT_MAN_FLAG=:summa_man where field_key=:fk_21; end update bd_2 set bd_2.name_ifs=(case when (cod_rash in (4,5,6,9)) then 'В прих.ценах' else 'По цене '||:name_cena end), bd_2.FK_CENA_RASH=(case when (cod_rash in (4,5,6,9)) then null else :fk_cena end), bd_2.IN_PRIH_CENA=(case when (cod_rash in (4,5,6,9)) then 1 else 0 end) where field_key=:fk_bd_2 and name_ifs is null; update bd_2 set valid_flag=1 where field_key=:fk_bd_2; END^ SET TERM ; ^USP_22_BY_21 учет цен 11516.5.22.1SP_22_BY_218; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --прове9ряем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set :date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0))) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat,current_time, :izlishki, null, null, :fk_supplier, :fk_face, :fk_cod_prih, null, null, null, 0, 0, 1, null, :id_user, 1, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_real,0)-coalesce(count_11,0), cena, --излишки BD_TOVAR.NDS, gtd, articul, inplace from bd_91 join bd_tovar on bd_tovar.field_key=bd_91.FK_BD_TOVAR where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))>0 into :fk_bd_tovar, :cnt, :cena, :NDS_tovar, :gtd, :articul, :inplace do BEGIN --находим сроки годности из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:id_skl and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; --заполняем приход INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, ARTICUL,date_save, date_make) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds_tovar, --date_save ? :GTD, :cena, --в приходе какую ставим цену??? (100*:cena)/(100+:nds_tovar), :cena*:cnt, (100*:cena*:cnt)/(100+:nds_tovar), :cnt, 0, :INPLACE, :ARTICUL, :date_save, :date_make); END update bd_9 set fk_bd_1=:fk_1, fk_bd_2=:fk_2 where field_key=:id_rev; -- execute procedure sp_22_by_21(:fk_2,0); END^ SET TERM ; ^USP_CREATE_BY_REV учет цен 11516.5.22.1SP_CREATE_BY_REV p  MA!#SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; Ar m?3"ALTER TABLE BD_11 ADD MARGIN115 DECIMAL(5,2);Uнаценка для 11516.5.22.1BD_11 ADD MARGIN115 ]{!SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; ? U- SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_REV ( ID_REV integer) returns ( FK_1 integer, FK_2 integer) as declare variable DAT date; declare variable TIM time; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CNT decimal(7,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS_TOVAR integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable OST_RASH decimal(7,3); declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable NEDOSTACHA varchar(200); declare variable IZLISHKI varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable FK_SUPPLIER integer; declare variable FK_RECIPIENT integer; declare variable FK_COD_PRIH integer; declare variable FK_COD_RASH integer; declare variable IN_PRIH_CENA integer; declare variable IN_115_CENA integer; BEGIN /* создание прихода и расхода по ревизии */ in_115_cena=0; lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); nedostacha=(select TR_NAME from SP_TRANSLATE('Недостача',:lang)); izlishki=(select TR_NAME from SP_TRANSLATE('Излишки',:lang)); id_user=(select first 1 field_key from bd_users where upper(login)=upper(current_user)); select date_rev, time_rev, fk_bd_firm, FK_FACE, FK_BD_SMENA, coalesce(fk_supplier,1), coalesce(fk_recipient,1), coalesce(fk_cod_prih,7) , coalesce(fk_cod_rash,4), coalesce(IN_PRIH_PRICE,0) from BD_9 where field_key=:id_rev into :dat, :tim, :id_skl, :fk_face, :fk_smena, :fk_supplier, :fk_recipient, :fk_cod_prih, :fk_cod_rash, :in_prih_cena; if (in_prih_cena=0) then in_115_cena=1; if (exists (select bd_91.FK_BD_TOVAR --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0)) THEN BEGIN fk_2=gen_id(GEN_B=@ declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); skip_cenarlog=0; if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^Uне писать расчитанную цену в 115 если она не идет в ценовой автомат16.5.22.1bd_11_ai1B declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; begin -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна -- delete from tmp; -- insert into tmp(prim) values ('старт'); if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); skip_cenarlog=0; if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^Uесли в позиции установлена наценка 115 игнорировать все остальное расчитывать по ней16.5.22.1 bd_11_ai1 % kY%( #'SET TERM ^ ; CREATE OR ALTER procedure SP_CALC_SEB ( FK_CALC integer, WITH_NDS integer = 0) returns ( SUMMA_SEB decimal(8,4), CENA_PR decimal(12,5), NAME char(100), FULLNAME char(200), NORMA decimal(15,4), PRIM varchar(200), HAS_0 integer) as declare variable FK_BD_TOVAR integer; declare variable FK_BD_ZAMENA integer; declare variable KOEF type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_SUB_CALC integer; declare variable SUB_NORMA type of column BD_CALC_COMPONENT.NORMA; declare variable I integer; declare variable NOMER_CALC type of column BD_CALC.NOMER_CALC; declare variable SUB_TTK_HAS_0 integer; BEGIN summa_seb=0; --сначала находим все сырье без ТТК for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and not exists(select field_key from BD_CALC_PRODUCT where fk_bd_tovar=c.fk_bd_tovar) and coalesce(norma,0)>0 into :fk_bd_tovar, D ua?&update bd_tovar set last_cena_pr=(select first 1 cena_pr_with_nds from bd_11 where bd_11.fk_bd_tovar=bd_tovar.field_key order by bd_11.date_prih desc) where last_cena_pr is null Uпроставить всем last_cena_pr16.5.22.1bd_tovar set last_cena_prd w5%SET TERM ^ ; CREATE OR ALTER trigger tr_bd_11_setcashcena for bd_11 active after insert or update position 200 AS BEGIN if (coalesce(old.CENA_PR_WITH_NDS,0)<>coalesce(new.CENA_PR_WITH_NDS,0)) THEN update bd_tovar set BD_TOVAR.LAST_CENA_PR=coalesce(new.CENA_PR_WITH_NDS,0) where field_key=new.fk_bd_tovar and coalesce(BD_TOVAR.LAST_CENA_PR,0)<>coalesce(new.CENA_PR_WITH_NDS,0); END^ SET TERM ; ^ Uисправлена ошибка из за которой триггер никогда не делал апдейт16.5.22.1tr_bd_11_setcashcena) SS%$SET TERM ^ ; CREATE OR ALTER trigger tr_115_round for bd_115 active before insert or update position 5 AS DECLARE VARIABLE rcena DECIMAL(8,2); declare variable cena_pr type of column bd_11.cena_pr_with_nds; declare variable margin11 type of column bd_11.margin115; --DECLARE VARIABLE step_r DECIMAL(8,2); --DECLARE VARIABLE kop integer; BEGIN /* округляем расходную цену*/ /* val=new.CENA_WITH_NDS; select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; new.CENA_WITH_NDS=val; */ select roundedcena from round_rcena((select fk_bd_tovar from bd_11 where bd_11.field_key=new.fk_bd_11), coalesce(new.cena_with_nds,0)) into :rcena; new.cena_with_nds=:rcena; select bd_11.cena_pr_with_nds, bd_11.margin115 from bd_11 where field_key=new.fk_bd_11 into :cena_pr, margin11; if ((margin11 is not null)and(coalesce(cena_pr,0)<>0)) then begin update bd_11 set margin115=(:rcena/:cena_pr-1)*100 where field_key=new.fk_bd_11; end END^ SET TERM ; ^Uперерасчет наценок16.5.22.1tr_115_round:norma do begin has_0=0; prim=null; cena_pr=0; --находим ПЦ select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; prim='Последняя приходная цена'; /*if (coalesce(cena_pr,0)=0) then begin --последняя Пц на остатках select first 1 iif(:with_nds=1,cena_pr_with_nds,cena_pr_without_nds) from bd_11 where fk_bd_tovar=:fk_bd_tovar and stock>0 and valid_flag=1 order by date_prih desc, field_key desc into :cena_pr; prim='Последняя приходная цена на остатках'; end if (coalesce(cena_pr,0)=0) then begin select first 1 iif(:with_nds=1,cena_pr_with_nds,cena_pr_without_nds) from bd_11 where fk_bd_tovar=:fk_bd_tovar and not exists(select field_key from BD_TOVAR_ZAMENA where fk_bd_tovar_in_calc=:fk_bd_tovar) order by date_prih desc, field_key desc into :cena_pr; prim='Последняя приходная цена'; end --по спецификации if (coalesce(cena_pr,0)=0) then begin select first 1 iif(:with_nds=1,cena_pr,cena_pr_without_nds) from bd_sps11 where fk_bd_tovar=:fk_bd_tovar into :cena_pr; prim='ПЦ из спецификации'; end i=0; if (coalesce(cena_pr,0)=0) then begin i=i+1; --ищем по таблице замен for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA where fk_bd_tovar_in_calc=:fk_bd_tovar and koef>0 order by priority into :fk_bd_zamena, :koef do begin --последний приход select first 1 iif(:with_nds=1,cena_pr_with_nds,cena_pr_without_nds) from bd_11 where fk_bd_tovar=:fk_bd_zamena order by date_prih desc, field_key desc into :cena_pr; prim='Последняя приходная цена (замена '||i||')'; --спецификация if (coalesce(cena_pr,0)=0) then begin select first 1 iif(:with_nds=1,cena_pr,cena_pr_without_nds) from bd_sps11 where fk_bd_tovar=:fk_bd_tovar into :cena_pr; prim='ПЦ из спецификации (замена '||i||')'; end cena_pr=cena_pr/koef; prim=prim||'(с коэффициентом замены '||koef||')'; if (cena_pr>0) then break; end end */ select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (coalesce(cena_pr,0)=0) then begin prim='цена не найдена'; has_0=1; end suspend; end --товары с ТТК - находим ТТК, по ней рекурсивно получаем сумму себ for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and exists(select field_key from BD_CALC_PRODUCT where fk_bd_tovar=c.fk_bd_tovar) and coalesce(norma,0)>0 into :fk_bd_tovar, :norma do begin cena_pr=0; --находим ТТК select first 1 pr.fk_calc, norma, nomer_calc from BD_CALC_PRODUCT pr join bd_calc on BD_CALC.FIELD_KEY=pr.fk_calc where bd_calc.valid_flag=1 and pr.fk_bd_tovar=:fk_bd_tovar into :fk_sub_calc, :sub_norma, :nomer_calc; prim='Расчет по ТТК №'||nomer_calc; --находим себ по ТТК select max(summa_seb), max(has_0) from sp_calc_seb(:fk_sub_calc, :with_nds) into :cena_pr, :sub_ttk_has_0; cena_pr=cena_pr/sub_norma; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (sub_ttk_has_0=1) then has_0=1; suspend; end --suspend; END^ SET TERM ; ^ Uрасчет себ ТТК брать цену из бд_товар16.5.22.1SP_CALC_SEB  A '%-)ALTER TABLE BD_FIRM ADD CLOSE_PERIOD_NUM INTEGER DEFAULT 1 ; update bd_firm set close_period_num=1 where close_period_num is null ; ALTER TABLE BD_1 ADD CLOSE_PERIOD_NUM INTEGER; ALTER TABLE BD_2 ADD CLOSE_PERIOD_NUM INTEGER; ALTER TABLE KS_1 ADD CLOSE_PERIOD_NUM INTEGER; ALTER TABLE BD_9_ACT ADD CLOSE_PERIOD_NUM INTEGER; ALTER TABLE BD_9 ADD CLOSE_PERIOD_NUM INTEGER; SET TERM ^ ; CREATE trigger bd_9_get_close_period for bd_9 active before insert position 0 AS begin if (new.close_period_num is null) then select bd_firm.close_period_num from bd_firm where field_key=new.fk_bd_firm into new.close_period_num; end^ SET TERM ; ^ SET TERM ^ ; CREATE trigger bd_1_get_close_period for bd_1 active before insert or update position 0 AS begin if ((coalesce(old.valid_flag,0)=0)and(new.valid_flag=1)) then select close_period_num from bd_firm where field_key=new.fk_bd_firm into new.close_period_num; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger bd_2_get_close_period for bd_2 active before insert or update position 0 AS begin if ((coalesce(old.valid_flag,0)=0)and(new.valid_flag=1)) then select close_period_num from bd_firm where field_key=new.fk_bd_firm into new.close_period_num; end^ SET TERM ; ^ SET TERM ^ ; CREATE trigger ks_1_get_close_period for ks_1 active before insert or update position 0 AS begin if ((coalesce(old.valid_flag,0)=0)and(new.valid_flag=1)) then select close_period_num from bd_firm where field_key=new.fk_bd_firm into new.close_period_num; end^ SET TERM ; ^VНомер закрытого периода все поля, скрипты16.5.25.1CLOSE_PERIOD_NUM` _%3(execute block as declare variable fk_11 integer; declare variable fk_tov integer; declare variable fk_cena integer; declare variable tmargin type of column bd_11.margin115; declare variable cena_pr type of column bd_11.cena_pr_with_nds; begin for select bd_11.field_key, bd_11.fk_bd_tovar, bd_firm.fk_bd_cena_basic, bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_11.margin115) is null or (bd_11.margin115<5) into :fk_11, :fk_tov, :fk_cena, :cena_pr do begin select first 1 margin from bd_nacenka_matrix where fk_bd_tovar=:fk_tov and fk_bd_cena=:fk_cena into :tmargin; if (tmargin is not null) then begin update bd_11 set margin115 = :tmargin where field_key=:fk_11; update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (:fk_11, :fk_cena, null, (:tmargin/100+1)*:cena_pr) matching (FK_BD_11, FK_BD_CENA); end tmargin=null; end endVпропущеные наценки в приходах проставить16.5.25.1bd_11 set margin115 T TL )M,SET TERM ^ ; CREATE OR ALTER procedure SP_115_NA_UTRO2 ( DATEU date, SKLAD integer) returns ( ID_TOV integer, NAME_TOV varchar(100), CNT11 type of column BD_11.CNT, CENA115 type of column BD_115.CENA_WITH_NDS) as declare variable FK_SKLAD integer; declare variable DATEPRIH date; declare variable DATERASH date; BEGIN for select name_tov, id_tov, cena115, sum(cnt11-cnt21) from sp_115_na_utro(:dateu,:sklad) group by 1,2,3 having cena115<>0 and sum(cnt11-cnt21)<>0 order by 1,2,3 into name_tov, id_tov, cena115, cnt11 do suspend; END^ SET TERM ; ^VДля отчетов с группировкой по цене115 - 316.5.25.1CREATE procedure SP_115_NA_UTRO2O 1K+SET TERM ^ ; CREATE OR ALTER procedure SP_115_NA_UTRO ( DATEU date, SKLAD integer) returns ( NAME_TOV varchar(100), ID_TOV integer, FK11 integer, CNT11 type of column BD_11.CNT, CENA115 type of column BD_115.CENA_WITH_NDS, CNT21 type of column BD_21.CNT) as declare variable FK_SKLAD integer; declare variable DATEPRIH date; declare variable DATERASH date; BEGIN for select bd_tovar.name, id_tov, fk11, cnt11, sum(iif((daterash>=:dateu),0,cnt21)), cena115 from v_part115_na_utro vv join bd_tovar on bd_tovar.field_key=vv.id_tov where (fk_sklad=:sklad) and ( (dateprih<:dateu) )--and ( (daterash is null) or (daterash<:dateu) ) ) group by 1,2,3,4,6 order by 1,2,6,3 into name_tov, id_tov, fk11, cnt11 , cnt21 , cena115 do suspend; END^ SET TERM ; ^VДля отчетов с группировкой по цене115 - 216.5.25.1CREATE procedure SP_115_NA_UTRO !G*CREATE OR ALTER VIEW V_PART115_NA_UTRO( ID_TOV, FK11, CNT11, CENA115, CNT21, FK21, FK_SKLAD, DATEPRIH, DATERASH, CPN) AS select bd_11.fk_bd_tovar id_tov , bd_11.field_key fk11 , bd_11.cnt cnt11 , coalesce(bd_115.cena_with_nds,0) cena115 , coalesce(bd_21.cnt,0) cnt21 , bd_21.field_key fk21 , bd_1.fk_bd_firm fk_sklad , bd_1.date_prih dateprih , bd_2.date_rash daterash , IIF(bd_21.field_key is distinct from null,bd_2.close_period_num,bd_1.close_period_num) cpn from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 left join bd_115 on bd_115.fk_bd_11=bd_11.field_key left join bd_21 on bd_21.fk_bd_11=bd_11.field_key left join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where bd_1.valid_flag=1 order by 1,2,3,4,5,6 ;VДля отчетов с группировкой по цене115 - 116.5.25.1CREATE view V_PART115_NA_UTRO  _ -.SET TERM ^ ; create or alter procedure SP_CALC_BD9_POS2 ( FK_POS integer, DATE_START date, DATE_END date, FK_BD_FIRM integer, FK_BD_9 integer, CLOSE_PERIOD_NUM integer = null) returns ( RES decimal(15,2)) as declare variable SELECT_SQL varchar(4000); declare variable POS integer; BEGIN select sql_calc from BD_9_ACT_FORMA_POS where field_key=:fk_pos into :select_sql; pos=POSITION(':fk_bd_firm' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING fk_bd_firm FROM pos for CHAR_LENGTH(':fk_bd_firm')); pos=POSITION(':fk_bd_firm' in select_sql); end pos=POSITION(':fk_bd_9' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING fk_bd_9 FROM pos for CHAR_LENGTH(':fk_bd_9')); pos=POSITION(':fk_bd_9' in select_sql); end pos=POSITION(':date_start' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING ''''||date_start||'''' FROM pos for CHAR_LENGTH(':date_start')); pos=POSITION(':date_start' in select_sql); end pos=POSITION(':date_end' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING ''''||date_end||'''' FROM pos for CHAR_LENGTH(':date_end')); pos=POSITION(':date_end' in select_sql); end pos=POSITION(':close_period_num' in select_sql); while (pos>0) do begin select_sql=OVERLAY(select_sql PLACING close_period_num FROM pos for CHAR_LENGTH(':close_period_num')); pos=POSITION(':close_period_num' in select_sql); end FOR EXECUTE STATEMENT (:select_sql) INTO :res DO begin suspend; end END^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_9_ACT_FORMA_POS TO PROCEDURE SP_CALC_BD9_POS2; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_CALC_BD9_POS2 TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_CALC_BD9_POS2 TO SYSDBA;V16.5.25.1SP_CALC_BD9_POS2 2  1/SET TERM ^ ; CREATE OR ALTER procedure SP_CALC_BD9_FORMA2 ( FK_BD_9_ACT integer, DATE_START date, DATE_END date, FK_BD_FIRM integer, CALC integer, FK_FORMA integer, FK_BD_9 integer, CLOSE_PERIOD_NUM integer = null) returns ( FIELD_KEY integer, NAME_POS varchar(500), VALUE_POS decimal(15,2), NUMBER_PRINT integer, BOLD_FLAG integer, NUMBER_CALC integer, FORMULA varchar(100), FK_POS integer, SAVEAS varchar(100), NAME_FORMULA varchar(30), SQL_CALC varchar(4000), SQL_DETAIL varchar(4000), ISFORMULA_FLAG integer) as BEGIN if (coalesce(calc,0)=1) then begin delete from bd_9_act_detail where fk_bd_9_act=:fk_bd_9_act; if (fk_forma is null) then select fk_bd_9_act_forma from BD_9_ACT where field_key=:fk_bd_9_act into :fk_forma; if (fk_forma is null) then select fk_forma_bd9act from BD_FIRM where field_key=:fk_bd_firm into :fk_forma; for select field_key, NAME, NUMBER_CALC, NUMBER_PRINT, SAVEAS, FORMULA, NAME_FORMULA, SQL_CALC, SQL_DETAIL, bold_flag from BD_9_ACT_FORMA_POS where FK_BD_9_ACT_FORMA=:fk_forma and coalesce(ISFORMULA_FLAG,0)=0 order by number_calc into :fk_pos, :name_pos, :NUMBER_CALC, :NUMBER_PRINT, :SAVEAS, :FORMULA, :NAME_FORMULA, :SQL_CALC, :SQL_DETAIL, :bold_flag do begin value_pos=coalesce((SELECT res FROM SP_CALC_BD9_POS2(:fk_pos, :DATE_START, :DATE_END, :FK_BD_FIRM, :fk_bd_9, :close_period_num) p),0); field_key=gen_id(GEN_BD_9_ACT_DETAIL_ID,1); INSERT INTO BD_9_ACT_DETAIL (field_key, FK_BD_9_ACT, NAME, NUMBER_CALC, NUMBER_PRINT, SAVEAS, FORMULA, NAME_FORMULA, ISFORMULA_FLAG, SQL_CALC, SQL_DETAIL, VALUE_CALC, bold_flag) VALUES (:field_key, :FK_BD_9_ACT, :NAME_pos, :NUMBER_CALC, :NUMBER_PRINT, :SAVEAS, null, :NAME_FORMULA, 0, :SQL_CALC, :SQL_DETAIL, :value_pos, :bold_flag); ISFORMULA_FLAG=0; suspend; end for select field_key, name, formula, number_print, name_formula, saveas, bold_flag from BD_9_ACT_FORMA_POS where FK_BD_9_ACT_FORMA=:fk_forma and coalesce(ISFORMULA_FLAG,0)=1 order by number_calc into :fk_pos, :name_pos, :formula, :number_print, :name_formula, :saveas, :bold_flag do begin value_pos=null; if (coalesce(formula,'')<>'') then value_pos=coalesce((SELECT res FROM SP_CALC_BD9_POS_formula(:fk_bd_9_act, :formula) p),0); field_key=gen_id(GEN_BD_9_ACT_DETAIL_ID,1); INSERT INTO BD_9_ACT_DETAIL (field_key, FK_BD_9_ACT, NAME, NUMBER_CALC, NUMBER_PRINT, SAVEAS, FORMULA, NAME_FORMULA, ISFORMULA_FLAG, SQL_CALC, SQL_DETAIL, VALUE_CALC, bold_flag) VALUES (:field_key, :FK_BD_9_ACT, :NAME_pos, :NUMBER_CALC, :NUMBER_PRINT, :SAVEAS, :formula, :NAME_FORMULA, 1, null, null, :value_pos, :bold_flag); ISFORMULA_FLAG=1; suspend; end end else begin for select field_key, saveas, value_calc, number_print, bold_flag from BD_9_ACT_DETAIL where FK_BD_9_ACT=:FK_BD_9_ACT order by NUMBER_PRINT into :field_key, :name_pos, :value_pos, :number_print, :bold_flag do suspend; end END^ SET TERM ; ^V16.5.25.1SP_CALC_BD9_FORMA2 ` `c kU2SET TERM ^ ; CREATE OR ALTER procedure SP_115_NA_UTRO_CPN2 ( DATEU date, SKLAD integer, CPN integer) returns ( ID_TOV integer, NAME_TOV varchar(100), CNT11 type of column BD_11.CNT, CENA115 type of column BD_115.CENA_WITH_NDS) as declare variable FK_SKLAD integer; declare variable DATEPRIH date; declare variable DATERASH date; BEGIN for select name_tov, id_tov, cena115, sum(cnt11-cnt21) from sp_115_na_utro_cpn(:dateu,:sklad,:cpn) group by 1,2,3 having cena115<>0 and sum(cnt11-cnt21)<>0 order by 1,2,3 into name_tov, id_tov, cena115, cnt11 do suspend; END^ SET TERM ; ^ VДля группировок по цене115 с CPN - 216.5.25.1CREATE procedure SP_115_NA_UTRO_CPN25 S0SET TERM ^ ; CREATE OR ALTER procedure SP_115_NA_UTRO_CPN ( DATEU date, SKLAD integer, CPN integer) returns ( NAME_TOV varchar(100), ID_TOV integer, FK11 integer, CNT11 type of column BD_11.CNT, CENA115 type of column BD_115.CENA_WITH_NDS, CNT21 type of column BD_21.CNT) as declare variable FK_SKLAD integer; declare variable DATEPRIH date; declare variable DATERASH date; BEGIN for select bd_tovar.name, id_tov, fk11, cnt11, sum(iif((daterash>=:dateu),0,cnt21)), cena115 from v_part115_na_utro vv join bd_tovar on bd_tovar.field_key=vv.id_tov where (fk_sklad=:sklad) and ( (dateprih<:dateu) ) AND cpn=:cpn group by 1,2,3,4,6 order by 1,2,6,3 into name_tov, id_tov, fk11, cnt11 , cnt21 , cena115 do suspend; END^ SET TERM ; ^VДля группировок по цене115 с CPN - 116.5.25.1CREATE procedure SP_115_NA_UTRO_CPN b ?e4SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SHET_OSTATOK_MORNING ( FK_SHET_IN integer, TODATE date) returns ( FK_SHET integer, NAME_SHET varchar(100), SUM_PRIH decimal(15,2), SUM_RASH decimal(15,2), SUM_PRIH_SELF decimal(15,2), SUM_RASH_SELF decimal(15,2), OSTATOK decimal(15,2), SHET_NAME varchar(100), UL_NAME type of column BD_SELFUL.OW_NAME) as declare variable ID_USER integer; BEGIN select first 1 field_key from BD_USERS where upper(login)=upper(current_user) into :id_user; todate=coalesce((todate-1),CURRENT_DATE); for select KS_SCHET.FIELD_KEY, KS_SCHET.name||' '||coalesce(bd_selful.OW_NAME,0), KS_SCHET.name,coalesce(bd_selful.OW_NAME,0) from KS_SCHET join BD_USERS_RIGHTS on BD_USERS_RIGHTS.FK_RIGHTS=KS_SCHET.FIELD_KEY left join bd_selful on bd_selful.field_key=ks_schet.FK_SELFUL where (KS_SCHET.field_key=:fk_shet_in or :fk_shet_in is null) and (coalesce(ks_schet.is_arh_flag,0)=0) and BD_USERS_RIGHTS.TYPEOFRIGHTS='C' and BD_USERS_RIGHTS.FK_BD_USERSORGRT=:id_user into :fk_shet, :name_shet, :shet_name, :ul_name do BEGIN --находим все поступления на счет и списания со счета select coalesce(sum(case when (prih=1) then summa else 0 end),0), coalesce(sum(case when (prih=0) then summa else 0 end),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih in (1,0) and ks_1.VALID_FLAG=1 into :sum_prih, :sum_rash; select coalesce(sum(summa),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 into :sum_rash_self; select coalesce(sum(summa),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_shet2=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 into :sum_prih_self; ostatok=sum_prih+sum_prih_self-sum_rash-sum_rash_self; suspend; END END^ SET TERM ; ^ VОстаток по счету на утро, не было в DemoDB16.5.25.1CREATE procedure SP_GET_SHET_OSTATOK_MORNING ^ w__5SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SHET_OST_UTRO_CPN ( FK_SHET_IN integer, TODATE date, CPN integer) returns ( FK_SHET integer, NAME_SHET varchar(100), SUM_PRIH decimal(15,2), SUM_RASH decimal(15,2), SUM_PRIH_SELF decimal(15,2), SUM_RASH_SELF decimal(15,2), OSTATOK decimal(15,2), SHET_NAME varchar(100), UL_NAME type of column BD_SELFUL.OW_NAME) as declare variable ID_USER integer; BEGIN select first 1 field_key from BD_USERS where upper(login)=upper(current_user) into :id_user; todate=coalesce((todate-1),CURRENT_DATE); for select KS_SCHET.FIELD_KEY, KS_SCHET.name||' '||coalesce(bd_selful.OW_NAME,0), KS_SCHET.name,coalesce(bd_selful.OW_NAME,0) from KS_SCHET join BD_USERS_RIGHTS on BD_USERS_RIGHTS.FK_RIGHTS=KS_SCHET.FIELD_KEY left join bd_selful on bd_selful.field_key=ks_schet.FK_SELFUL where (KS_SCHET.field_key=:fk_shet_in or :fk_shet_in is null) and (coalesce(ks_schet.is_arh_flag,0)=0) and BD_USERS_RIGHTS.TYPEOFRIGHTS='C' and BD_USERS_RIGHTS.FK_BD_USERSORGRT=:id_user into :fk_shet, :name_shet, :shet_name, :ul_name do BEGIN --находим все поступления на счет и списания со счета select coalesce(sum(case when (prih=1) then summa else 0 end),0), coalesce(sum(case when (prih=0) then summa else 0 end),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih in (1,0) and ks_1.VALID_FLAG=1 and ks_1.close_period_num=:cpn into :sum_prih, :sum_rash; select coalesce(sum(summa),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and ks_1.close_period_num=:cpn into :sum_rash_self; select coalesce(sum(summa),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_shet2=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and ks_1.close_period_num=:cpn into :sum_prih_self; ostatok=sum_prih+sum_prih_self-sum_rash-sum_rash_self; suspend; END END^ SET TERM ; ^ VДля акта ревизии с CPN - 116.5.25.1CREATE procedure SP_GET_SHET_OST_UTRO_CPN p ;  3GRANT ALL ON v_part115_na_utro TO PUBLIC; GRANT EXECUTE ON PROCEDURE SP_115_NA_UTRO to PUBLIC; GRANT EXECUTE ON procedure SP_115_NA_UTRO2 to PUBLIC; GRANT EXECUTE ON procedure SP_115_NA_UTRO_CPN to PUBLIC; GRANT EXECUTE ON procedure SP_115_NA_UTRO_CPN2 to PUBLIC; GRANT EXECUTE ON procedure SP_GET_SHET_OSTATOK_MORNING to PUBLIC; GRANT EXECUTE ON procedure SP_GET_SHET_OST_UTRO_CPN to PUBLIC; GRANT EXECUTE ON procedure SP_GET_SHET_OST_CPN to PUBLIC; VПрава на процедуры и представление16.5.25.1права на процедуры и представлениеe _U6SET TERM ^ ; create or alter procedure SP_GET_SHET_OST_CPN ( FK_SHET_IN integer, TODATE date, CPN integer) returns ( FK_SHET integer, NAME_SHET varchar(100), SUM_PRIH decimal(15,2), SUM_RASH decimal(15,2), SUM_PRIH_SELF decimal(15,2), SUM_RASH_SELF decimal(15,2), OSTATOK decimal(15,2), SHET_NAME varchar(100), UL_NAME type of column BD_SELFUL.OW_NAME) as declare variable ID_USER integer; BEGIN select first 1 field_key from BD_USERS where upper(login)=upper(current_user) into :id_user; todate=coalesce(todate,CURRENT_DATE); for select KS_SCHET.FIELD_KEY, KS_SCHET.name||' '||coalesce(bd_selful.OW_NAME,0), KS_SCHET.name,coalesce(bd_selful.OW_NAME,0) from KS_SCHET join BD_USERS_RIGHTS on BD_USERS_RIGHTS.FK_RIGHTS=KS_SCHET.FIELD_KEY left join bd_selful on bd_selful.field_key=ks_schet.FK_SELFUL where (KS_SCHET.field_key=:fk_shet_in or :fk_shet_in is null) and (coalesce(ks_schet.is_arh_flag,0)=0) and BD_USERS_RIGHTS.TYPEOFRIGHTS='C' and BD_USERS_RIGHTS.FK_BD_USERSORGRT=:id_user into :fk_shet, :name_shet, :shet_name, :ul_name do BEGIN --находим все поступления на счет и списания со счета select coalesce(sum(case when (prih=1) then summa else 0 end),0), coalesce(sum(case when (prih=0) then summa else 0 end),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih in (1,0) and ks_1.VALID_FLAG=1 and ks_1.close_period_num=:cpn into :sum_prih, :sum_rash; select coalesce(sum(summa),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and ks_1.close_period_num=:cpn into :sum_rash_self; select coalesce(sum(summa),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_shet2=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and ks_1.close_period_num=:cpn into :sum_prih_self; ostatok=sum_prih+sum_prih_self-sum_rash-sum_rash_self; suspend; END END^ SET TERM ; ^ VДля акта ревизии с CPN - 216.5.25.1CREATE procedure SP_GET_SHET_OST_CPNH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena, in_bd115_cena) VALUES (:fk_2,:nedostacha,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:fk_recipient,:fk_face,:fk_cod_rash, null, :id_user, null, 0, null, null, null, :id_skl, null, 0, null, null, :in_prih_cena, :fk_smena, :in_115_cena); END for select bd_91.FK_BD_TOVAR, coalesce(count_11,0)-coalesce(count_real,0), cena --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0 into :fk_bd_tovar, :ost_rash, :cena DO BEGIN --заполняем расход insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds) values (:fk_2,:fk_bd_tovar,:ost_rash,:cena); --эта цена будет изменена на партионную через SP_22_BY_21, вызываемую внутри проведения расхода, в случае ревизии в ПЦ, а в случае ревизии в РЦ - из bd_115, -- признак - bd_2.in_prih_cena, bd_2.in_bd115_cena --примечание: TR_BD_21_FK_TOVAR сохраняет прих. цену как доп. инфу в BD_21 END --считаем сумму расхода update bd_2 main set main.SUMMA=(select sum(bd_21.CENA_WITH_NDS*bd_21.CNT) from bd_21 where fk_bd_2=main.field_key) where main.field_key=:fk_2; execute procedure SP_BD2_PROV(:fk_2,:lang,0,:id_user, 1); --для ревизий не учитываем запрет на создание излишков данного товара if (exists (select bd_91.FK_BD_TOVAR --излишки from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-(coalesce(count_11,0))>0))) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat,current_time, :izlishki, null, null, :fk_supplier, :fk_face, :fk_cod_prih, null, null, null, 0, 0, 1, null, :id_user, 1, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_real,0)-coalesce(count_11,0), cena, --излишки BD_TOVAR.NDS, gtd, articul, inplace from bd_91 join bd_tovar on bd_tovar.field_key=bd_91.FK_BD_TOVAR where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))>0 into :fk_bd_tovar, :cnt, :cena, :NDS_tovar, :gtd, :articul, :inplace do BEGIN --находим сроки годности из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:id_skl and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; --заполняем приход INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, ARTICUL,date_save, date_make, margin115) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds_tovar, --date_save ? :GTD, :cena, --в приходе какую ставим цену??? (100*:cena)/(100+:nds_tovar), :cena*:cnt, (100*:cena*:cnt)/(100+:nds_tovar), :cnt, 0, :INPLACE, :ARTICUL, :date_save, :date_make, iif(:in_115_cena=1,0,null)); END update bd_9 set fk_bd_1=:fk_1, fk_bd_2=:fk_2 where field_key=:id_rev; -- execute procedure sp_22_by_21(:fk_2,0); END^ SET TERM ; ^Vесли ревиз по расх. ценам в излишках наценка115=016.5.25.1SP_CREATE_BY_REV |" ';:update or INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Анонсированные треки', 'tfrmanonstracks', 52) matching (FORMCLASS_NAME, REZHIM)X116.5.30.1режим печатиD!  Y9INSERT INTO PROF_FILTER_TYPE (FIELD_KEY, FILTER_TYPE, KEY_NAME, DISPLAY_NAME, FROM_TABLE, JOIN_ON_ZTX, ORDER_BY, FILTER_NAME) VALUES (82, 'ks_kodi.name', 'field_key', 'name', 'ks_kodi', 'on ztx_selrecs.fkbd=ks_kodi.field_key', '2', 'spr')W16.5.27.1Фильтры платежам БА 2J ! _8INSERT INTO PROF_FILTER_TYPE (FIELD_KEY, FILTER_TYPE, KEY_NAME, DISPLAY_NAME, FROM_TABLE, JOIN_ON_ZTX, ORDER_BY, FILTER_NAME) VALUES (81, 'ks_schet.name', 'field_key', 'name', 'ks_schet', 'on ztx_selrecs.fkbd=ks_schet.field_key', '2', 'spr')W16.5.27.1Фильтры платежам в БА 1] M7-7SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_REV ( ID_REV integer) returns ( FK_1 integer, FK_2 integer) as declare variable DAT date; declare variable TIM time; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CNT decimal(7,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS_TOVAR integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable OST_RASH decimal(7,3); declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable NEDOSTACHA varchar(200); declare variable IZLISHKI varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable FK_SUPPLIER integer; declare variable FK_RECIPIENT integer; declare variable FK_COD_PRIH integer; declare variable FK_COD_RASH integer; declare variable IN_PRIH_CENA integer; declare variable IN_115_CENA integer; BEGIN /* создание прихода и расхода по ревизии */ in_115_cena=0; lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); nedostacha=(select TR_NAME from SP_TRANSLATE('Недостача',:lang)); izlishki=(select TR_NAME from SP_TRANSLATE('Излишки',:lang)); id_user=(select first 1 field_key from bd_users where upper(login)=upper(current_user)); select date_rev, time_rev, fk_bd_firm, FK_FACE, FK_BD_SMENA, coalesce(fk_supplier,1), coalesce(fk_recipient,1), coalesce(fk_cod_prih,7) , coalesce(fk_cod_rash,4), coalesce(IN_PRIH_PRICE,0) from BD_9 where field_key=:id_rev into :dat, :tim, :id_skl, :fk_face, :fk_smena, :fk_supplier, :fk_recipient, :fk_cod_prih, :fk_cod_rash, :in_prih_cena; if (in_prih_cena=0) then in_115_cena=1; if (exists (select bd_91.FK_BD_TOVAR --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASM G$ [m?ALTER TABLE BD_TOVAR ALTER COLUMN NO_IZLISH_FLAG SET DEFAULT 0 ;XЗапрет на создание изл. для новых товаров по умолч.=016.5.30.1alter column NO_IZLISH_FLAGj% m}a=UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Удаление строки','rev_del_tovar', (select field_key from BD_USERS_RIGHTS_NAME where name_var='revision')) matching (name_var); update bd_users_rights_name set name='Просмотр ревизии в течение дня' where name='Просмотр ревизии в течении дня'; update bd_users_rights_name set name='Просмотр прихода в течение дня' where name='Просмотр прихода в течении дня'; update bd_users_rights_name set name='Редактирование тела прихода в течение дня' where name='Редактирование тела прихода в течении дня'; update bd_users_rights_name set name='Просмотр расхода в течение дня' where name='Просмотр расхода в течении дня'; update bd_users_rights_name set name='Редактирование заявки в течение дня' where name='Редактирование заявки в течении дня'; update bd_users_rights_name set name='Добавление в течение дня' where name='Добавление в течении дня';XПраво на удаление строки в ревизии; исправление опечаток в правах16.5.30.1update or insert into BD_USERS_RIGHTS_NAME группе товаров в приходных ценах if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); --suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and ( bd_11.FK_BD_FIRM=:id_sklad ) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 --join bd_1 on bd_1.field_key=bd_11.FK_BD_1 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by bd_sps1.date_spec desc into :cena; --если в приходах нету - берем ПЦ из спецухи cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); -- suspend; END END END^ SET TERM ; ^XФакт на дату ревизии 116.5.30.1SP_GET_REV_PRIH_PRICE_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 --and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_1.VALID_FLAG=1) -- and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=0; if (is_opt=1) THEN BEGIN --bd_115 select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); -- suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=0; if (is_opt=1) THEN BEGIN --bd_115 select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); -- suspend; END END END^ SET TERM ; ^XФакт на дату ревизии 216.5.30.1SP_GET_REV_RASH_PRICE DD8* I[EBSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_PRIH_PRICE ( BY_MATRIX integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable cnt_real_revday decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в приходных ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; --находим последнюю приходную цену --находим общее количество select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; if (coalesce(:cena,0)=0) then --если в приходах нету - берем ПЦ из спецухи select first 1 cena_pr from bd_sps11 join bd_sps1 on bd_sps1.field_key=bd_sps11.fk_bd_sps1 where -- valid_flag=1 and fk_bd_tovar=:fk_bd_tovar order by coalesce(bd_sps1.valid_flag,0) desc, bd_sps1.date_spec desc --спецухи берём сначала проведённые и свежие into :cena; cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); END END^ SET TERM ; ^ XФакт на дату ревизии 316.5.30.1SP_GET_REV_MATRIX_PRIH_PRICE q+ ;[ECSET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_RASH_PRICE ( BY_MATRIX integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable cnt_real_revday decimal(7,3); declare variable FK_SMENA integer; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в РАСхОДНЫх ценах for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=0; select coalesce ( (select first 1 coalesce(BD_CPR_NOW.CENA,0) from BD_CPR_NOW where BD_CPR_NOW.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR_NOW.fk_bd_cena=:id_cena) ,0) from rdb$database into :cena; --ищем цену по заданному типу цены; если нету - то по последней приходной --и находим общее количество if (coalesce(:cena,0)=0) then begin select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); END END^ SET TERM ; ^ XФакт на дату ревизии 416.5.30.1SP_GET_REV_MATRIX_RASH_PRICEVinto :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; W for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; X --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((create_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_za^mena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce(BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Y16.6.6.1SP_CREATE_BY_PR_TTKRAZBOR /%0   +HSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11`=/ ' ?GSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; re\a integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; if (fk_ttk is not null) then begin if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=b:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебираcь партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Y16.6.6.1SP_CREATE_BY_PRek_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0;*/ summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11f.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce(BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then select track_variant from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant; else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Zнаследование16.6.17.1SP_CREATE_BY_PR_TTKRAZBOR y1 m=?ISET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья /*if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_variant from bd_calc_component where fdiinteger; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; if (fk_ttk is not null) then begin if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:jfk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебиратkь партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Z16.6.17.1SP_CREATE_BY_PR  Vz4 5 +LSET TERM ^ ; create or alter procedure SP_CALC_SEB_TOV ( FK_BD_TOVAR integer, FK_BD_FIRM integer, NORMA decimal(15,4)) returns ( CENA_CPR decimal(15,2), CENA_PR decimal(15,2), CENA_SEB decimal(15,2), CENA_SEB_ED decimal(15,2)) as declare variable FK_TTK integer; declare variable FK_TOV_TTK integer; declare variable CENA_TTK decimal(15,2); declare variable NORMA_TTK decimal(12,5); declare variable NORMA_TTK_SUM integer; begin select cena from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=(select fk_bd_cena_basic from bd_firm where field_key=:fk_bd_firm) into :cena_cpr; select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; select first 1 c.field_key from bd_calc c where c.fk_bd_tovar=:fk_bd_tovar and c.valid_flag=1 into :fk_ttk; if (fk_ttk is not null) then begin cena_seb=0; cena_seb_ed=0; norma_ttk_sum=0; for select bd_calc_component.fk_bd_tovar, bd_calc_component.norma from bd_calc_component where fk_calc=:fk_ttk into :fk_tov_ttk, :norma_ttk do begin select cena_pr from sp_calc_seb_tov(:fk_tov_ttk, :fk_bd_firm,:norma_ttk) into :cena_ttk; cena_seb=:cena_seb+(coalesce(:cena_ttk,0)*coalesce(:norma_ttk,0)); norma_ttk_sum=:norma_ttk_sum+coalesce(:norma_ttk,0); end if (coalesce(:norma_ttk_sum,0)>0) then cena_seb_ed=:cena_seb/:norma_ttk_sum; cena_seb=:cena_seb_ed*:norma; end else begin cena_seb=:cena_pr*:norma; cena_seb_ed=:cena_pr; end suspend; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_CPR_NOW TO PROCEDURE SP_CALC_SEB_TOV; GRANT SELECT ON BD_FIRM TO PROCEDURE SP_CALC_SEB_TOV; GRANT SELECT ON BD_TOVAR TO PROCEDURE SP_CALC_SEB_TOV; GRANT SELECT ON BD_CALC TO PROCEDURE SP_CALC_SEB_TOV; GRANT SELECT ON BD_CALC_COMPONENT TO PROCEDURE SP_CALC_SEB_TOV; GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO PROCEDURE SP_CALC_SEB_TOV; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO SYSDBA;Z16.6.17.1SP_CALC_SEB_TOVh3y EKCREATE INDEX BD_CALC_IDX3 ON BD_CALC (FK_BD_TOVAR);Z16.6.17.1INDEX BD_CALC (FK_BD_TOVAR)&2   +JSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 h ||5 ? -MSET TERM ^ ; create or alter procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null) returns ( FIELD_KEY type of column BD_CALC_COMPONENT.FIELD_KEY, FK_PARENT integer, FK_CALC type of column BD_CALC_COMPONENT.FK_CALC, FK_BD_TOVAR type of column BD_CALC_COMPONENT.FK_BD_TOVAR, NORMA type of column BD_CALC_COMPONENT.NORMA, SEB_ED type of column BD_CALC_COMPONENT.SEB_ED, SEB_SUM type of column BD_CALC_COMPONENT.SEB_SUM, NETTO type of column BD_CALC_COMPONENT.NETTO, PROCENT_POTER type of column BD_CALC_COMPONENT.PROCENT_POTER, FK_SKLAD_ZAKAZ type of column BD_CALC_COMPONENT.FK_SKLAD_ZAKAZ, FK_OPERATION type of column BD_CALC_COMPONENT.FK_OPERATION, TRACK_FLAG type of column BD_CALC_COMPONENT.TRACK_FLAG, TRACK_VARIANT type of column BD_CALC_COMPONENT.TRACK_VARIANT, NAME varchar(200), CENA_PR decimal(15,2), CENA_SEB decimal(15,2), CENA_SEB_ED decimal(15,2), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,2), CENA_SEB_ED_SUM decimal(15,2), NETTO_SUM decimal(15,4), FK_TTK_COMP integer) as declare variable FK_TTK_TMP integer; begin --175 if (fk_ttk is null) then exit; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name do begin norma_sum=:norma; netto_sum=:netto; select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (fk_ttk_tmp is not null) then begin for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp from sp_get_calc_tree(:fk_ttk_tmp,:field_key) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp do begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; norma_sum=0; netto_sum=0; cena_seb_sum=0; cena_seb_ed_sum=0; suspend; end fk_ttk_tmp=null; end end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_CALC_COMPONENT TO PROCEDURE SP_GET_CALC_TREE; GRANT SELECT ON BD_TOVAR TO PROCEDURE SP_GET_CALC_TREE; GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO PROCEDURE SP_GET_CALC_TREE; GRANT SELECT ON BD_CALC TO PROCEDURE SP_GET_CALC_TREE; GRANT EXECUTE ON PROCEDURE SP_GET_CALC_TREE TO PROCEDURE SP_GET_CALC_TREE; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_GET_CALC_TREE TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_CALC_TREE TO SYSDBA;Z16.6.17.1SP_GET_CALC_TREE UU.7 G_/OCOMMENT ON COLUMN BD_PR_PRODUCT_TRACK.FK_PROD IS 'Ссылка на BD_PR_PRODUCT для сборных актов и на BD_PR_COMPONENT для разборных'; COMMENT ON COLUMN BD_PR_COMPONENT_TRACK.FK_CMP IS 'Ссылка на BD_PR_COMPONENT для сборного акта и на BD_PR_PRODUCT для разборного';ZКаменты к полям таблиц16.6.17.1COMMENT ON COLUMNu6 MNCREATE GENERATOR GEN_BD_PR_PRODUCT_TRACK_ID; CREATE TABLE BD_PR_PRODUCT_TRACK ( FIELD_KEY INTEGER NOT NULL, FK_PR INTEGER, FK_BD_TOVAR INTEGER, FK_PROD INTEGER, NUMBER INTEGER, TRACK VARCHAR(30), CNT DECIMAL(15,4), CNT_MAX DECIMAL(15,4) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_PR_PRODUCT_TRACK ADD PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Foreign Keys ***/ /******************************************************************************/ ALTER TABLE BD_PR_PRODUCT_TRACK ADD CONSTRAINT FK_BD_PR_PRODUCT_TRACK_1 FOREIGN KEY (FK_BD_TOVAR) REFERENCES BD_TOVAR (FIELD_KEY) ON DELETE CASCADE; /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_PR_PRODUCT_TRACK_IDX1 ON BD_PR_PRODUCT_TRACK (FK_PROD); CREATE INDEX IDX_BD_PR_PRODUCT_TRACK1 ON BD_PR_PRODUCT_TRACK (FK_PR); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_PR_PRODUCT_TRACK_BI */ CREATE OR ALTER TRIGGER BD_PR_PRODUCT_TRACK_BI FOR BD_PR_PRODUCT_TRACK ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_PR_PRODUCT_TRACK_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_PR_PRODUCT_TRACK_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_PR_PRODUCT_TRACK_ID, new.FIELD_KEY-tmp); END END ^ SET TERM ; ^ /******************************************************************************/ /*** Fields descriptions ***/ /******************************************************************************/ COMMENT ON COLUMN BD_PR_PRODUCT_TRACK.FK_PROD IS 'Ссылка на BD_PR_PRODUCT'; COMMENT ON COLUMN BD_PR_PRODUCT_TRACK.CNT_MAX IS 'Кол-во из трека - нужно для разрываемых партий'; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_PR_PRODUCT_TRACK TO PUBLIC;ZТаблица треков продуктов акта пр-ва16.6.17.1CREATE TABLE BD_PR_PRODUCT_TRACK q9 Mi%QSET TERM ^ ; CREATE OR ALTER procedure SP_ADD_BD_11 ( FK_BD_1 integer, FK_BD_11 integer, FK_BD_TOVAR integer, FK_BD_TOVAR_MOD integer, CENA_PR_WITH_NDS decimal(12,5), CNT decimal(7,3), STOCK decimal(7,3), TRACK varchar(30) = null) as declare variable NDS type of column BD_11.NDS; declare variable DATE_SAVE type of column BD_11.DATE_SAVE; declare variable GTD type of column BD_11.GTD; declare variable CENA_PR_WITHOUT_NDS type of column BD_11.CENA_PR_WITHOUT_NDS; declare variable SUMMA_WITH_NDS type of column BD_11.SUMMA_WITH_NDS; declare variable SUMMA_WITHOUT_NDS type of column BD_11.SUMMA_WITHOUT_NDS; declare variable INPLACE type of column BD_11.INPLACE; declare variable ARTICUL type of column BD_11.ARTICUL; declare variable SUMMA_NDS type of column BD_11.SUMMA_NDS; declare variable DATE_MAKE type of column BD_11.DATE_MAKE; declare variable DAY_SAVE type of column BD_TOVAR.DAY_SAVE; declare variable FK_BD_FIRM integer; BEGIN for select nds, coalesce(day_save,0), gtd, inplace, articul from bd_tovar where field_key=:fk_bd_tovar into :nds, :day_save, :gtd, :inplace, :articul do begin date_save=current_date+day_save; date_make=current_date; if (coalesce(CENA_PR_WITH_NDS,0)=0) then begin --находим приходную цену - последнюю приходную на складе, или на любом складе select fk_bd_firm from bd_1 where field_key=:FK_BD_1 into :fk_bd_firm; select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:FK_BD_TOVAR and (:FK_BD_TOVAR_MOD is null or fk_bd_tovar_mod=:FK_BD_TOVAR_MOD) and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :cena_pr_with_nds; if (coalesce(CENA_PR_WITH_NDS,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:FK_BD_TOVAR and (:FK_BD_TOVAR_MOD is null or fk_bd_tovar_mod=:FK_BD_TOVAR_MOD) and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :cena_pr_with_nds; if (coalesce(CENA_PR_WITH_NDS,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fk_bd_firm where fk_bd_tovar=:fk_bd_tovar and (:FK_BD_TOVAR_MOD is null or fk_bd_tovar_mod=:FK_BD_TOVAR_MOD) and valid_flag=1 order by nomer_spec into :cena_pr_with_nds; end if (coalesce(nds,0)=0) then nds=18; summa_with_nds=cena_pr_with_nds*cnt; summa_nds=summa_with_nds*nds/(100+nds); summa_without_nds=summa_with_nds-summa_nds; cena_pr_without_nds=cena_pr_with_nds*100/(100+nds); stock=coalesce(stock,cnt); INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, DATE_SAVE, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, INPLACE, ARTICUL, SUMMA_NDS, DATE_MAKE, FK_BD_TOVAR_MOD, stock, track_11) VALUES (:fk_bd_11,:fk_bd_1,:FK_BD_TOVAR,5,:NDS,:DATE_SAVE,:GTD,:CENA_PR_WITH_NDS,:CENA_PR_WITHOUT_NDS,:summa_with_nds,:SUMMA_WITHOUT_NDS, :CNT,:INPLACE,:ARTICUL,:SUMMA_NDS,:DATE_MAKE,:FK_BD_TOVAR_MOD, :stock, :track); end END^ SET TERM ; ^ Zдля излиш с ононс треками16.6.17.1SP_ADD_BD_11t8iI1PALTER TABLE BD_22 ADD TRACK_22 VARCHAR(30);Zдля анонс треков16.6.17.1BD_22 ADD TRACK_22q_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(bd_11.STOCK),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, bd_11.STOCK from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остатrок сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_savse=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0)and(cnt_21<=stock)) then begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2 from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2 do begin if ((stock>0)and(cnt_21<=stock)) then begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger tr_bd_21_fk_tovar for bd_21 active before insert or update position 0 AS DECLARE VARIABLE fk_tovar integer; DECLARE VARIABLE nds integer; DECLARE VARIABLE cena_pr type of column bd_21.CENA_PR; declare variable track_11 type of column bd_11.track_11; BEGIN select first 1 fk_bd_tovar, nds, cena_pr_with_nds, track_11 from bd_11 where field_key=new.FK_BD_11 into :fk_tovar, :nds, :cena_pr, :track_11; new.FK_BD_TOVAR=:fk_tovar; new.nds=:nds; new.CENA_PR=cena_pr; new.track_21=:track_11; END^ SET TERM ; ^ Zпогашение излишек: учитывать трек в излишках16.6.17.1tr_bd_1_check_7 a,= ;W?Uupdate bd_egais_doc_types set eng_name='WayBillAct' where field_key in (11,12,13) ZЕГАИС: для возвратов16.6.17.1update bd_egais_doc_typesJ< 'STSET TERM ^ ; CREATE OR ALTER trigger bd_selful_ad0 for bd_selful active after delete position 0 AS begin delete from ks_schet where fk_selful=old.field_key; end^ SET TERM ; ^ ZУдаление счетов при удалении юрлица16.6.17.1trigger bd_selful_ad0 for bd_selfulE; %1+SSET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_check_7 for bd_1 active after update position 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; declare variable track11_7 type of column bd_11.track_11; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на остатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, bd_11.stock, bd_11.cena_pr_with_nds from bd_11 left join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_11.fk_bd_1=new.field_key and bd_11.stock>0 and ((bd_11.cod_prih<>8)or(exists(select field_key from bd_pr_product_track where fk_pr=bd_pr.field_key))) into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поздних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fv  W 3@ /+Y update bd_1 main set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=bd_1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_1.field_key=main.field_key );ZЗаполнение по всем приходам кэш-поля bd_1.summa11516.6.17.1update summa115b?k'-WALTER TABLE BD_1 ADD SUMMA115 DECIMAL(15,2);Zbd_1.SUMMA11516.6.17.1ALTER TABLE BD_1@> #CVSET TERM ^ ; CREATE OR ALTER trigger bd_disc_card_nomer for bd_disc_card active before insert position 1 AS declare variable len integer; declare variable pos integer; declare variable mask type of column bd_disc_card.idcard; declare variable prefix varchar(12); begin if ((new.idcard is not null)and(new.nomer_disc_card is null)) then begin select first 1 trim(prefix_disc_card) from bd_firm where prefix_disc_card is not null into :mask; len=char_length(:mask); pos=position('S',:mask); if (char_length(new.idcard)>=:pos) then new.nomer_disc_card=cast(substring(new.idcard from :pos for :len-:pos+1) as integer); else new.nomer_disc_card=new.idcard; end else if ((new.idcard is null)and(new.nomer_disc_card is not null)) then begin select first 1 trim(prefix_disc_card) from bd_firm where prefix_disc_card is not null into :mask; len=char_length(:mask); pos=position('S',:mask); prefix=substring(:mask from 1 for :pos-1); new.idcard=:prefix||lpad(new.nomer_disc_card, :len-:pos+1 ,'0'); end end^ SET TERM ; ^Zисправл.ошибки при добавлении диск карты16.6.17.1 trigger bd_disc_card_nomerlag=1 and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when ( ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4))) and bd_2.cod_rash<>9 ) --убрали код 9 с учетом того, что расход на пр-во может выпасть в первой половине условия 16.06.16 then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения ,sum(case when (bd_2.cod_rash in (7)) then -bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and ((rec.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or (rec.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^ZЧестная декларация: убрал дублирование расходов на пр-во в графу Прочие16.6.17.1ALTER procedure SP_ALC_MOVE_TRUE %B  {-aALTER TABLE BD_1 ADD LAST_KS11_DATE DATE DEFAULT null ; COMMENT ON COLUMN BD_1.LAST_KS11_DATE IS 'Дата последнего платежа триггером из ks_11';ZДата последнего платежа из ks_1116.6.17.1ALTER TABLE BD_1OA 5M`SET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5), CNT_PRIH_VOZV decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_fy  G _;gCREATE TABLE BD_PR_PLAN ( FIELD_KEY Integer NOT NULL, FK_BD_GRT_FIRM Integer, NOMER Integer, FK_BD_USERS Integer, DATE_CREATE Date, DATE_PLAN Date, PRIM Varchar(100), STATUS Integer, PRIMARY KEY (FIELD_KEY) ); GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON BD_PR_PLAN TO "PUBLIC"; CREATE GENERATOR GEN_BD_PR_PLAN_ID; SET TERM !! ; CREATE TRIGGER BD_PR_PLAN_BI FOR BD_PR_PLAN ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_PR_PLAN_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_PR_PLAN_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_PR_PLAN_ID, new.FIELD_KEY-tmp); END END!! SET TERM ; !!\Производственный план16.6.21.1CREATE TABLE BD_PR_PLANyF 5}9fCREATE INDEX BD_EGAIS_DOCS_IDX3 ON BD_EGAIS_DOCS (REPLY_ID); CREATE INDEX BD_EGAIS_DOC_REPLIES_IDX2 ON BD_EGAIS_DOC_REPLIES (REPLY_ID);\Новые индексы для таблиц ЕГАИС16.6.21.1CREATE INDEX BD_EGAIS_SE o]OeSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохр|D {GAd update bd_1 main set LAST_KS11_DATE= ( select first 1 ks_1.date_create from ks_11 join ks_1 on ks_1.field_key=ks_11.fk_ks_1 where ks_11.fk_bd_1=main.field_key order by ks_1.date_create desc )ZЗаполнение кэша даты последнего платежа по всем bd_116.6.17.1update bd_1 LAST_KS11_DATE|C }UcSET TERM ^ ; CREATE OR ALTER trigger ks_11_aiu20 for ks_11 active after insert or update or delete position 20 AS declare variable tdate date; declare variable id_bd1 integer; begin --кэширование даты последней оплаты в bd_1 tdate=null; if (deleting) then id_bd1=old.fk_bd_1; if ((inserting) or (updating)) then id_bd1=new.fk_bd_1; if (id_bd1 is null) then exit; select first 1 ks_1.date_create from ks_11 join ks_1 on ks_1.field_key=ks_11.fk_ks_1 where ks_11.fk_bd_1=:id_bd1 order by ks_1.date_create desc into :tdate; update bd_1 set LAST_KS11_DATE=:tdate where field_key=:id_bd1; end^ SET TERM ; ^ZТриггер кэша даты последней оплаты в bd_116.6.17.1CREATE trigger ks_11_aiu20 for ks_11}анении if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; in_prih_cena=0; if (new.cod_prih=6) then begin select first 1 in_prih_cena from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena; in_prih_cena=coalesce(in_prih_cena,0); end if (in_prih_cena<>1) then --если внутряк и расход не в приходных ценах, то ставим 115 из прайса update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, :cenabase) matching (FK_BD_11, FK_BD_CENA); else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^[Отдельно обрабатываем 115 во внут. перемещ. при проведении16.6.17.1ALTER trigger bd_11_ai1 for bd_11 6 6\K  SUkALTER TABLE BD_PFIRM ADD EG_CLIENTREGID VARCHAR(30); COMMENT ON COLUMN BD_PFIRM.EG_CLIENTREGID IS 'ФСРАР ID филиала поставщика'; COMMENT ON COLUMN BD_FIRM.EG_CLIENTREGID IS '(возможно упраздним) ФСРАР ID поставщиков ЕГАИС'; ALTER TABLE BD_11 ADD EG_FORM1REG VARCHAR(50); COMMENT ON COLUMN BD_11.EG_FORM1REG IS 'Код раздела справки 1 для ЕГАИС'; ALTER TABLE BD_11 ADD EG_FORM2REG VARCHAR(50); COMMENT ON COLUMN BD_11.EG_FORM2REG IS 'Код раздела справки 2 для ЕГАИС';]Поля для ЕГАИС 22.06.1616.6.28.1alter table BD_PFIRM, BD_FIRM, BD_11'J  ;jALTER TABLE BD_CALC ADD fk_bd_pr_plan_product Integer;]ТТК, ссылка на пр план для копий ТТК16.6.28.1ALTER TABLE BD_CALC ADDI WGaiUPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Производственный план','pr_plan', (select field_key from BD_USERS_RIGHTS_NAME where name_var='menu_production')) matching (name_var); UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Добавление плана','pr_plan_add', (select field_key from BD_USERS_RIGHTS_NAME where name_var='pr_plan')) matching (name_var); UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Изменение плана','pr_plan_edit', (select field_key from BD_USERS_RIGHTS_NAME where name_var='pr_plan')) matching (name_var); UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Удаление плана','pr_plan_del', (select field_key from BD_USERS_RIGHTS_NAME where name_var='pr_plan')) matching (name_var);\Права на пр план16.6.21.1update or insert into BD_USERS_RIGHTS_NAME4H IMKhCREATE TABLE BD_PR_PLAN_PRODUCT ( FIELD_KEY Integer NOT NULL, FK_PR_PLAN Integer, FK_BD_TOVAR Integer, CNT_ZAKAZ Decimal(15,4), CENA_RASH Decimal(8,4), CNT_PROD decimal(15,4), seb_ed Decimal(8,4), fk_bd_calc integer, PRIMARY KEY (FIELD_KEY) ); ALTER TABLE BD_PR_PLAN_PRODUCT ADD CONSTRAINT FK_BD_PR_PLAN_PRODUCT_1 FOREIGN KEY (FK_BD_TOVAR) REFERENCES BD_TOVAR (FIELD_KEY) ON DELETE CASCADE; CREATE GENERATOR GEN_BD_PR_PLAN_PRODUCT_ID; SET TERM !! ; CREATE TRIGGER BD_PR_PLAN_PRODUCT_BI FOR BD_PR_PLAN_PRODUCT ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_PR_PLAN_PRODUCT_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_PR_PLAN_PRODUCT_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_PR_PLAN_PRODUCT_ID, new.FIELD_KEY-tmp); END END!! SET TERM ; !!\Продукция пр план16.6.21.1CREATE TABLE BD_PR_PLAN_PRODUCT излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - пинята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; in_prih_cena=0; if (new.cod_prih=6) then begin select first 1 in_prih_cena from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena; in_prih_cena=coalesce(in_prih_cena,0); end if ((new.cod_prih=6) and (in_prih_cena<>1)) then --если внутряк и расход не в приходных ценах, то ставим 115 из прайса update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, :cenabase) matching (FK_BD_11, FK_BD_CENA); else begin if (exists(select first 1 field_key from bd_9 where coalesce(in_prih_price,0)=0 and fk_bd_1=new.fk_bd_1)) then begin --если приход от ревизии в расх. ценах - цена115="прих." цена из bd_11, т.к. она там уже с наценкой update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end end if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^]Если приход от ревизии в расх. ценах - то цена115="прих." цена из bd_11, т.к. она там уже с наценкой16.6.28.1ALTER trigger bd_11_ai1 for bd_11 00WM =33mSET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declareYL WOlSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохранении if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на н variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^]Вырезаны все упоминания о модификация товара16.6.28.1SP_CH_TO_RASH_22_OP  K;  > KoT +u7tUPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = NULL WHERE RDB$FIELD_NAME = 'FK_BD_PR_ZAKAZ' AND RDB$RELATION_NAME = 'BD_PR_ZAKAZ_FIRM_PROD'; ]bd_pr_zakaz_firm_prod убираем нот нулл16.6.28.1bd_pr_zakaz_firm_prod5S MsALTER TABLE BD_PR_ZAKAZ_FIRM ADD fk_bd_pr_plan Integer; ]Связка пр плана и заказов на участок16.6.28.1ALTER TABLE BD_PR_ZAKAZ_FIRM ADDR}i9ralter table bd_pr_plan add FK_FIRM_RECIPIENT integer; ]Склад отгрузки в пр плане16.6.28.1alter table bd_pr_plan Q 9ueqSET TERM ^ ; CREATE TRIGGER TR_PR_PLAN_DEL FOR BD_PR_PLAN ACTIVE BEFORE DELETE POSITION 0 AS BEGIN delete from bd_calc where fk_bd_pr_plan=old.FIELD_KEY; delete from BD_PR_PLAN_PRODUCT p where p.FK_PR_PLAN=old.FIELD_KEY; END^ SET TERM ; ^]Триггер на удаление пр поана16.6.28.1CREATE TRIGGER TR_PR_PLAN_DEL FOR BD_PR_PLANPou3pALTER TABLE BD_CALC ADD fk_bd_pr_plan Integer;]Ссылка на пр план в копии ттк16.6.28.1ALTER TABLE BD_CALCOsg/oALTER TABLE BD_PR ADD fk_bd_calc_sector Integer;]Поле участок в акте пр-ва16.6.28.1ALTER TABLE BD_PRAN AgQnSET TERM ^ ; CREATE OR ALTER trigger tr_bd1_del6 for bd_1 active after delete position 0 AS BEGIN update bd_2 set fk_bd_1_6=null where fk_bd_1_6=old.FIELD_KEY; update bd_egais_docs set fk_doc=null where fk_doc=old.field_key; END^ SET TERM ; ^]ЕГАИС: очистка связи при удалении импортированного прихода16.6.28.1ALTER trigger tr_bd1_del6 for bd_1into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; in_prih_cena=0; if (new.cod_prih=6) then begin select first 1 in_prih_cena from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena; in_prih_cena=coalesce(in_prih_cena,0); end if ((new.cod_prih=6) and (in_prih_cena<>1)) then --если внутряк и расход не в приходных ценах, то ставим 115 из прайса update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, :cenabase) matching (FK_BD_11, FK_BD_CENA); else begin if (exists(select first 1 field_key from bd_9 where coalesce(in_prih_price,0)=0 and fk_bd_1=new.fk_bd_1)) then begin --если приход от ревизии в расх. ценах - цена115="прих." цена из bd_11, т.к. она там уже с наценкой update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end end --обновляем кэш суммы115 при проведении прихода update bd_1 set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=bd_1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_11.fk_bd_1=new.fk_bd_1) where field_key=new.fk_bd_1; if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^ ]Обновляем кэш суммы115 при проведении прихода16.6.28.1ALTER trigger bd_11_ai1 for bd_11 QGQrW OKCwCREATE TABLE bd_pr_plan_cmp ( field_key integer not null primary key, fk_bd_tovar integer, fk_tovar_in_calc integer, cnt decimal(15,4), stock decimal(15,4), fk_pr integer, fk_bd_calc integer, fk_bd_firm_prod integer, fk_sector_prod integer, is_pf integer, fk_pf_calc integer, fk_zakaz_pf Integer, fk_bd_pr_plan integer ); CREATE GENERATOR GEN_BD_PR_PLAN_CMP_ID; SET TERM !! ; CREATE TRIGGER BD_PR_PLAN_CMP_BI FOR BD_PR_PLAN_CMP ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_PR_PLAN_CMP_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_PR_PLAN_CMP_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_PR_PLAN_CMP_ID, new.FIELD_KEY-tmp); END END!! SET TERM ; !!^Сырье по пр плану16.6.30.1CREATE TABLE bd_pr_plan_cmp~VmK?vALTER TABLE BD_REZERV ADD fk_pr_plan Integer; ]ссылка на пр план16.6.28.1ALTER TABLE BD_REZERV ADD(U E1OuSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохранении if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1  ' Z+Z { EzSET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE2 ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)) IY 5CyALTER TABLE BD_PR_ZAKAZ_FIRM DROP CONSTRAINT FK_BD_PR_ZAKAZ_FIRM_1^удаляем внешний ключ на заказ на производство16.6.30.1ALTER TABLE BD_PR_ZAKAZ_FIRUX 3SxSET TERM ^ ; ALTER TRIGGER TR_PR_PLAN_DEL ACTIVE BEFORE DELETE POSITION 0 AS BEGIN delete from bd_calc where fk_bd_pr_plan=old.FIELD_KEY; delete from BD_PR_PLAN_PRODUCT p where p.FK_PR_PLAN=old.FIELD_KEY; delete from bd_pr_plan_cmp c where c.FK_BD_PR_PLAN=old.field_key; END^ SET TERM ; ^^Удаление сырья по пр плану при удалении плана16.6.30.1ALTER TRIGGER TR_PR_PLAN_DEL ACTIVEthen bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6 FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and skl.field_key<>sup.field_key --кроме излишков and not(bd_1.cod_prih in (7,9,1,8)) --излишки и бонусы и товарообмен, приходы с пр-ва group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM UNION SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when (bd_2.cod_rash=4) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)and bd_2.cod_rash=5) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and rec.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1,8)) --излишки и бонусы и товарообмен, приходы с пр-ва group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM) as p group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6 do begin suspend; end END^ SET TERM ; ^^Формирование нечестной декларации16.6.30.1ALTER procedure SP_ALC_MOVE2nakl between :fromdate and :todate and bd_1.valid_flag=1 and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when ( ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4))) and bd_2.cod_rash<>9 ) --убрали код 9 с учетом того, что расход на пр-во может выпасть в первой половине условия 16.06.16 then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)and bd_2.cod_rash=5) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения ,sum(case when (bd_2.cod_rash in (7)) then -bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and ((rec.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or (rec.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^^Формирование честной декларации16.6.30.1ALTER procedure SP_ALC_MOVE_TRUE YY[ [M{SET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5), CNT_PRIH_VOZV decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_K integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^^16.6.30.1SP_CH_TO_RASH_22_OP V V` Y?ALTER TABLE BD_REZERV ADD fk_pr Integer; ALTER TABLE BD_REZERV ADD fk_zf_prep Integer; ALTER TABLE BD_PR_ZAKAZ_FIRM_PROD ADD stock_cnt_end Decimal(7,3); ALTER TABLE BD_PR_ZAKAZ_FIRM_PROD ADD stock_cnt_6 Decimal(7,3);_в резерве ссылка на акт пр-ва и подготовку к перемещению16.7.6.1ALTER TABLE BD_REZERV ADD'_ 7CMSET TERM ^ ; CREATE PROCEDURE sp_get_cod_prih ( fk_supplier integer, fk_bd_firm integer ) RETURNS ( fk_dogovor integer, name_dogovor varchar(100), cod_prih integer, day_cons_prih integer, fk_selful integer, name_selful varchar(100)) AS BEGIN select first 1 bd_dogovor.field_key, coalesce(BD_DOGOVOR.name,''), fk_selful, cod_prih, coalesce(day_cons_prih,0) from bd_dogovor where fk_recipient=:fk_supplier and fk_bd_grt_firm in (select w.fk_bd_grt_firm from bd_grt_firm_web w where fk_bd_firm=:fk_bd_firm) and bd_dogovor.valid_flag=1 order by date_dog into :fk_dogovor, :name_dogovor, :fk_selful, :cod_prih, :day_cons_prih; if (fk_selful is null) then begin select fk_selful, coalesce(sl.name,'') from bd_firm left join bd_selful sl on sl.field_key=bd_firm.fk_selful where bd_firm.field_key=:fk_bd_firm into :fk_selful, :name_selful; end if (cod_prih is null) then begin select coalesce(cod_prih,0), coalesce(day_cons_prih,0) from BD_FIRM where field_key=:fk_supplier into :cod_prih, :day_cons_prih; end suspend; END^ SET TERM ; ^_возвращает условия прихода для поставщика/склада16.7.6.1CREATE PROCEDURE sp_get_cod_prihT^ qoA~ALTER TABLE BD_PR_PLAN_CMP ADD fk_order_in_1 Integer; ALTER TABLE BD_PR_PLAN_CMP ADD fk_supplier Integer;^ссылка на заказ поставщику16.6.30.1ALTER TABLE BD_PR_PLAN_CMP] IK}UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = NULL WHERE RDB$FIELD_NAME = 'FK_BD_PR_ZAKAZ' AND RDB$RELATION_NAME = 'BD_PR_ZAKAZ_FIRM_ORDER_IN'; ALTER TABLE BD_PR_ZAKAZ_FIRM_ORDER_IN ADD fk_bd_pr_plan Integer;^убираем нот нулл для ссылки на заказ на пр-во, добавляем ссылку на пр план16.6.30.1alter BD_PR_ZAKAZ_FIRM_ORDER_INf\  3|SET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BAN  b C?SET TERM ^ ; create PROCEDURE SP_CREATE_BY_PR_PLAN_MAKE ( FK_BD_PR_PLAN Integer, FK_BD_CALC Integer, FK_BD_TOVAR Integer, CNT_ZAKAZ Decimal(15,4), NORMA_MIN Decimal(15,4), IS_SBOR Integer, FK_BD_FIRM_REC Integer, FK_BD_SECTOR_REC Integer, FK_FIRM_PROD Integer, FK_SECTOR_PROD Integer, NAME_CALC Varchar(100), DOPRASH Decimal(15,2), FK_MASTER_PR Integer ) AS DECLARE VARIABLE fk_bd_users integer; DECLARE VARIABLE fk_pr integer; DECLARE VARIABLE koef decimal(15,2); DECLARE VARIABLE fk_bd_tovar_prod integer; DECLARE VARIABLE cnt_prod decimal(15,4); DECLARE VARIABLE fk_bd_tovar_cmp integer; DECLARE VARIABLE cnt_cmp decimal(15,4); declare variable FK_BD_pr_zakaz_firm integer; declare variable no_tovar_zakaz integer; declare variable curr_stock decimal(15,4); declare variable curr_stock_rezerv decimal(15,4); declare variable cnt_new_rezerv decimal(15,4); declare variable fk_zf_prod integer; declare variable alg_type integer; declare variable cnt_pr decimal(15,4); declare variable IS_PF integer; declare variable FK_PF_CALC integer; declare variable is_sbor_cmp integer; declare variable norma_min_cmp decimal(15,4); declare variable fk_firm_prod_cmp integer; declare variable fk_sector_prod_cmp integer; declare variable name_calc_cmp varchar(100); declare variable doprash_cmp Decimal(15,2); declare variable fk_zamena integer; declare variable koef_zamena decimal(15,2); declare variable stock_zamena decimal(15,4); declare variable curr_stock_rezerv_zamena decimal(15,4); declare variable cnt_new_rezerv_zamena decimal(15,4); declare variable curr_stock_dops decimal(15,4); declare variable fk_zf_prep integer; BEGIN alg_type=2; --произвести --текущий пользователь FK_BD_USERS=(select field_key from BD_USERS where upper(login)=upper(current_user)); --в любом случае создаем заказ на участок и строку в прод, которую затем апдейтим на нужный алгоритм FK_BD_pr_zakaz_firm=(select first 1 z.field_key from bd_pr_zakaz_firm z where z.fk_bd_pr_plan=:fk_bd_pr_plan and z.fk_bd_calc_sector=:FK_SECTOR_PROD); if (FK_BD_pr_zakaz_firm is null) then begin insert into bd_pr_zakaz_firm (fk_bd_pr_plan, fk_bd_firm, nomer, fk_bd_calc_sector) values (:fk_bd_pr_plan, :fk_firm_prod, coalesce((select max(nomer)+1 from bd_pr_zakaz_firm where fk_bd_firm=:fk_firm_prod),1),:FK_SECTOR_PROD) returning (field_key) into :FK_BD_pr_zakaz_firm; end INSERT into bd_pr_zakaz_firm_prod (FK_BD_FIRM, FK_BD_FIRM_PROD, FK_BD_TOVAR, CNT, STOCK_CNT_6, FK_BD_CALC, FK_BD_PR_ZAKAZ_FIRM,alg_type, fk_recipient_sector) VALUES (:FK_BD_FIRM_REC, :fk_firm_prod, :fk_bd_tovar, :CNT_ZAKAZ, iif((:FK_BD_FIRM_REC<>:FK_FIRM_PROD),:cnt_zakaz,0), :fk_bd_calc, :fk_bd_pr_zakaz_firm, :alg_type, :fk_bd_secRa )/ECREATE TABLE bd_pr_plan_dops ( field_key integer not null primary key, fk_bd_pr_plan integer, fk_bd_firm_prod integer, fk_bd_tovar integer, cnt decimal(15,4) ); CREATE GENERATOR GEN_BD_PR_PLAN_DOPS_ID; SET TERM !! ; CREATE TRIGGER BD_PR_PLAN_DOPS_BI FOR BD_PR_PLAN_DOPS ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_PR_PLAN_DOPS_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_PR_PLAN_DOPS_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_PR_PLAN_DOPS_ID, new.FIELD_KEY-tmp); END END!! SET TERM ; !!_Побочные продукты производства для пр плана16.7.6.1CREATE TABLE bd_pr_plan_dopstor_rec) returning (field_key) into :fk_zf_prod; --определяем количество заказанного товара на остатках на цехе производства select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:FK_FIRM_PROD and fk_bd_tovar=:fk_bd_tovar and stock>0 and valid_flag=1 and bd_11.PRIORITY>0 into :curr_stock; --плюсуем к остатку произведенные побочные продукты предыдущих итераций select coalesce(sum(cnt),0) from bd_pr_plan_dops where fk_bd_pr_plan=:fk_bd_pr_plan and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm_prod=:FK_FIRM_PROD into :curr_stock_dops; curr_stock=curr_stock+curr_stock_dops; --учитываем резервы к текущему остатку curr_stock_rezerv=coalesce((select sum(cnt_rezerv) from bd_rezerv where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:FK_FIRM_PROD),0); curr_stock=curr_stock-curr_stock_rezerv; if (curr_stock<0) then curr_stock=0; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv=0; if (curr_stockCNT_ZAKAZ) then cnt_new_rezerv=CNT_ZAKAZ; if (cnt_new_rezerv>0) then begin alg_type=0; --произвести и переместить if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then fk_zf_prep=gen_id(GEN_BD_PR_ZF_PROD_PREP_ID,1); else fk_zf_prep=null; --резервируем. в резерве ссылка либо на подготовку к перемещению, либо на акт пр-ва, для которого требуется полуфабрикат insert into bd_rezerv(fk_bd_tovar,fk_bd_firm,cnt_rezerv,fk_pr_plan, FK_BD_PR_ZAKAZ_FIRM_PROD,fk_zf_prep,fk_pr) values (:fk_bd_tovar, :FK_FIRM_PROD, :cnt_new_rezerv,:FK_BD_PR_PLAN,:fk_zf_prod, :fk_zf_prep, :fk_master_pr); --готовим к перемещению, если склад заказчик не совпадает с цехом изготовления if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then begin update bd_pr_zakaz_firm_prod p set p.alg_type=:alg_type where field_key=:fk_zf_prod; end end if (CNT_ZAKAZ-curr_stock<=0) then begin --производить не требуется, только перемещаем на склад-заказчик --обновляем прод, создаем подготовку к перемещению if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then begin alg_type=1; --только переместить update bd_pr_zakaz_firm_prod p set p.alg_type=:alg_type where field_key=:fk_zf_prod; /* INSERT INTO BD_PR_ZF_PROD_PREP (field_key, FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prep, :fk_zf_prod, :FK_BD_TOVAR, :cnt_zakaz, null, :FK_BD_FIRM_REC); */ end --заполняем список продукции exit; end CNT_PR=CNT_ZAKAZ-curr_stock; ---------------------------------------------------------------------------------------------------------- --корректируем количество для производства по минимальной норме if ((IS_SBOR=1)and(CNT_PRFK_FIRM_PROD) then begin INSERT INTO BD_PR_ZF_PROD_PREP (field_key, FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prep,:fk_zf_prod, :FK_BD_TOVAR, :cnt_zakaz, null, :FK_BD_FIRM_REC); end */ end else begin --побочные продукты производства INSERT INTO BD_PR_PLAN_DOPS (FK_BD_PR_PLAN, FK_BD_FIRM_PROD, FK_BD_TOVAR, CNT) VALUES (:FK_BD_PR_PLAN,:FK_FIRM_PROD,:FK_BD_TOVAR_prod,(:cnt_prod*:koef)); end /* if (IS_SBOR=1) then begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end else begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end */ end --заполняем список сырья for select p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=0) union select c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=1) into :fk_bd_tovar_cmp, :cnt_cmp do begin cnt_cmp=cnt_cmp*koef; --проверяем текущий остаток с учетом резерва --определяем количество товара на остатках на цехе производства select coalesce(sum(stock),0) from bd_11 where fk_bd_firm=:FK_FIRM_PROD and fk_bd_tovar=:fk_bd_tovar_cmp and stock>0 and valid_flag=1 and bd_11.PRIORITY>0 into :curr_stock; --плюсуем к остатку побочные продукты предыдущих итераций select coalesce(sum(cnt),0) from bd_pr_plan_dops where fk_bd_pr_plan=:fk_bd_pr_plan and fk_bd_tovar=:fk_bd_tovar_cmp and fk_bd_firm_prod=:FK_FIRM_PROD into :curr_stock_dops; curr_stock=curr_stock+curr_stock_dops; --учитываем резервы к текущему остатку curr_stock_rezerv=coalesce((select sum(cnt_rezerv) from bd_rezerv where fk_bd_tovar=:fk_bd_tovar_cmp and fk_bd_firm=:FK_FIRM_PROD),0); curr_stock=curr_stock-curr_stock_rezerv; if (curr_stock<0) then curr_stock=0; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv=0; if (curr_stockCNT_cmp) then cnt_new_rezerv=CNT_cmp; --резервируем if (cnt_new_rezerv>0) then begin --резервируем сколько требуется и есть в наличии insert into bd_rezerv(fk_bd_tovar,fk_bd_firm,cnt_rezerv,fk_pr_plan, FK_BD_PR_ZAKAZ_FIRM_PROD,fk_pr) values (:fk_bd_tovar_cmp, :FK_FIRM_PROD, :cnt_new_rezerv,:FK_BD_PR_PLAN,:fk_zf_prod,:fk_pr); end --если на остатках недостаточно if (cnt_new_rezerv0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar_cmp group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena, :stock_zamena do begin --учитываем резервы к текущему остатку curr_stock_rezerv_zamena=coalesce((select sum(cnt_rezerv) from bd_rezerv where fk_bd_tovar=:fk_zamena and fk_bd_firm=:FK_FIRM_PROD),0); stock_zamena=stock_zamena-curr_stock_rezerv_zamena; if (stock_zamena<0) then stock_zamena=0; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv_zamena=0; if (stock_zamena/KOEF_zamenacnt_cmp) then cnt_new_rezerv_zamena=cnt_cmp*KOEF_zamena; CNT_cmp=CNT_cmp-stock_zamena/KOEF_zamena; if (cnt_new_rezerv_zamena>0) then begin --резервируем insert into bd_rezerv(fk_bd_tovar,fk_bd_firm,cnt_rezerv,fk_pr_plan, FK_BD_PR_ZAKAZ_FIRM_PROD,fk_pr) values (:fk_zamena, :FK_FIRM_PROD, :cnt_new_rezerv_zamena,:FK_BD_PR_PLAN,:fk_zf_prod,:fk_pr); --сохраняем в список сырья по акту пр-ва и пр плану /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_zamena,:cnt_new_rezerv_zamena); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_zamena,:cnt_new_rezerv_zamena); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_zamena, :FK_BD_TOVAR_cmp, :cnt_new_rezerv_zamena, :stock_zamena, :FK_PR, :fk_bd_calc, :FK_FIRM_PROD, :FK_SECTOR_PROD,0, null, :FK_BD_pr_zakaz_firm,:fk_bd_pr_plan); end if (cnt_cmp<=0) then break; end if (cnt_cmp>0) then --сли после замены все равно не хватило, делаем заказ поставщику begin /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan, fk_supplier) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan, (select fk_supplier_main from bd_tovar where field_key=:fk_bd_tovar_cmp)); end --заказ поставщику end else begin --ттк есть, сохраняем инфу в акт и список сырья, запускаем производство /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan); select coalesce(c.IS_SBOR,0), c.norma_min, c.FK_BD_FIRM_PROD, c.FK_BD_CALC_SECTOR, c.NAME_CALC, c.DOPRASH from bd_calc c where field_key=:FK_PF_CALC into :is_sbor_cmp, :norma_min_cmp, :fk_firm_prod_cmp, :fk_sector_prod_cmp, :name_calc_cmp, :doprash_cmp; execute procedure sp_create_by_pr_plan_make(:fk_bd_pr_plan, :fk_pf_calc, :fk_bd_tovar_cmp, :cnt_cmp, :norma_min_cmp, :is_sbor_cmp, :FK_FIRM_PROD, :FK_SECTOR_PROD, :fk_firm_prod_cmp, :fk_sector_prod_cmp, :name_calc_cmp, :doprash_cmp, :fk_pr); end end else --конец если на остатках недостаточно begin-- на остатках хватает /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan); end end --закончили идти по списку сырья END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN_MAKE TO SYSDBA;_создание заказа на участок по ттк16.7.6.1SP_CREATE_BY_PR_PLAN_MAKE  &wh 3' SET TERM ^ ; CREATE TRIGGER TR_PR_ZF_PROD_PREP_REZERV FOR BD_PR_ZF_PROD_PREP ACTIVE AFTER UPDATE OR DELETE POSITION 0 AS BEGIN if (((updating)and(coalesce(old.DONE,0)=0)and(coalesce(new.DONE,0)=1))or(deleting)) then begin --снимаем резерв при создании расхода по подгтовке перемещению (расход сразу проводится) или удалении подготовки к перемещению delete from BD_REZERV r where r.FK_zf_prep=old.field_key; end END^ SET TERM ; ^ _снятие резерва с подготовки к перемещению16.7.6.1CREATE TRIGGER TR_PR_ZF_PROD_PREP_REZERV FOR BD_PR_ZF_PROD_PREP{g 1wICREATE INDEX IDX_BD_PR_PLAN_CMP1 ON BD_PR_PLAN_CMP (FK_BD_TOVAR); CREATE INDEX IDX_BD_PR_PLAN_CMP2 ON BD_PR_PLAN_CMP (FK_ORDER_IN_1); _индексы для сырья по пр плану16.7.6.1CREATE INDEX ON BD_PR_PLAN_CMP%f 5SET TERM ^ ; ALTER TRIGGER TR_BD_ORDER_IN_1_DEL ACTIVE BEFORE DELETE POSITION 0 AS BEGIN if ((select res from islock_fordel('BD_ORDER_IN_1',old.field_key))=1) /*(exists(select field_key from bd_block where (tablename='BD_ORDER_IN_1') and (fktable=old.FIELD_KEY)))*/ then exception EXEP_DEL_LOCK_DOC; update BD_PR_PLAN_CMP set fk_order_in_1=null where fk_order_in_1=old.FIELD_KEY; END^ SET TERM ; ^_удаление заказа - очищение ссылки16.7.6.1TR_BD_ORDER_IN_1_DELAe GSET TERM ^ ; create PROCEDURE SP_CREATE_BY_PR_PLAN_ORDER_IN ( FK_BD_PR_PLAN Integer, FRM_HNLD Integer ) RETURNS ( CNT_ORDER Integer ) AS DECLARE VARIABLE fk_bd_users integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE fk_sector integer; DECLARE VARIABLE fk_supplier integer; DECLARE VARIABLE fk_bd_order_in_1 integer; DECLARE VARIABLE fk_bd_tovar integer; DECLARE VARIABLE cnt_zakaz decimal(15,4); declare variabcd CI5ALTER TABLE BD_TOVAR ADD EG_FULLNAME VARCHAR(200); COMMENT ON COLUMN BD_TOVAR.EG_FULLNAME IS 'Полное имя товара в ЕГАИС';_ЕГАИС поля 30.06.201616.7.6.1ALTER TABLE BD_TOVAR~c #5SET TERM ^ ; create PROCEDURE SP_CREATE_BY_PR_PLAN ( FK_PLAN Integer ) AS DECLARE VARIABLE fk_bd_calc integer; DECLARE VARIABLE fk_bd_tovar integer; declare variable cnt decimal (15,4); declare variable is_sbor integer; declare variable norma_min decimal (15,4); DECLARE VARIABLE fk_sector_prod integer; DECLARE VARIABLE fk_firm_prod integer; DECLARE VARIABLE fk_firm_rec integer; DECLARE VARIABLE name_calc varchar(100); DECLARE VARIABLE doprash decimal(15,2); BEGIN select bd_pr_plan.FK_FIRM_RECIPIENT from bd_pr_plan where field_key=:fk_plan into :fk_firm_rec; for select p.fk_bd_calc, p.FK_BD_TOVAR, p.CNT_ZAKAZ, coalesce(c.IS_SBOR,0), c.norma_min, c.FK_BD_FIRM_PROD, c.FK_BD_CALC_SECTOR, c.NAME_CALC, c.DOPRASH from BD_PR_PLAN_PRODUCT p join bd_calc c on c.FIELD_KEY=p.FK_BD_CALC where fk_bd_pr_plan=:fk_plan into :fk_bd_calc, :fk_bd_tovar, :cnt, :is_sbor, :norma_min, :fk_firm_prod, :fk_sector_prod, :name_calc, :doprash do begin execute procedure sp_create_by_pr_plan_make(:fk_plan, :fk_bd_calc, :fk_bd_tovar, :cnt, :norma_min, :is_sbor, :fk_firm_rec, (select first 1 field_key from a_sector where fk_bd_firm_prod=:fk_firm_rec order by field_key), :fk_firm_prod, :fk_sector_prod, :name_calc, :doprash,null); end END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN TO SYSDBA;_создание заказов на участок по пр плану16.7.6.1SP_CREATE_BY_PR_PLANle cena_pr decimal(15,3); declare variable nds integer; declare variable fk_dogovor integer; declare variable cod_prih integer; declare variable day_cons_prih integer; declare variable fk_selful integer; BEGIN FK_BD_USERS=(select field_key from BD_USERS where upper(login)=upper(current_user)); cnt_order=0; FOR SELECT distinct a.FK_BD_FIRM_PROD, a.FK_SECTOR_PROD, a.FK_SUPPLIER FROM BD_PR_PLAN_CMP a where (fk_bd_pr_plan=:fk_bd_pr_plan) and (CNT-stock)>0 and (a.FK_ORDER_IN_1 is null) and (is_pf=0) and ((:FRM_HNLD is null)or(a.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) into :fk_bd_firm, :fk_sector, :fk_supplier DO BEGIN --условия прихода для поставщика SELECT p.FK_DOGOVOR, p.COD_PRIH, p.DAY_CONS_PRIH, p.FK_SELFUL FROM SP_GET_COD_PRIH(:FK_SUPPLIER, :FK_BD_FIRM) p into :fk_dogovor, :cod_prih, :day_cons_prih, :fk_selful; --вставляем заголовок заказа INSERT into BD_ORDER_IN_1 (FK_BD_FIRM, DATE_ORDER, TIME_ORDER, DATE_DELIVERY, SEND_FLAG, FK_SUPPLIER, FK_PFIRM_SUPPLIER, CLOSE_FLAG, VALID_FLAG, FK_SELFUL, COD_PRIH, DAY_CONS_PRIH, PRIM, SUMMA, FK_SELFUL_FROM, RECEIVED_FLAG, RECEIVED_TS, SEND_DATE, SEND_TIME, FK_BD_USERS, FK_BD_DOGOVOR, fk_bd_firm_sector) values (:fk_bd_firm,current_date,current_time,current_date,0,:fk_supplier, (select first 1 field_key from bd_pfirm where fk_bd_firm=:fk_supplier), 0,0,:fk_selful, :cod_prih, :day_cons_prih, '', 0, null, 0, null, null, null, :fk_bd_users, :fk_dogovor, :FK_SECTOR) returning (field_key) into :fk_bd_order_in_1; --позиции заказа FOR select fk_bd_tovar, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS, sum(cnt)-sum(stock) from bd_pr_plan_cmp join BD_TOVAR on BD_TOVAR.field_key=bd_pr_plan_cmp.FK_BD_TOVAR where fk_bd_pr_plan=:fk_bd_pr_plan and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector) and (is_pf=0) and ((:FRM_HNLD is null)or(bd_pr_plan_cmp.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) group by fk_bd_tovar, fk_supplier, FK_BD_FIRM_PROD, FK_SECTOR_PROD, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS into :fk_bd_tovar, :cena_pr, :nds, :cnt_zakaz do BEGIN INSERT into bd_order_in_11 (fk_bd_order_in_1, fk_bd_tovar, cnt, cnt_11, cena_pr_with_nds, cena_pr_without_nds, summa_with_nds, summa_without_nds, in_11, cntavt, inplace, cntinplace, cnt_tsd, cnt_stock) values (:fk_bd_order_in_1, :fk_bd_tovar, :cnt_zakaz, null, :cena_pr, :cena_pr*:cnt_zakaz/(100+:nds)/:cnt_zakaz, :cena_pr*:cnt_zakaz, :cena_pr*:cnt_zakaz/(100+:nds), 0,0,0,0,0,0); END --сохраняем ссылку на заказ в списке сырья пр плана UPDATE bd_pr_plan_cmp set fk_order_in_1=:fk_bd_order_in_1 where fk_bd_pr_plan=:fk_bd_pr_plan and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector); cnt_order=cnt_order+1; END SUSPEND; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN_ORDER_IN TO SYSDBA;_создание заказов на участок по пр плану16.7.6.1SP_CREATE_BY_PR_PLAN_ORDER_IN  \l [USET TERM ^ ; CREATE OR ALTER trigger tr_bd2_delete for bd_2 active after delete position 0 AS declare variable fk_ch2 integer; declare variable fk_bd_1 integer; declare variable ex_22 integer; BEGIN update bd_egais_reqs set fk_doc=null where fk_doc=old.field_key; delete from BD_PR_ZAKAZ_6 where fk_bd_2=old.FIELD_KEY; update BD_PR set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr set bd_pr.valid_flag=0 where fk_bd_1 is null and fk_bd_2 is null; update bd_9 set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update BD_RETROBONUS set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr_zf_prod_prep set fk_bd_2=null, done=0 where fk_bd_2=old.field_key; delete from BD_WAY_LIST_11 where fk_bd_2 = old.FIELD_KEY; if ((old.COD_RASH='0')or(old.COD_RASH='7')) then begin if (exists(select first 1 1 from bd_22 where fk_bd_2=old.FIELD_KEY)) then ex_22=1; else ex_22=0; for select bd_ch2.FIELD_KEY from bd_ch2 where fk_bd_Firm=old.FK_BD_FIRM and date_close=old.DATE_RASH and fk_bd_2=old.FIELD_KEY into :fk_ch2 do begin update bd_ch2 set fk_bd_2=null, bd_ch2.ACCEPT_FLAG=0 where field_key=:fk_ch2; if (ex_22=1) then update bd_ch21 set bd_ch21.ACCEPT_FLAG=0 where fk_bd_ch2=:fk_ch2; end end --удаление излишков, созданных по расходу for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=old.FIELD_KEY into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end END^ SET TERM ; ^_ЕГАИС очистка связи с возвратом поставщику при удалении16.7.6.1ALTER trigger tr_bd2_delete for bd_25k OIMALTER TABLE BD_EGAIS_REQS ADD FK_DOC INTEGER; COMMENT ON COLUMN BD_EGAIS_REQS.FK_DOC IS 'Для накл. - ссылка на BD_2 (возврат поставщику)'; ALTER TABLE BD_11 DROP EG_ID_SPRB; _ЕГАИС поля 04.07.201616.7.6.1ALTER TABLE BD_EGAIS_REQS, BD_119j  S SET TERM ^ ; CREATE TRIGGER TR_BD_PR_ZF_PROD_REZERV for BD_PR_ZAKAZ_FIRM_PROD ACTIVE AFTER DELETE POSITION 0 AS BEGIN delete from BD_REZERV r where r.FK_BD_PR_ZAKAZ_FIRM_PROD=old.field_key; END^ SET TERM ; ^ _снятие резерва при удалении позиции заказа на участок16.7.6.1CREATE TRIGGER TR_BD_PR_ZF_PROD_REZERV for BD_PR_ZAKAZ_FIRM_PROD6i o]SET TERM ^ ; CREATE TRIGGER TR_BD_PR_REZERV FOR BD_PR ACTIVE AFTER UPDATE OR DELETE POSITION 0 AS BEGIN if (((updating)and(coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1))or(deleting)) then begin --снимаем резерв при проведении акта пр-ва или удалении акта delete from BD_REZERV r where r.FK_pr=old.field_key; end END^ SET TERM ; ^ _снятие резерва с акта пр-ва16.7.6.1CREATE TRIGGER TR_BD_PR_REZERV FOR BD_PR decimal(15,3); declare variable nds integer; declare variable fk_dogovor integer; declare variable cod_prih integer; declare variable day_cons_prih integer; declare variable fk_selful integer; BEGIN FK_BD_USERS=(select field_key from BD_USERS where upper(login)=upper(current_user)); cnt_order=0; FOR SELECT distinct a.FK_BD_FIRM_PROD, a.FK_SECTOR_PROD, a.FK_SUPPLIER FROM BD_PR_PLAN_CMP a where (a.FK_ZAKAZ_PF=:fk_zf) and (CNT-stock)>0 and (a.FK_ORDER_IN_1 is null) and (is_pf=0) and ((:FRM_HNLD is null)or(a.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) into :fk_bd_firm, :fk_sector, :fk_supplier DO BEGIN --условия прихода для поставщика SELECT p.FK_DOGOVOR, p.COD_PRIH, p.DAY_CONS_PRIH, p.FK_SELFUL FROM SP_GET_COD_PRIH(:FK_SUPPLIER, :FK_BD_FIRM) p into :fk_dogovor, :cod_prih, :day_cons_prih, :fk_selful; --вставляем заголовок заказа INSERT into BD_ORDER_IN_1 (FK_BD_FIRM, DATE_ORDER, TIME_ORDER, DATE_DELIVERY, SEND_FLAG, FK_SUPPLIER, FK_PFIRM_SUPPLIER, CLOSE_FLAG, VALID_FLAG, FK_SELFUL, COD_PRIH, DAY_CONS_PRIH, PRIM, SUMMA, FK_SELFUL_FROM, RECEIVED_FLAG, RECEIVED_TS, SEND_DATE, SEND_TIME, FK_BD_USERS, FK_BD_DOGOVOR, fk_bd_firm_sector) values (:fk_bd_firm,current_date,current_time,current_date,0,:fk_supplier, (select first 1 field_key from bd_pfirm where fk_bd_firm=:fk_supplier), 0,0,:fk_selful, :cod_prih, :day_cons_prih, '', 0, null, 0, null, null, null, :fk_bd_users, :fk_dogovor, :FK_SECTOR) returning (field_key) into :fk_bd_order_in_1; --позиции заказа FOR select fk_bd_tovar, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS, sum(cnt)-sum(stock) from bd_pr_plan_cmp join BD_TOVAR on BD_TOVAR.field_key=bd_pr_plan_cmp.FK_BD_TOVAR where fk_zakaz_pf=:fk_zf and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector) and (is_pf=0) and ((:FRM_HNLD is null)or(bd_pr_plan_cmp.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) group by fk_bd_tovar, fk_supplier, FK_BD_FIRM_PROD, FK_SECTOR_PROD, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS into :fk_bd_tovar, :cena_pr, :nds, :cnt_zakaz do BEGIN INSERT into bd_order_in_11 (fk_bd_order_in_1, fk_bd_tovar, cnt, cnt_11, cena_pr_with_nds, cena_pr_without_nds, summa_with_nds, summa_without_nds, in_11, cntavt, inplace, cntinplace, cnt_tsd, cnt_stock) values (:fk_bd_order_in_1, :fk_bd_tovar, :cnt_zakaz, null, :cena_pr, :cena_pr*:cnt_zakaz/(100+:nds)/:cnt_zakaz, :cena_pr*:cnt_zakaz, :cena_pr*:cnt_zakaz/(100+:nds), 0,0,0,0,0,0); END --сохраняем ссылку на заказ в списке сырья пр плана UPDATE bd_pr_plan_cmp set fk_order_in_1=:fk_bd_order_in_1 where bd_pr_plan_cmp.FK_ZAKAZ_PF=:fk_zf and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector); cnt_order=cnt_order+1; END SUSPEND; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_zf_ORDER_IN TO SYSDBA;_заказы поставщику по заказу на участок16.7.6.1SP_CREATE_BY_PR_zf_ORDER_IN m u _mUr [+SET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_PR ( ID_PR Integer, CREATE_7 Integer DEFAULT 0, BY_NDS Char(1) DEFAULT '' ) RETURNS ( FK_1 Integer, FK_2 Integer, RES Varchar(100) ) AS declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT d8q }+?SET TERM ^ ; ALTER TRIGGER TR_PR_ZF_PROD_PREP_REZERV ACTIVE BEFORE UPDATE OR DELETE POSITION 0 AS BEGIN if (((updating)and(coalesce(old.DONE,0)=0)and(coalesce(new.DONE,0)=1))or(deleting)) then begin --снимаем резерв при создании расхода по подгтовке перемещению (расход сразу проводится) или удалении подготовки к перемещению delete from BD_11_RESERV r where r.FK_BD_PR_ZF_PROD=old.fk_prod and r.type_doc=2; end END^ SET TERM ; ^cснимаем резервы с подготовки к перемещению16.7.16.1TR_PR_ZF_PROD_PREP_REZERV^p e!-SET TERM ^ ; create PROCEDURE sp_set_rezerv_11 ( fk_bd_tovar integer, cnt decimal(8,3), fk_bd_firm integer, fk_zf_prod integer, type_doc integer ) AS DECLARE VARIABLE cnt_ost decimal(8,3); DECLARE VARIABLE stock decimal(8,3); DECLARE VARIABLE fk_bd_11 integer; BEGIN cnt_ost=cnt; for select field_key, stock-coalesce(rezerv,0) from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and (stock-coalesce(rezerv,0))>0 and bd_11.PRIORITY>0 and valid_flag=1 order by date_prih, fk_bd_1 into :fk_bd_11, :stock do begin if (cnt_ost>0) then begin if (stock>=cnt_ost) then begin INSERT INTO BD_11_RESERV (FK_BD_11, CNT, FK_BD_PR_ZF_PROD, type_doc) VALUES (:fk_bd_11, :cnt_ost, :fk_zf_prod, :type_doc); cnt_ost=0; end else begin cnt_ost=cnt_ost-stock; INSERT INTO BD_11_RESERV (FK_BD_11, CNT, FK_BD_PR_ZF_PROD, type_doc) VALUES (:fk_bd_11, :stock, :fk_zf_prod, :type_doc); end end end END^ SET TERM ; ^cсоздание резерва под указанный документ16.7.16.1sp_set_rezerv_11to c=?ALTER TABLE BD_PR_ZAKAZ_FIRM_PROD ADD stock_11 Decimal(7,3); ALTER TABLE BD_11_RESERV ADD fk_bd_pr_zf_prod Integer; ALTER TABLE BD_11_RESERV ADD type_doc Integer;cОстаток на момент создания заказа на участок, в резервах ссылка на заказ на участок16.7.16.1BD_PR_ZAKAZ_FIRM_PROD ADDn UKCREATE INDEX BD_EGAIS_REQS_IDX3 ON BD_EGAIS_REQS (FK_DOC);_ЕГАИС индексы 05.07.201616.7.6.1CREATE INDEX BD_EGAIS_REQS_IDX3%m eCSET TERM ^ ; create PROCEDURE SP_CREATE_BY_PR_zf_ORDER_IN ( FK_ZF Integer, FRM_HNLD Integer ) RETURNS ( CNT_ORDER Integer ) AS DECLARE VARIABLE fk_bd_users integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE fk_sector integer; DECLARE VARIABLE fk_supplier integer; DECLARE VARIABLE fk_bd_order_in_1 integer; DECLARE VARIABLE fk_bd_tovar integer; DECLARE VARIABLE cnt_zakaz decimal(15,4); declare variable cena_precimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; if (fk_ttk is not null) then begin if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^cпроведение акта пр, работа с резервами16.7.16.1SP_CREATE_BY_PR  4 jt ;SET TERM ^ ; ALTER TRIGGER TR_BD_PR_ZF_PROD_REZERV ACTIVE AFTER DELETE POSITION 0 AS BEGIN delete from BD_11_RESERV r where r.FK_BD_PR_ZF_PROD=old.field_key; END^ SET TERM ; ^cснятие резервов по позиции заказа на участок при удалении позиции16.7.16.1TR_BD_PR_ZF_PROD_REZERVHs K+SET TERM ^ ; ALTER TRIGGER TR_BD_PR_REZERV ACTIVE after UPDATE OR DELETE POSITION 0 AS declare variable fk_prod integer; BEGIN if (((updating)and(coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1))or(deleting)) then begin --снимаем резерв при проведении акта пр-ва или удалении акта for select FK_BD_PR_ZAKAZ_FIRM_PROD from BD_PR_ZAKAZ_FIRM_DOC d where d.FK_DOC=old.FIELD_KEY and d.TYPE_DOC=6 into :fk_prod do delete from BD_11_RESERV r where r.FK_BD_PR_ZF_PROD=:fk_prod and r.type_doc=6; end END^ SET TERM ; ^cснятие резерва по акту производства16.7.16.1TR_BD_PR_REZERV fu   -SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null) returns ( FIELD_KEY type of column BD_CALC_COMPONENT.FIELD_KEY, FK_PARENT integer, FK_CALC type of column BD_CALC_COMPONENT.FK_CALC, FK_BD_TOVAR type of column BD_CALC_COMPONENT.FK_BD_TOVAR, NORMA type of column BD_CALC_COMPONENT.NORMA, SEB_ED type of column BD_CALC_COMPONENT.SEB_ED, SEB_SUM type of column BD_CALC_COMPONENT.SEB_SUM, NETTO type of column BD_CALC_COMPONENT.NETTO, PROCENT_POTER type of column BD_CALC_COMPONENT.PROCENT_POTER, FK_SKLAD_ZAKAZ type of column BD_CALC_COMPONENT.FK_SKLAD_ZAKAZ, FK_OPERATION type of column BD_CALC_COMPONENT.FK_OPERATION, TRACK_FLAG type of column BD_CALC_COMPONENT.TRACK_FLAG, TRACK_VARIANT type of column BD_CALC_COMPONENT.TRACK_VARIANT, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer) as declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(15,4); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min from bd_calc where field_key=:fk_ttk into :norma_ttk; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (fk_ttk_tmp is not null) then begin for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; norma_sum=0; netto_sum=0; cena_seb_sum=0; cena_seb_ed_sum=0; suspend; end fk_ttk_tmp=null; end end end^ SET TERM ; ^cуровень вложености компонента ттк16.7.16.1SP_GET_CALC_TREE rry c )ALTER TABLE BD_PR_PLAN ADD summa_seb Decimal(15,2); ALTER TABLE BD_PR_PLAN ADD summa_rash Decimal(15,2); cКеш-поля: сумма себестоимости продукции пр плана и сумма в расх ценах16.7.16.1BD_PR_PLAN ADDx #S%CREATE INDEX IDX_BD_PR_PLAN_PRODUCT1 ON BD_PR_PLAN_PRODUCT (FK_PR_PLAN); cИндексы по пр плану16.7.16.1CREATE INDEXw C#SET TERM ^ ; ALTER PROCEDURE SP_BD2_PROV ( FK_BD2 Integer, LANG Varchar(2), CREATE_7 Integer, FK_USER Integer, IGNORE_NO_IZLISH_FLAG Integer DEFAULT 0 ) AS declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; --coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(Bv E7UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Стек производственных заданий','pr_stakan', (select field_key from BD_USERS_RIGHTS_NAME where name_var='menu_production')) matching (name_var); cправа на стакан16.7.16.1 BD_USERS_RIGHTS_NAME:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and stock-coalesce(rezerv,0)>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводтвом, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cntcoalesce(new.CNT_PROD,0))or (coalesce(old.CNT_zakaz,0)<>coalesce(new.CNT_zakaz,0))or (coalesce(old.CENA_RASH,0)<>coalesce(new.CENA_RASH,0))) then begin --СУМ(кол-во выполненного * цену отгрузки) / СУМ(кол-во заказанного * цену отгрузки)*100 proc=(select iif(sum(cnt_zakaz*cena_rash)=0,0,sum(cnt_prod*cena_rash)/sum(cnt_zakaz*cena_rash)*100) from BD_PR_PLAN_PRODUCT where FK_PR_PLAN=coalesce(old.FK_PR_PLAN,new.FK_PR_PLAN)); update bd_pr_plan set status=:proc where field_key=coalesce(old.FK_PR_PLAN,new.FK_PR_PLAN); end END^ SET TERM ; ^ cтриггер на позиции пр плана, считает кеш поля пр плана16.7.16.1TR_PR_PLAN_PRODUCT_SETCASH FK_BD_pr_zakaz_firm=(select first 1 z.field_key from bd_pr_zakaz_firm z where z.fk_bd_pr_plan=:fk_bd_pr_plan and z.fk_bd_calc_sector=:FK_SECTOR_PROD); if (FK_BD_pr_zakaz_firm is null) then begin insert into bd_pr_zakaz_firm (fk_bd_pr_plan, fk_bd_firm, nomer, fk_bd_calc_sector) values (:fk_bd_pr_plan, :fk_firm_prod, coalesce((select max(nomer)+1 from bd_pr_zakaz_firm where fk_bd_firm=:fk_firm_prod),1),:FK_SECTOR_PROD) returning (field_key) into :FK_BD_pr_zakaz_firm; end INSERT into bd_pr_zakaz_firm_prod (FK_BD_FIRM, FK_BD_FIRM_PROD, FK_BD_TOVAR, CNT, STOCK_CNT_6, FK_BD_CALC, FK_BD_PR_ZAKAZ_FIRM,alg_type, fk_recipient_sector, FK_PR_PLAN_PROD, fk_bd_calc_sector) VALUES (:FK_BD_FIRM_REC, :fk_firm_prod, :fk_bd_tovar, :CNT_ZAKAZ, iif((:FK_BD_FIRM_REC<>:FK_FIRM_PROD),:cnt_zakaz,0), :fk_bd_calc, :fk_bd_pr_zakaz_firm, :alg_type, :fk_bd_sector_rec, :FK_PR_PLAN_PROD,:FK_SECTOR_PROD) returning (field_key) into :fk_zf_prod; --определяем количество заказанного товара на остатках на цехе производства select coalesce(sum(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0))),0) from bd_11 where fk_bd_firm=:FK_FIRM_PROD and fk_bd_tovar=:fk_bd_tovar and stock>0 and valid_flag=1 and bd_11.PRIORITY>0 into :curr_stock; --сохраняем текущий остаток update BD_PR_ZAKAZ_FIRM_PROD set stock_11=:curr_stock where field_key=:fk_zf_prod; --плюсуем к остатку произведенные побочные продукты предыдущих итераций select coalesce(sum(cnt),0) from bd_pr_plan_dops where fk_bd_pr_plan=:fk_bd_pr_plan and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm_prod=:FK_FIRM_PROD into :curr_stock_dops; curr_stock=curr_stock+curr_stock_dops; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv=0; if (curr_stock=CNT_ZAKAZ) then cnt_new_rezerv=CNT_ZAKAZ; if (cnt_new_rezerv>0) then begin alg_type=0; --произвести и переместить if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then fk_zf_prep=gen_id(GEN_BD_PR_ZF_PROD_PREP_ID,1); else fk_zf_prep=null; --резервируем. в резерве ссылка на подготовку к перемещению execute procedure sp_set_rezerv_11(:fk_bd_tovar,:cnt_new_rezerv,:fk_firm_prod,:fk_zf_prod,2); --готовим к перемещению, если склад заказчик не совпадает с цехом изготовления if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then begin update bd_pr_zakaz_firm_prod p set p.alg_type=:alg_type where field_key=:fk_zf_prod; end end if (CNT_ZAKAZ-curr_stock<=0) then begin --производить не требуется, только перемещаем на склад-заказчик --обновляем прод, создаем подготовку к перемещению if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then begin alg_type=1; --только переместить update bd_pr_zakaz_firm_prod p set p.alg_type=:alg_type where field_key=:fk_zf_prod; /* INSERT INTO BD_PR_ZF_PROD_PREP (field_key, FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prep, :fk_zf_prod, :FK_BD_TOVAR, :cnt_zakaz, null, :FK_BD_FIRM_REC); */ end --заполняем список продукции exit; end CNT_PR=CNT_ZAKAZ-curr_stock; ---------------------------------------------------------------------------------------------------------- --корректируем количество для производства по минимальной норме if ((IS_SBOR=1)and(CNT_PRFK_FIRM_PROD) then begin INSERT INTO BD_PR_ZF_PROD_PREP (field_key, FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prep,:fk_zf_prod, :FK_BD_TOVAR, :cnt_zakaz, null, :FK_BD_FIRM_REC); end */ end else begin --побочные продукты производства INSERT INTO BD_PR_PLAN_DOPS (FK_BD_PR_PLAN, FK_BD_FIRM_PROD, FK_BD_TOVAR, CNT) VALUES (:FK_BD_PR_PLAN,:FK_FIRM_PROD,:FK_BD_TOVAR_prod,(:cnt_prod*:koef)); end /* if (IS_SBOR=1) then begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end else begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end */ end --заполняем список сырья for select p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=0) union select c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=1) into :fk_bd_tovar_cmp, :cnt_cmp do begin cnt_cmp=cnt_cmp*koef; --определяем количество товара на остатках на цехе производства select coalesce(sum(iif((stock-coalesce(rezerv,0)<0),0,stock-coalesce(rezerv,0))),0) from bd_11 where fk_bd_firm=:FK_FIRM_PROD and fk_bd_tovar=:fk_bd_tovar_cmp and stock>0 and valid_flag=1 and bd_11.PRIORITY>0 into :curr_stock; --плюсуем к остатку побочные продукты предыдущих итераций select coalesce(sum(cnt),0) from bd_pr_plan_dops where fk_bd_pr_plan=:fk_bd_pr_plan and fk_bd_tovar=:fk_bd_tovar_cmp and fk_bd_firm_prod=:FK_FIRM_PROD into :curr_stock_dops; curr_stock=curr_stock+curr_stock_dops; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv=0; if (curr_stock=CNT_cmp) then cnt_new_rezerv=CNT_cmp; --резервируем if (cnt_new_rezerv>0) then begin --резервируем сколько требуется и есть в наличии execute procedure sp_set_rezerv_11(:fk_bd_tovar_cmp,:cnt_new_rezerv,:FK_FIRM_PROD,:fk_zf_prod,6); end --если на остатках недостаточно if (cnt_new_rezerv0) then begin INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan, fk_supplier) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_new_rezerv, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, 0, null, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan, (select fk_supplier_main from bd_tovar where field_key=:fk_bd_tovar_cmp)); curr_STOCK=curr_STOCK-cnt_new_rezerv; end cnt_cmp=cnt_cmp-cnt_new_rezerv; --сколько не хватает --проверяем наличие ттк FK_PF_CALC=null; FK_PF_CALC= ( select max(fk) from ( select bd_calc.field_key as fk from bd_calc join bd_calc_product pr on pr.fk_calc=bd_calc.field_key where pr.fk_bd_tovar=:FK_BD_TOVAR_cmp and BD_CALC.valid_flag=1 and bd_calc.is_sbor=1 union select bd_calc.field_key as fk from bd_calc join BD_CALC_COMPONENT c on c.fk_calc=bd_calc.field_key where c.fk_bd_tovar=:FK_BD_TOVAR_cmp and BD_CALC.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=0 ) ); if (FK_PF_CALC is not null) then is_pf=1; else is_pf=0; if (is_pf=0) then begin --ттк нет, сырье является простым --если на остатках не хватает, проверяем замены for select fk_bd_tovar_zamena, koef, coalesce(sum(iif((stock-coalesce(rezerv,0)<0),0,stock-coalesce(rezerv,0))),0) from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:FK_FIRM_PROD and (bd_11.STOCK-coalesce(bd_11.rezerv,0))>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar_cmp group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena, :stock_zamena do begin --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv_zamena=0; if (stock_zamena/KOEF_zamena=cnt_cmp) then cnt_new_rezerv_zamena=cnt_cmp*KOEF_zamena; CNT_cmp=CNT_cmp-stock_zamena/KOEF_zamena; if (cnt_new_rezerv_zamena>0) then begin --резервируем execute procedure sp_set_rezerv_11(:fk_zamena,:cnt_new_rezerv_zamena,:FK_FIRM_PROD,:fk_zf_prod,6); --сохраняем в список сырья по акту пр-ва и пр плану /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_zamena,:cnt_new_rezerv_zamena); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_zamena,:cnt_new_rezerv_zamena); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_zamena, :FK_BD_TOVAR_cmp, :cnt_new_rezerv_zamena, :stock_zamena, :FK_PR, :fk_bd_calc, :FK_FIRM_PROD, :FK_SECTOR_PROD,0, null, :FK_BD_pr_zakaz_firm,:fk_bd_pr_plan); end if (cnt_cmp<=0) then break; end if (cnt_cmp>0) then --если после замены все равно не хватило, делаем заказ поставщику begin /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan, fk_supplier) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan, (select fk_supplier_main from bd_tovar where field_key=:fk_bd_tovar_cmp)); end --заказ поставщику end else begin --ттк есть, сохраняем инфу в акт и список сырья, запускаем производство /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan); select coalesce(c.IS_SBOR,0), c.norma_min, c.FK_BD_FIRM_PROD, c.FK_BD_CALC_SECTOR, c.NAME_CALC, c.DOPRASH from bd_calc c where field_key=:FK_PF_CALC into :is_sbor_cmp, :norma_min_cmp, :fk_firm_prod_cmp, :fk_sector_prod_cmp, :name_calc_cmp, :doprash_cmp; execute procedure sp_create_by_pr_plan_make(:fk_bd_pr_plan, :fk_pf_calc, :fk_bd_tovar_cmp, :cnt_cmp, :norma_min_cmp, :is_sbor_cmp, :FK_FIRM_PROD, :FK_SECTOR_PROD, :fk_firm_prod_cmp, :fk_sector_prod_cmp, :name_calc_cmp, :doprash_cmp, :fk_pr, null); end end else --конец если на остатках недостаточно begin-- на остатках хватает /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan); end end --закончили идти по списку сырья END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN_MAKE TO SYSDBA;cсоздание заказов на участки по пр плану, добавлена ссылка на позицию пр плана16.7.16.1SP_CREATE_BY_PR_PLAN_MAKE  &  [qISET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_PR_PLAN_ORDER_IN ( FK_BD_PR_PLAN Integer, FRM_HNLD Integer ) RETURNS ( CNT_ORDER Integer ) AS DECLARE VARIABLE fk_bd_users integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE fk_sector integer; DECLARE VARIABLE fk_supplier integer; DECLARE VARIABLE fk_bd_order_in_1 integer; DECLARE VARIABLE fk_bd_tovar integer; DECLARE VARIABLE cnt_zakaz decimal(15,4); declare variable cena_pr decimal(15,3); de%~ ]'=SET TERM ^ ; CREATE TRIGGER TR_BD_PR_ZAKAZ_FIRM_PROD FOR BD_PR_ZAKAZ_FIRM_PROD ACTIVE AFTER UPDATE OR DELETE POSITION 100 AS BEGIN if ((old.FK_PR_PLAN_PROD is not null)and(coalesce(old.CNT_6,0)<>coalesce(new.cnt_6,0))) then begin update BD_PR_PLAN_PRODUCT set cnt_prod=coalesce(cnt_prod,0)-coalesce(old.CNT_6,0)+coalesce(new.cnt_6,0) where field_key=old.FK_PR_PLAN_PROD; end END^ SET TERM ; ^cкеш в позиции пр плана кол-ва выполненного16.7.16.1TR_BD_PR_ZAKAZ_FIRM_PRODV} U5SET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_PR_PLAN ( FK_PLAN Integer ) AS DECLARE VARIABLE fk_bd_calc integer; DECLARE VARIABLE fk_bd_tovar integer; declare variable cnt decimal (15,4); declare variable is_sbor integer; declare variable norma_min decimal (15,4); DECLARE VARIABLE fk_sector_prod integer; DECLARE VARIABLE fk_firm_prod integer; DECLARE VARIABLE fk_firm_rec integer; DECLARE VARIABLE name_calc varchar(100); DECLARE VARIABLE doprash decimal(15,2); declare variable FK_PR_PLAN_PROD integer; DECLARE VARIABLE prim type of column bd_pr_plan.PRIM; BEGIN select bd_pr_plan.FK_FIRM_RECIPIENT, bd_pr_plan.PRIM from bd_pr_plan where field_key=:fk_plan into :fk_firm_rec, :prim; for select p.field_key, p.fk_bd_calc, p.FK_BD_TOVAR, p.CNT_ZAKAZ, coalesce(c.IS_SBOR,0), c.norma_min, c.FK_BD_FIRM_PROD, c.FK_BD_CALC_SECTOR, c.NAME_CALC, c.DOPRASH from BD_PR_PLAN_PRODUCT p join bd_calc c on c.FIELD_KEY=p.FK_BD_CALC where fk_bd_pr_plan=:fk_plan into :fk_pr_plan_prod, :fk_bd_calc, :fk_bd_tovar, :cnt, :is_sbor, :norma_min, :fk_firm_prod, :fk_sector_prod, :name_calc, :doprash do begin execute procedure sp_create_by_pr_plan_make(:fk_plan, :fk_bd_calc, :fk_bd_tovar, :cnt, :norma_min, :is_sbor, :fk_firm_rec, (select first 1 field_key from a_sector where fk_bd_firm_prod=:fk_firm_rec order by field_key), :fk_firm_prod, :fk_sector_prod, :name_calc, :doprash,null,:fk_pr_plan_prod); end update BD_PR_ZAKAZ_FIRM f set f.PRIM=:prim where f.FK_BD_PR_PLAN=:fk_plan; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN TO SYSDBA;cссылка на позицию пр плана, примечание к зак на участок16.7.16.1SP_CREATE_BY_PR_PLANclare variable nds integer; declare variable fk_dogovor integer; declare variable cod_prih integer; declare variable day_cons_prih integer; declare variable fk_selful integer; BEGIN FK_BD_USERS=(select field_key from BD_USERS where upper(login)=upper(current_user)); cnt_order=0; FOR SELECT distinct a.FK_BD_FIRM_PROD, a.FK_SECTOR_PROD, a.FK_SUPPLIER FROM BD_PR_PLAN_CMP a where (fk_bd_pr_plan=:fk_bd_pr_plan) and (CNT-stock)>0 and (a.FK_ORDER_IN_1 is null) and (is_pf=0) and ((:FRM_HNLD is null)or(a.fk_bd_tovar||'.'||a.FK_BD_FIRM_PROD in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) into :fk_bd_firm, :fk_sector, :fk_supplier DO BEGIN --условия прихода для поставщика SELECT p.FK_DOGOVOR, p.COD_PRIH, p.DAY_CONS_PRIH, p.FK_SELFUL FROM SP_GET_COD_PRIH(:FK_SUPPLIER, :FK_BD_FIRM) p into :fk_dogovor, :cod_prih, :day_cons_prih, :fk_selful; --вставляем заголовок заказа INSERT into BD_ORDER_IN_1 (FK_BD_FIRM, DATE_ORDER, TIME_ORDER, DATE_DELIVERY, SEND_FLAG, FK_SUPPLIER, FK_PFIRM_SUPPLIER, CLOSE_FLAG, VALID_FLAG, FK_SELFUL, COD_PRIH, DAY_CONS_PRIH, PRIM, SUMMA, FK_SELFUL_FROM, RECEIVED_FLAG, RECEIVED_TS, SEND_DATE, SEND_TIME, FK_BD_USERS, FK_BD_DOGOVOR, fk_bd_firm_sector) values (:fk_bd_firm,current_date,current_time,current_date,0,:fk_supplier, (select first 1 field_key from bd_pfirm where fk_bd_firm=:fk_supplier), 0,0,:fk_selful, :cod_prih, :day_cons_prih, '', 0, null, 0, null, null, null, :fk_bd_users, :fk_dogovor, :FK_SECTOR) returning (field_key) into :fk_bd_order_in_1; --позиции заказа FOR select fk_bd_tovar, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS, sum(cnt)-sum(stock) from bd_pr_plan_cmp join BD_TOVAR on BD_TOVAR.field_key=bd_pr_plan_cmp.FK_BD_TOVAR where fk_bd_pr_plan=:fk_bd_pr_plan and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector) and (is_pf=0) and ((:FRM_HNLD is null)or(bd_pr_plan_cmp.fk_bd_tovar||'.'||bd_pr_plan_cmp.FK_BD_FIRM_PROD in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) group by fk_bd_tovar, fk_supplier, FK_BD_FIRM_PROD, FK_SECTOR_PROD, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS into :fk_bd_tovar, :cena_pr, :nds, :cnt_zakaz do BEGIN INSERT into bd_order_in_11 (fk_bd_order_in_1, fk_bd_tovar, cnt, cnt_11, cena_pr_with_nds, cena_pr_without_nds, summa_with_nds, summa_without_nds, in_11, cntavt, inplace, cntinplace, cnt_tsd, cnt_stock) values (:fk_bd_order_in_1, :fk_bd_tovar, :cnt_zakaz, null, :cena_pr, :cena_pr*:cnt_zakaz/(100+:nds)/:cnt_zakaz, :cena_pr*:cnt_zakaz, :cena_pr*:cnt_zakaz/(100+:nds), 0,0,0,0,0,0); END --сохраняем ссылку на заказ в списке сырья пр плана UPDATE bd_pr_plan_cmp set fk_order_in_1=:fk_bd_order_in_1 where fk_bd_pr_plan=:fk_bd_pr_plan and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector); cnt_order=cnt_order+1; END SUSPEND; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN_ORDER_IN TO SYSDBA;cисправлено на selrecs по сгруппированным по наименованию записям16.7.16.1 SP_CREATE_BY_PR_PLAN_ORDER_IN n 2n@ ;SET TERM ^ ; ALTER TRIGGER BD_PR_ZAKAZ_FIRM_DOC_AD ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS BEGIN if (coalesce(new.type_doc,(old.type_doc))=6) then update bd_pr_zakaz_firm_prod set cnt_end=cnt_end-coalesce(old.cnt,0)+coalesce(new.cnt,0), stock_cnt_end=stock_cnt_end+coalesce(old.cnt,0)-coalesce(new.cnt,0) where field_key=coalesce(OLD.fk_bd_pr_zakaz_firm_prod, new.fk_bd_pr_zakaz_firm_prod); if (coalesce(new.type_doc,(old.type_doc))=2) then update bd_pr_zakaz_firm_prod set cnt_6=cnt_6-coalesce(old.cnt,0)+coalesce(new.cnt,0), stock_cnt_6=stock_cnt_6+coalesce(old.cnt,0)-coalesce(new.cnt,0) where field_key=coalesce(OLD.fk_bd_pr_zakaz_firm_prod, new.fk_bd_pr_zakaz_firm_prod); END^ SET TERM ; ^cкорректировка полей Произведено и Произвести по позиции заказа на участок16.7.16.1BD_PR_ZAKAZ_FIRM_DOC_ADP 7;%SET TERM ^ ; CREATE or alter PROCEDURE sp_calc_cash ( fk_calc integer ) RETURNS ( cash varchar(500) ) AS DECLARE VARIABLE tmp varchar(20); BEGIN cash=(select is_sbor from bd_calc where field_key=:fk_calc); cash=cash||'p'; for select fk_bd_tovar||'='||norma||'+' from BD_CALC_PRODUCT p where p.FK_CALC=:fk_calc order by fk_bd_tovar into :tmp do cash=cash||:tmp; cash=cash||'c'; for select fk_bd_tovar||'='||norma||'+' from BD_CALC_COMPONENT p where p.FK_CALC=:fk_calc order by fk_bd_tovar into :tmp do cash=cash||:tmp; suspend; END^ SET TERM ; ^cвычисление кеша ттк для последующего сравнения16.7.16.1sp_calc_cashv Mm)UPDATE BD_CHILD_DOCS SET DOC_TYPE = 24, NAME = 'Заказ на участок', SQL = 'select a.field_key, ''Заказ на уч-к № ''||a.nomer, a.date_create, a.fk_bd_firm, skl.name||'' - ''||sector.name, null, null, null, null from BD_PR_ZAKAZ_FIRM a join bd_firm skl on skl.field_key=a.fk_bd_firm join a_sector sector on sector.fk_bd_firm_prod=skl.field_key where a.field_key=:fk_parent' WHERE doc_type=24 and fk_parent is null; INSERT INTO BD_CHILD_DOCS (DOC_TYPE, NAME, SQL) VALUES (27, 'Производственный план', 'select a.field_key, ''План № ''||a.nomer, a.date_create, null, null, a.FK_FIRM_RECIPIENT, rec.name, a.summa_rash, null from BD_PR_PLAN a left join bd_firm rec on rec.field_key=a.FK_FIRM_RECIPIENT where a.field_key=:fk_parent'); INSERT INTO BD_CHILD_DOCS (DOC_TYPE, NAME, SQL, FK_PARENT) VALUES (24, 'Заказ на участок', 'select a.field_key, ''Заказ на уч-к № ''||a.nomer, a.date_create, a.fk_bd_firm, skl.name||'' - ''||sector.name, null, null, null, null,null from BD_PR_ZAKAZ_FIRM a join bd_firm skl on skl.field_key=a.fk_bd_firm join a_sector sector on sector.fk_bd_firm_prod=skl.field_key where a.fk_bd_pr_plan=:fk_parent', (select first 1 field_key from BD_CHILD_DOCS where DOC_TYPE=27 and FK_PARENT is null));cв связи добавлены пр план и исправлен sql для заказа на участок16.7.16.1 bd_child_docsle SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^cУбирать из bd_ch2 ссылки на удаленые расходы16.7.16.1SP_CH_TO_RASH_22_OP  | ? 'SET TERM ^ ; CREATE OR ALTER trigger tr_bd2_delete for bd_2 active after delete position 0 AS declare variable fk_ch2 integer; declare variable fk_bd_1 integer; declare variable ex_22 integer; BEGIN update bd_egais_reqs set fk_doc=null where fk_doc=old.field_key; delete from BD_PR_ZAKAZ_6 where fk_bd_2=old.FIELD_KEY; update BD_PR set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr set bd_pr.valid_flag=0 where fk_bd_1 is null and fk_bd_2 is null; update bd_9 set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update BD_RETROBONUS set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr_zf_prod_prep set fk_bd_2=null, done=0 where fk_bd_2=old.field_key; delete from BD_WAY_LIST_11 where fk_bd_2 = old.FIELD_KEY; if ((old.COD_RASH in ('0','3','7'))) then begin if (exists(select first 1 1 from bd_22 where fk_bd_2=old.FIELD_KEY)) then ex_22=1; else ex_22=0; for select bd_ch2.FIELD_KEY from bd_ch2 where fk_bd_Firm=old.FK_BD_FIRM and date_close=old.DATE_RASH and fk_bd_2=old.FIELD_KEY into :fk_ch2 do begin update bd_ch2 set fk_bd_2=null, bd_ch2.ACCEPT_FLAG=0 where field_key=:fk_ch2; if (ex_22=1) then update bd_ch21 set bd_ch21.ACCEPT_FLAG=0 where fk_bd_ch2=:fk_ch2; end end --удаление излишков, созданных по расходу for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=old.FIELD_KEY into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end END^ SET TERM ; ^cПри удалении расходов очищать ссылки в чеках по расходам с кодами 0,3,716.7.16.1tr_bd2_deleteg k%3SET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variabоведенные документы по позициям заказа на участок --сначала акты производства select name_calc, coalesce(is_sbor,0), coalesce(doprash,0) from bd_calc where field_key=:fk_bd_calc into :name_calc, :is_sbor, :doprash; --заголовок акта производства INSERT INTO BD_PR (FIELD_KEY, DATE_PR, NOMER_PR, VALID_FLAG, FK_BD_USERS, FK_BD_FIRM, NAME_PR, SUM_SEB, FK_BD_1, FK_BD_2, DOPRASH, FK_BD_CALC, PR_IS_SBOR, fk_bd_calc_sector) VALUES (:fk_pr, current_date, (select coalesce(max(nomer_pr)+1,1) from BD_PR where fk_bd_firm=:fk_firm_prod), 0, (select field_key from BD_USERS where upper(login)=upper(current_user)), :fk_firm_prod, :name_calc, 0, null, null, :DOPRASH,:FK_BD_CALC, :is_sbor, :fk_sector_prod) returning (field_key) into :fk_pr; --продукты по акту производства for select iif(:fk_bd_tovar=p.fk_bd_tovar,0,1), p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=1) union select iif(:fk_bd_tovar=c.fk_bd_tovar,0,1), c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=0) order by 1 into :no_tovar_zakaz, :fk_bd_tovar_prod, :cnt_prod do begin if (no_tovar_zakaz=0) then koef=cnt_pr/cnt_prod; --исходный товар: корректируем коэффициент if (IS_SBOR=1) then begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end else begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end end --сырье по акту производства for select p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=0) union select c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=1) into :fk_bd_tovar_cmp, :cnt_cmp do begin cnt_cmp=cnt_cmp*koef; if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end end --проводим акт производства res=(SELECT p.RES FROM SP_CREATE_BY_PR(:FK_PR, 1, '') p); cnt_fifo=0; --сохраняем ссылку на акт пр-ва for select p.FIELD_KEY, stock_cnt_end, stock_cnt_6, p.FK_BD_FIRM, p.FK_RECIPIENT_SECTOR from BD_PR_ZAKAZ_FIRM_PROD p where ((:fk=p.field_key)or((:hndl is not null)and(p.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and (p.stock_cnt_end>0)and(p.fk_bd_firm_prod=:fk_firm_prod)and(p.fk_bd_calc_sector=:fk_sector_prod)and(p.fk_bd_tovar=:fk_bd_tovar)and(p.fk_bd_calc=:fk_bd_calc) order by p.field_key into :fk_zf_prod, :cnt_end, :cnt_6, :fk_recipient, :fk_recipient_sector do begin if (cnt_pr>0) then begin if (cnt_pr>cnt_end) then cnt_fifo=cnt_end; else cnt_fifo=cnt_pr; cnt_pr=cnt_pr-cnt_fifo; INSERT INTO BD_PR_ZAKAZ_FIRM_DOC (FK_BD_PR_ZAKAZ_FIRM_PROD, FK_DOC, TYPE_DOC, cnt) VALUES ( :fk_zf_prod, :fk_pr,6,:cnt_fifo); --подготовка к перемещению, перемещаем столько, сколько произвели или меньше if (cnt_6>=cnt_fifo) then begin INSERT INTO BD_PR_ZF_PROD_PREP (FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prod, :FK_BD_TOVAR, :cnt_fifo, null, :fk_recipient); end end end END^ SET TERM ; ^cсоздание акта производства и подготовки к перемещению16.7.16.1SP_CREATE_BY_ZF_PROD  j Q3GSET TERM ^ ; ALTER PROCEDURE SP_PR_ZAK_FIRM_PREP_TO_RASH_6 ( fk integer, HNDL Integer, LANG Varchar(2) DEFAULT 'RU' ) AS declare variable FK_PROD integer; declare variable FK_TOVAR integer; declare variable FK_11 integer; declare variable CNT decimal(7,3); declare variable FK_RECIPIENT integer; declare variable FK_SUPPLIER integer; declare variable FK_BD_USERS integer; declare variable FK_BD_2 integer; declare variable NOMER_RASH integer; declare variable CENA_NDS decimal(12,5); declare variable CENA_NONDS decimal(12,5); declare variable NDS integer; declare variable ACC integer; declare variable ACC_DEC decimal(12,3); declare variable I integer; declare variable HNDL_2 integer; declare variable FK_BD_1_NEW integer; declare variable FK_PREP integer; begin select BD_USERS.FIELD_KEY from BD_USERS where upper(login)=upper(current_user) into :fk_bd_users; hndl_2=-1*(TRUNC(RAND() * 10000)+30000); for select prep.field_key, prep.fk_prod, prep.fk_bd_tovar, prep.cnt, prep.fk_bd_11, prep.fk_recipient from bd_pr_zf_prod_prep prep -- join z_selrecs z o [ ?SET TERM ^ ; CREATE or alter PROCEDURE SP_CREATE_BY_ZF_PROD_PREP ( FK Integer, HNDL Integer ) RETURNS ( cnt integer ) AS DECLARE VARIABLE fk_zf_prod integer; DECLARE VARIABLE fk_recipient integer; DECLARE VARIABLE cnt_6 decimal(7,3); DECLARE VARIABLE fk_bd_tovar integer; DECLARE VARIABLE cnt_6_old decimal(7,3); BEGIN cnt=0; for select p.FIELD_KEY, stock_cnt_6, p.FK_BD_FIRM, p.fk_bd_tovar from BD_PR_ZAKAZ_FIRM_PROD p where ((:fk=p.field_key)or((:hndl is not null)and(p.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and (p.stock_cnt_6>0) order by p.field_key into :fk_zf_prod, :cnt_6, :fk_recipient, :fk_bd_tovar do begin --смотрим, сколько непроведенных подготовок к перемещению уже создано по этой позиции зну cnt_6_old=coalesce((select sum(cnt) from BD_PR_ZF_PROD_PREP p where p.FK_PROD=:fk_zf_prod and coalesce(done,0)=0),0); cnt_6=cnt_6-cnt_6_old; if (cnt_6>0) then begin --подготовка к перемещению, перемещаем столько, сколько произвели или меньше INSERT INTO BD_PR_ZF_PROD_PREP (FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prod, :FK_BD_TOVAR, :cnt_6, null, :fk_recipient); cnt=cnt+1; end end suspend; END^ SET TERM ; ^cсоздание подготовок к перемещению16.7.16.1SP_CREATE_BY_ZF_PROD_PREPc 3U5SET TERM ^ ; create or alter PROCEDURE SP_CREATE_BY_ZF_PROD (fk_firm_prod integer, fk_sector_prod integer, fk_bd_tovar integer, fk_bd_calc integer, cnt_pr decimal(7,3), fk integer, hndl integer ) AS DECLARE VARIABLE fk_pr integer; DECLARE VARIABLE is_sbor integer; DECLARE VARIABLE name_calc type of column bd_calc.NAME_CALC; DECLARE VARIABLE doprash type of column bd_calc.doprash; DECLARE VARIABLE fk_zf_prod integer; DECLARE VARIABLE cnt_prod type of column BD_CALC_PRODUCT.NORMA; DECLARE VARIABLE no_tovar_zakaz integer; declare variable fk_bd_tovar_prod integer; declare variable cnt_fifo decimal(7,3); declare variable cnt_end decimal(7,3); declare variable cnt_6 decimal(7,3); declare variable fk_recipient integer; declare variable fk_recipient_sector integer; DECLARE VARIABLE koef decimal(15,2); declare variable fk_bd_tovar_cmp integer; declare variable cnt_cmp decimal(7,3); declare variable RES Varchar(100); BEGIN --формируем непn z.fkbd=prep.field_key and z.frmhandle=:hndl --order by fk_recipient where ((:fk=prep.field_key)or((:hndl is not null)and(prep.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and coalesce(prep.done,0)=0 into :fk_prep, :fk_prod, :fk_tovar, :cnt, :fk_11, :fk_recipient do begin select fp.fk_bd_firm_prod from bd_pr_zakaz_firm_prod fp where fp.field_key=:fk_prod into :fk_supplier; if ((fk_recipient is not null)and(fk_supplier is not null)) then begin fk_bd_2=null; select field_key from bd_2 where date_rash=current_date and fk_recipient=:fk_recipient and cod_rash=3 and fk_bd_firm=:fk_supplier and valid_flag=0 into :fk_bd_2; if (fk_bd_2 is null) then begin fk_bd_2=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_supplier); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA, VALID_FLAG, SUMMA_DOLG, fk_bd_smena2, "COMMENT") VALUES (:fk_bd_2, :nomer_rash, :nomer_rash, current_date, current_date, :FK_RECIPIENT, 3, 0, :fk_bd_users, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_supplier), :fk_supplier, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_recipient), null, 1, 0, 0, null, null, 'В прих.ценах', 1, 0, 0, (iif((select coalesce(smena_flag,0) from bd_firm where field_key=:fk_recipient)=1, (select first 1 fk_bd_smena from BD_SMENA_JOURNAL j where j.fk_bd_firm=:fk_recipient and j.active_flag=1),null)),'ВП №'||:nomer_rash||' с цеха'); insert into bd_pr_zakaz_firm_doc (fk_bd_pr_zakaz_firm_prod, fk_doc, type_doc) values (:fk_prod, :fk_bd_2, 2); insert into z_selrecs(frmhandle, fkbd) values (:hndl_2,:fk_bd_2); end select first 1 bd_11.CENA_PR_WITHOUT_NDS, bd_11.CENA_PR_WITH_NDS, bd_11.NDS from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where bd_11.FK_BD_TOVAR=:fk_tovar and bd_1.valid_flag=1 order by bd_1.NOMER_PRIH desc, bd_11.FIELD_KEY desc into :cena_nonds, :cena_nds, :nds; --округляем количество по единице измерения select coalesce(min(bd_ed_izm.accuracy),0) from bd_ed_izm join bd_tovar on BD_TOVAR.FK_BD_ED_IZM=BD_ED_IZM.FIELD_KEY where bd_tovar.field_key=:fk_tovar into acc; acc_dec=1; i=1; while (i<=acc) do begin acc_dec=acc_dec*10; i=i+1; end acc_dec=acc_dec*1.000; cnt=ceil(cnt*acc_dec)/acc_dec; --округлили if ((fk_11 is not null) and (not exists(select field_key from bd_11 where field_key=:fk_11))) then fk_11=null; INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, SUM_INPUT_MAN_FLAG, FK_BD_11) VALUES (:FK_BD_2, :FK_TOVAR, :cena_nds, :cena_nonds, :NDS, :cnt, 0, :fk_11); end update bd_pr_zf_prod_prep set done=1, fk_bd_2=:fk_bd_2 where field_key=:fk_prep; end for select fkbd from z_selrecs where frmhandle=:hndl_2 into :fk_bd_2 do begin execute procedure sp_bd2_prov(:fk_bd_2,:lang,1,:fk_bd_users); end end ^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_PR_ZAK_FIRM_PREP_TO_RASH_6 TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_PR_ZAK_FIRM_PREP_TO_RASH_6 TO SYSDBA;cисправлена выборка позиций заказа на участок16.7.16.1SP_PR_ZAK_FIRM_PREP_TO_RASH_6 }qN}: mG9SET TERM ^ ; ALTER TRIGGER BD_PR_ZF_PROD_PREP_AD0 INACTIVE AFTER DELETE POSITION 0 AS begin if (old.fk_prod is not null) then update bd_pr_zakaz_firm_prod set cnt_6=cnt_6-old.cnt where field_key=old.fk_prod; end^ SET TERM ; ^cвредный триггер16.7.16.1BD_PR_ZF_PROD_PREP_AD0 ;?SET TERM ^ ; create TRIGGER TR_BD_PR_ZF_PROD_PREP_LOG for BD_PR_ZF_PROD_PREP ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 100 AS declare variable tovar_name type of column bd_tovar.name; declare variable ed_izm type of column bd_tovar.ED_IZM_NAME; declare variable TEXTLOG type of column BD_PR_ZAKAZ_FIRM_LOG.TEXTLOG; declare variable fk_zf integer; BEGIN for select t.name, t.ED_IZM_NAME, prod.FK_BD_PR_ZAKAZ_FIRM from bd_tovar t join BD_PR_ZAKAZ_FIRM_PROD prod on prod.FK_BD_TOVAR=t.FIELD_KEY where prod.field_key=coalesce(old.fk_prod,new.fk_prod ) into :tovar_name, :ed_izm, :fk_zf do begin TEXTLOG='По позиции '||trim(tovar_name)||' '; end ---логгирование if (inserting) then begin TEXTLOG=TEXTLOG||'сформирована подготовка к перемещению, количество продукта '||new.CNT||' '||ed_izm; end if (deleting) then begin TEXTLOG=TEXTLOG||'удалена подготовка к перемещению, количество продукта '||old.CNT||' '||ed_izm; end INSERT INTO BD_PR_ZAKAZ_FIRM_LOG (LOGIN, TEXTLOG, FK_BD_PR_ZAKAZ_FIRM) VALUES (current_user, :TEXTLOG, :fk_zf); END^ SET TERM ; ^cлоггирование подготовок к перемещению16.7.16.1TR_BD_PR_ZF_PROD_PREP_LOG qCSET TERM ^ ; create TRIGGER TR_BD_PR_ZAKAZ_FIRM_DOC_LOG for BD_PR_ZAKAZ_FIRM_DOC ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 100 AS declare variable tovar_name type of column bd_tovar.name; declare variable ed_izm type of column bd_tovar.ED_IZM_NAME; declare variable TEXTLOG type of column BD_PR_ZAKAZ_FIRM_LOG.TEXTLOG; declare variable fk_zf integer; BEGIN for select t.name, t.ED_IZM_NAME, prod.FK_BD_PR_ZAKAZ_FIRM from bd_tovar t join BD_PR_ZAKAZ_FIRM_PROD prod on prod.FK_BD_TOVAR=t.FIELD_KEY where prod.field_key=coalesce(old.fk_bd_pr_zakaz_firm_prod,new.fk_bd_pr_zakaz_firm_prod ) into :tovar_name, :ed_izm, :fk_zf do begin TEXTLOG='По позиции '||trim(tovar_name)||' '; end ---логгирование if (inserting) then begin if (new.TYPE_DOC=2) then TEXTLOG=TEXTLOG||'сформирован и проведен расход, количество в расходе '||new.CNT||' '||ed_izm; if (new.TYPE_DOC=6) then TEXTLOG=TEXTLOG||'сформирован и проведен акт производства, количество продукта '||new.CNT||' '||ed_izm; end if (deleting) then begin if (new.TYPE_DOC=2) then TEXTLOG=TEXTLOG||'удален расход, количество в расходе '||old.CNT||' '||ed_izm; if (new.TYPE_DOC=6) then TEXTLOG=TEXTLOG||'удален акт производства, количество продукта '||old.CNT||' '||ed_izm; end INSERT INTO BD_PR_ZAKAZ_FIRM_LOG (LOGIN, TEXTLOG, FK_BD_PR_ZAKAZ_FIRM) VALUES (current_user, :TEXTLOG, :fk_zf); END^ SET TERM ; ^cлоггирование по документам16.7.16.1TR_BD_PR_ZAKAZ_FIRM_DOC_LOG  mg9SET TERM ^ ; ALTER TRIGGER BD_PR_ZF_PROD_PREP_AD0 INACTIVE AFTER DELETE POSITION 0 AS begin if (old.fk_prod is not null) then update bd_pr_zakaz_firm_prod set cnt_6=cnt_6-old.cnt where field_key=old.fk_prod; end^ SET TERM ; ^cлишний триггер, частично дублирует функционал BD_PR_ZAKAZ_FIRM_DOC_AD16.7.16.1BD_PR_ZF_PROD_PREP_AD0 COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA, VALID_FLAG, SUMMA_DOLG, fk_bd_smena2, "COMMENT") VALUES (:fk_bd_2, :nomer_rash, :nomer_rash, current_date, current_date, :FK_REC, 3, 0, :fk_bd_users, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_sup), :fk_sup, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_rec), null, 1, 0, 0, null, null, 'В прих.ценах', 1, 0, 0, (iif((select coalesce(smena_flag,0) from bd_firm where field_key=:fk_rec)=1, (select first 1 fk_bd_smena from BD_SMENA_JOURNAL j where j.fk_bd_firm=:fk_rec and j.active_flag=1),null)),'ВП №'||:nomer_rash||' с цеха') returning (field_key) into :fk_bd_2; --заполняем тело расхода for select prep.fk_bd_tovar, sum(prep.CNT) from bd_pr_zf_prod_prep prep join BD_PR_ZAKAZ_FIRM_PROD prod on prod.FIELD_KEY=prep.FK_PROD where ((:fk=prep.field_key)or((:hndl is not null)and(prep.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and coalesce(prep.done,0)=0 and prep.fk_recipient=:fk_rec and prod.FK_BD_FIRM_PROD=:fk_sup group by 1 into :fk_bd_tovar, :cnt_rash do begin --определяем цену select first 1 bd_11.CENA_PR_WITHOUT_NDS, bd_11.CENA_PR_WITH_NDS, bd_11.NDS from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.valid_flag=1 order by bd_1.NOMER_PRIH desc, bd_11.FIELD_KEY desc into :cena_nonds, :cena_nds, :nds; --округляем количество по единице измерения select coalesce(min(bd_ed_izm.accuracy),0) from bd_ed_izm join bd_tovar on BD_TOVAR.FK_BD_ED_IZM=BD_ED_IZM.FIELD_KEY where bd_tovar.field_key=:fk_bd_tovar into acc; acc_dec=1; i=1; while (i<=acc) do begin acc_dec=acc_dec*10; i=i+1; end acc_dec=acc_dec*1.000; cnt_rash=ceil(cnt_rash*acc_dec)/acc_dec; --округлили INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, SUM_INPUT_MAN_FLAG, FK_BD_11) VALUES (:FK_BD_2, :FK_BD_TOVAR, :cena_nds, :cena_nonds, :NDS, :cnt_rash, 0, null); --ставим ссылку на расход в преп --записываем в список документов по заказу на участок for select prep.field_key, prep.cnt, prep.fk_prod from bd_pr_zf_prod_prep prep join BD_PR_ZAKAZ_FIRM_PROD prod on prod.FIELD_KEY=prep.FK_PROD where ((:fk=prep.field_key)or((:hndl is not null)and(prep.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and coalesce(prep.done,0)=0 and prep.fk_recipient=:fk_rec and prod.fk_bd_firm_prod=:fk_sup and prep.fk_bd_tovar=:fk_bd_tovar into :fk_prep, :prep_cnt, :fk_prod do begin update bd_pr_zf_prod_prep set done=1, fk_bd_2=:fk_bd_2 where field_key=:fk_prep; insert into bd_pr_zakaz_firm_doc (fk_bd_pr_zakaz_firm_prod, fk_doc, type_doc, cnt) values (:fk_prod, :fk_bd_2, 2, :prep_cnt); end end --закончили заполнять позиции расхода --проводим расход execute procedure sp_bd2_prov(:fk_bd_2,:lang,1,:fk_bd_users); end END^ SET TERM ; ^cподготовки к перемещению в расход16.7.16.1SP_PR_ZF_PREP_TO_RASH_6 < 2-< }[GSET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_PR_PLAN_ORDER_IN ( FK_BD_PR_PLAN Integer, FRM_HNLD Integer ) RETURNS ( CNT_ORDER Integer ) AS DECLARE VARIABLE fk_bd_users integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE fk_sector integer; DECLARE VARIABLE fk_supplier integer; DECLARE VARIABLE fk_bd_order_in_1 integer; DECLARE VARIABLE fk_bd_tovar integer; DECLARE VARIABLE cnt_zakaz decimal(15,4); declare variable cena_pr decimal(15,3); dec !3%SET TERM ^ ; CREATE PROCEDURE sp_tovar_acc ( fk_bd_tovar integer, cnt_in decimal(15,3) ) RETURNS ( cnt decimal(15,3)) AS declare variable ACC integer; declare variable ACC_DEC decimal(12,3); declare variable I integer; BEGIN select coalesce(min(bd_ed_izm.accuracy),0) from bd_ed_izm join bd_tovar on BD_TOVAR.FK_BD_ED_IZM=BD_ED_IZM.FIELD_KEY where bd_tovar.field_key=:fk_bd_tovar into acc; acc_dec=1; i=1; while (i<=acc) do begin acc_dec=acc_dec*10; i=i+1; end acc_dec=acc_dec*1.000; cnt=ceil(cnt_in*acc_dec)/acc_dec; suspend; END^ SET TERM ; ^dокругление количества по ед измерения товара16.7.19.1sp_tovar_acc&  1ALTER TABLE BD_PR_PLAN_PRODUCT ALTER SEB_ED TYPE Decimal(12,4);!cдобавлено знаков в себестоимость16.7.16.1BD_PR_PLAN_PRODUCT U/#SET TERM ^ ; ALTER PROCEDURE SP_CALC_SEB ( FK_CALC Integer, WITH_NDS Integer DEFAULT 0 ) RETURNS ( SUMMA_SEB Decimal(12,3), CENA_PR Decimal(12,3), NAME Char(100), FULLNAME Char(200), NORMA Decimal(15,4), PRIM Varchar(200), HAS_0 Integer ) AS declare variable FK_BD_TOVAR integer; declare variable FK_BD_ZAMENA integer; declare variable KOEF type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_SUB_CALC integer; declare variable SUB_NORMA type of column BD_CALC_COMPONENT.NORMA; declare variable I integer; declare variable NOMER_CALC type of column BD_CALC.NOMER_CALC; declare variable SUB_TTK_HAS_0 integer; BEGIN summa_seb=0; --сначала находим все сырье без ТТК for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and not exists(select field_key from BD_CALC_PRODt  ;SET TERM ^ ; CREATE or alter PROCEDURE SP_PR_ZF_PREP_TO_RASH_6 ( FK Integer, HNDL Integer, LANG Varchar(2) DEFAULT 'RU' ) --RETURNS -- ( output_parameter_name < datatype>, ... ) AS DECLARE VARIABLE fk_rec integer; DECLARE VARIABLE fk_sup integer; DECLARE VARIABLE fk_bd_2 integer; DECLARE VARIABLE nomer_rash integer; DECLARE VARIABLE fk_bd_tovar integer; DECLARE VARIABLE cnt_rash decimal(7,3); declare variable CENA_NDS decimal(12,5); declare variable CENA_NONDS decimal(12,5); declare variable NDS integer; declare variable ACC integer; declare variable ACC_DEC decimal(12,3); declare variable I integer; declare variable fk_prep integer; declare variable fk_prod integer; declare variable prep_cnt decimal(7,3); declare variable fk_bd_users integer; BEGIN fk_bd_users=(select BD_USERS.FIELD_KEY from BD_USERS where upper(login)=upper(current_user)); --заголовки расходов - группируем по отправителю и получателю for select prep.fk_recipient, prod.FK_BD_FIRM_PROD from bd_pr_zf_prod_prep prep join BD_PR_ZAKAZ_FIRM_PROD prod on prod.FIELD_KEY=prep.FK_PROD where ((:fk=prep.field_key)or((:hndl is not null)and(prep.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and coalesce(prep.done,0)=0 into :fk_rec, :fk_sup do begin --создаем заголовок расхода nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_sup); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT,UCT where fk_bd_tovar=c.fk_bd_tovar) and coalesce(norma,0)>0 into :fk_bd_tovar, :norma do begin has_0=0; prim=null; cena_pr=0; --находим ПЦ select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; prim='Последняя приходная цена'; -- suspend; -- exit; /*if (coalesce(cena_pr,0)=0) then begin --последняя Пц на остатках select first 1 iif(:with_nds=1,cena_pr_with_nds,cena_pr_without_nds) from bd_11 where fk_bd_tovar=:fk_bd_tovar and stock>0 and valid_flag=1 order by date_prih desc, field_key desc into :cena_pr; prim='Последняя приходная цена на остатках'; end if (coalesce(cena_pr,0)=0) then begin select first 1 iif(:with_nds=1,cena_pr_with_nds,cena_pr_without_nds) from bd_11 where fk_bd_tovar=:fk_bd_tovar and not exists(select field_key from BD_TOVAR_ZAMENA where fk_bd_tovar_in_calc=:fk_bd_tovar) order by date_prih desc, field_key desc into :cena_pr; prim='Последняя приходная цена'; end --по спецификации if (coalesce(cena_pr,0)=0) then begin select first 1 iif(:with_nds=1,cena_pr,cena_pr_without_nds) from bd_sps11 where fk_bd_tovar=:fk_bd_tovar into :cena_pr; prim='ПЦ из спецификации'; end i=0; if (coalesce(cena_pr,0)=0) then begin i=i+1; --ищем по таблице замен for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA where fk_bd_tovar_in_calc=:fk_bd_tovar and koef>0 order by priority into :fk_bd_zamena, :koef do begin --последний приход select first 1 iif(:with_nds=1,cena_pr_with_nds,cena_pr_without_nds) from bd_11 where fk_bd_tovar=:fk_bd_zamena order by date_prih desc, field_key desc into :cena_pr; prim='Последняя приходная цена (замена '||i||')'; --спецификация if (coalesce(cena_pr,0)=0) then begin select first 1 iif(:with_nds=1,cena_pr,cena_pr_without_nds) from bd_sps11 where fk_bd_tovar=:fk_bd_tovar into :cena_pr; prim='ПЦ из спецификации (замена '||i||')'; end cena_pr=cena_pr/koef; prim=prim||'(с коэффициентом замены '||koef||')'; if (cena_pr>0) then break; end end */ select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (coalesce(cena_pr,0)=0) then begin prim='цена не найдена'; has_0=1; end suspend; end --товары с ТТК - находим ТТК, по ней рекурсивно получаем сумму себ for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and exists(select field_key from BD_CALC_PRODUCT where fk_bd_tovar=c.fk_bd_tovar) and coalesce(norma,0)>0 into :fk_bd_tovar, :norma do begin cena_pr=0; --находим ТТК select first 1 pr.fk_calc, norma, nomer_calc from BD_CALC_PRODUCT pr join bd_calc on BD_CALC.FIELD_KEY=pr.fk_calc where bd_calc.valid_flag=1 and pr.fk_bd_tovar=:fk_bd_tovar into :fk_sub_calc, :sub_norma, :nomer_calc; prim='Расчет по ТТК №'||nomer_calc; --находим себ по ТТК select max(summa_seb), max(has_0) from sp_calc_seb(:fk_sub_calc, :with_nds) into :cena_pr, :sub_ttk_has_0; cena_pr=cena_pr/sub_norma; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (sub_ttk_has_0=1) then has_0=1; suspend; end --suspend; END^ SET TERM ; ^ cисправлены типы данных у себестоимости и пр цены. прибавлено количество знаков16.7.16.1SP_CALC_SEBlare variable nds integer; declare variable fk_dogovor integer; declare variable cod_prih integer; declare variable day_cons_prih integer; declare variable fk_selful integer; BEGIN FK_BD_USERS=(select field_key from BD_USERS where upper(login)=upper(current_user)); cnt_order=0; FOR SELECT distinct a.FK_BD_FIRM_PROD, a.FK_SECTOR_PROD, a.FK_SUPPLIER FROM BD_PR_PLAN_CMP a where (fk_bd_pr_plan=:fk_bd_pr_plan) and (CNT-stock)>0 and (a.FK_ORDER_IN_1 is null) and (is_pf=0) and ((:FRM_HNLD is null)or(a.fk_bd_tovar||'.'||a.FK_BD_FIRM_PROD in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) into :fk_bd_firm, :fk_sector, :fk_supplier DO BEGIN --условия прихода для поставщика SELECT p.FK_DOGOVOR, p.COD_PRIH, p.DAY_CONS_PRIH, p.FK_SELFUL FROM SP_GET_COD_PRIH(:FK_SUPPLIER, :FK_BD_FIRM) p into :fk_dogovor, :cod_prih, :day_cons_prih, :fk_selful; --вставляем заголовок заказа INSERT into BD_ORDER_IN_1 (FK_BD_FIRM, DATE_ORDER, TIME_ORDER, DATE_DELIVERY, SEND_FLAG, FK_SUPPLIER, FK_PFIRM_SUPPLIER, CLOSE_FLAG, VALID_FLAG, FK_SELFUL, COD_PRIH, DAY_CONS_PRIH, PRIM, SUMMA, FK_SELFUL_FROM, RECEIVED_FLAG, RECEIVED_TS, SEND_DATE, SEND_TIME, FK_BD_USERS, FK_BD_DOGOVOR, fk_bd_firm_sector) values (:fk_bd_firm,current_date,current_time,current_date,0,:fk_supplier, (select first 1 field_key from bd_pfirm where fk_bd_firm=:fk_supplier), 0,0,:fk_selful, :cod_prih, :day_cons_prih, '', 0, null, 0, null, null, null, :fk_bd_users, :fk_dogovor, :FK_SECTOR) returning (field_key) into :fk_bd_order_in_1; --позиции заказа FOR select fk_bd_tovar, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS, sum(cnt)-sum(stock) from bd_pr_plan_cmp join BD_TOVAR on BD_TOVAR.field_key=bd_pr_plan_cmp.FK_BD_TOVAR where fk_bd_pr_plan=:fk_bd_pr_plan and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector) and (is_pf=0) and ((:FRM_HNLD is null)or(bd_pr_plan_cmp.fk_bd_tovar||'.'||bd_pr_plan_cmp.FK_BD_FIRM_PROD in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:FRM_HNLD))) group by fk_bd_tovar, fk_supplier, FK_BD_FIRM_PROD, FK_SECTOR_PROD, BD_TOVAR.LAST_CENA_PR, BD_TOVAR.NDS into :fk_bd_tovar, :cena_pr, :nds, :cnt_zakaz do BEGIN cnt_zakaz=(select cnt from SP_TOVAR_ACC(:fk_bd_tovar,:cnt_zakaz)); INSERT into bd_order_in_11 (fk_bd_order_in_1, fk_bd_tovar, cnt, cnt_11, cena_pr_with_nds, cena_pr_without_nds, summa_with_nds, summa_without_nds, in_11, cntavt, inplace, cntinplace, cnt_tsd, cnt_stock) values (:fk_bd_order_in_1, :fk_bd_tovar, :cnt_zakaz, null, :cena_pr, :cena_pr*:cnt_zakaz/(100+:nds)/:cnt_zakaz, :cena_pr*:cnt_zakaz, :cena_pr*:cnt_zakaz/(100+:nds), 0,0,0,0,0,0); END --сохраняем ссылку на заказ в списке сырья пр плана UPDATE bd_pr_plan_cmp set fk_order_in_1=:fk_bd_order_in_1 where fk_bd_pr_plan=:fk_bd_pr_plan and (CNT-stock)>0 and (FK_ORDER_IN_1 is null) and (fk_supplier=:fk_supplier)and (FK_BD_FIRM_PROD=:fk_bd_firm)and(FK_SECTOR_PROD=:fk_sector); cnt_order=cnt_order+1; END SUSPEND; END ^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN_ORDER_IN TO SYSDBA;dдобавлено округление16.7.19.1SP_CREATE_BY_PR_PLAN_ORDER_IN_pr)+1,1) from BD_PR where fk_bd_firm=:fk_firm_prod), 0, (select field_key from BD_USERS where upper(login)=upper(current_user)), :fk_firm_prod, :name_calc, 0, null, null, :DOPRASH,:FK_BD_CALC, :is_sbor, :fk_sector_prod) returning (field_key) into :fk_pr; --продукты по акту производства for select iif(:fk_bd_tovar=p.fk_bd_tovar,0,1), p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=1) union select iif(:fk_bd_tovar=c.fk_bd_tovar,0,1), c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=0) order by 1 into :no_tovar_zakaz, :fk_bd_tovar_prod, :cnt_prod do begin if (no_tovar_zakaz=0) then koef=cnt_pr/cnt_prod; --исходный товар: корректируем коэффициент if (IS_SBOR=1) then begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end else begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end end --сырье по акту производства for select p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=0) union select c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=1) into :fk_bd_tovar_cmp, :cnt_cmp do begin cnt_cmp=cnt_cmp*koef; if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end end --проводим акт производства res=(SELECT p.RES FROM SP_CREATE_BY_PR(:FK_PR, 1, '') p); cnt_fifo=0; cc_in=(select cash from SP_CALC_CASH(:FK_BD_CALC)); --сохраняем ссылку на акт пр-ва for select p.FIELD_KEY, stock_cnt_end, stock_cnt_6, p.FK_BD_FIRM, p.FK_RECIPIENT_SECTOR, (select cash from SP_CALC_CASH(p.FK_BD_CALC)) as cc from BD_PR_ZAKAZ_FIRM_PROD p where ((:fk=p.field_key)or((:hndl is not null)and(p.field_key in (select fkbd from Z_SELRECS z where z.FRMHANDLE=:hndl)))) and (p.stock_cnt_end>0)and(p.fk_bd_firm_prod=:fk_firm_prod)and(p.fk_bd_calc_sector=:fk_sector_prod)and(p.fk_bd_tovar=:fk_bd_tovar) order by p.field_key into :fk_zf_prod, :cnt_end, :cnt_6, :fk_recipient, :fk_recipient_sector, :cc do begin if ((cnt_pr>0)and(cc=cc_in)) then begin if (cnt_pr>cnt_end) then cnt_fifo=cnt_end; else cnt_fifo=cnt_pr; cnt_pr=cnt_pr-cnt_fifo; INSERT INTO BD_PR_ZAKAZ_FIRM_DOC (FK_BD_PR_ZAKAZ_FIRM_PROD, FK_DOC, TYPE_DOC, cnt) VALUES ( :fk_zf_prod, :fk_pr,6,:cnt_fifo); --подготовка к перемещению, перемещаем столько, сколько произвели или меньше --смотрим, сколько непроведенных подготовок к перемещению уже создано по этой позиции зну cnt_6_old=coalesce((select sum(cnt) from BD_PR_ZF_PROD_PREP p where p.FK_PROD=:fk_zf_prod and coalesce(done,0)=0),0); cnt_6=cnt_6-cnt_6_old; --if ((cnt_fifo>0)and(cnt_fifo0) then begin INSERT INTO BD_PR_ZF_PROD_PREP (FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prod, :FK_BD_TOVAR, :cnt_fifo, null, :fk_recipient); end end end END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_ZF_PROD TO SYSDBA;dучет уже подготовленных к перемещению позиций16.7.19.1SP_CREATE_BY_ZF_PROD  ;V gyCupdate BD_USERS_RIGHTS_NAME a set parent=(select field_key from BD_USERS_RIGHTS_NAME where name_var='ERP') where name_var in ('pr_plan','journal_zakaz_firm', 'pr_stakan'); update BD_USERS_RIGHTS_NAME set name='Журнал заказов на участок' where name_var='journal_zakaz_firm';dперенос стакана, заказов на участок и пр плана в пункт ERP в праваз16.7.19.1update BD_USERS_RIGHTS_NAMES a /SET TERM ^ ; ALTER PROCEDURE SP_GET_PARENT_DOC ( FK_DOC Integer, TYPE_DOC Integer ) RETURNS ( FK_PARENT Integer, TYPE_PARENT Integer ) AS BEGIN if (type_doc=1) then ---приход begin for select field_key from bd_9 where fk_bd_1=:fk_doc into :fk_parent do begin --ревизия type_parent=5; suspend; exit; end for select field_key from bd_pr where fk_bd_1=:fk_doc into :fk_parent do begin --акт пр-ва type_parent=6; suspend; exit; end for select fk_bd_2 from BD_2_1_IZL where fk_bd_1=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end for select field_key from BD_2 where fk_bd_1_6=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end for select FK_ORDER_IN from BD_1 where field_key=:fk_doc into :fk_parent do begin --заказ пост type_parent=3; suspend; exit; end end ---расход if (type_doc=2) then begin for select field_key from bd_9 where fk_bd_2=:fk_doc into :fk_parent do begin --ревизия type_parent=5; suspend; exit; end for select field_key from bd_pr where fk_bd_2=:fk_doc into :fk_parent do begin --акт пр-ва type_parent=6; suspend; exit; end for select fk_bd_order_out_1 from bd_2 where field_key=:fk_doc and fk_bd_order_out_1 is not null into :fk_parent do begin --зая9 }75SET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_ZF_PROD ( FK_FIRM_PROD Integer, FK_SECTOR_PROD Integer, FK_BD_TOVAR Integer, FK_BD_CALC Integer, CNT_PR Decimal(7,3), FK Integer, HNDL Integer ) AS DECLARE VARIABLE fk_pr integer; DECLARE VARIABLE is_sbor integer; DECLARE VARIABLE name_calc type of column bd_calc.NAME_CALC; DECLARE VARIABLE doprash type of column bd_calc.doprash; DECLARE VARIABLE fk_zf_prod integer; DECLARE VARIABLE cnt_prod type of column BD_CALC_PRODUCT.NORMA; DECLARE VARIABLE no_tovar_zakaz integer; declare variable fk_bd_tovar_prod integer; declare variable cnt_fifo decimal(7,3); declare variable cnt_end decimal(7,3); declare variable cnt_6 decimal(7,3); declare variable cnt_6_old decimal(7,3); declare variable fk_recipient integer; declare variable fk_recipient_sector integer; DECLARE VARIABLE koef decimal(15,2); declare variable fk_bd_tovar_cmp integer; declare variable cnt_cmp decimal(7,3); declare variable RES Varchar(100); declare variable cc Varchar(500); declare variable cc_in Varchar(500); BEGIN --формируем непроведенные документы по позициям заказа на участок --сначала акты производства select name_calc, coalesce(is_sbor,0), coalesce(doprash,0) from bd_calc where field_key=:fk_bd_calc into :name_calc, :is_sbor, :doprash; --заголовок акта производства INSERT INTO BD_PR (FIELD_KEY, DATE_PR, NOMER_PR, VALID_FLAG, FK_BD_USERS, FK_BD_FIRM, NAME_PR, SUM_SEB, FK_BD_1, FK_BD_2, DOPRASH, FK_BD_CALC, PR_IS_SBOR, fk_bd_calc_sector) VALUES (:fk_pr, current_date, (select coalesce(max(nomerка покупателя type_parent=4; suspend; exit; end for select field_key from bd_retrobonus where fk_bd_2 = :fk_doc into :fk_parent do begin --ретробонус type_parent = 8; suspend; exit; end for select field_key from bd_pr_zakaz_firm where field_key in (select fk_bd_pr_zakaz_firm from bd_pr_zakaz_firm_doc join bd_pr_zakaz_firm_prod on bd_pr_zakaz_firm_doc.FK_BD_PR_ZAKAZ_FIRM_PROD=bd_pr_zakaz_firm_prod.field_key where bd_pr_zakaz_firm_doc.fk_doc = :fk_doc and bd_pr_zakaz_firm_doc.type_doc=2) into :fk_parent do begin --заказ на уч-к type_parent = 24; suspend; exit; end for select field_key from bd_pr_zakaz where field_key in (select fk_bd_pr_zakaz from bd_pr_zakaz_6 where fk_bd_2 = :fk_doc) into :fk_parent do begin --заказ на пр-во type_parent = 9; suspend; exit; end end ---заказ поставщику if (type_doc=3) then begin --консол. заявка for select fk_bd_order_sum from bd_order_in_1 where field_key = :fk_doc into :fk_parent do begin type_parent = 10; suspend; exit; end end ---заявка покупателя if (type_doc=4) then begin --заказ поставщику for select fk_bd_order_in_1 from bd_order_out_1 where field_key = :fk_doc into :fk_parent do begin type_parent = 3; suspend; exit; end end ---акт пр-ва if (type_doc=6) then begin for select field_key from bd_pr_zakaz_firm where field_key in (select fk_bd_pr_zakaz_firm from bd_pr_zakaz_firm_doc join bd_pr_zakaz_firm_prod on bd_pr_zakaz_firm_doc.FK_BD_PR_ZAKAZ_FIRM_PROD=bd_pr_zakaz_firm_prod.field_key where bd_pr_zakaz_firm_doc.fk_doc = :fk_doc and bd_pr_zakaz_firm_doc.type_doc=6) into :fk_parent do begin --заказ на уч-к type_parent = 24; suspend; exit; end for select field_key from bd_pr_zakaz where field_key in (select fk_bd_pr_zakaz from bd_pr_zakaz_pr where fk_bd_pr = :fk_doc) into :fk_parent do begin --заказ на пр-во type_parent = 9; suspend; exit; end for select field_key from BD_2 where fk_bd_1_6=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end end ---акт несоотв. if (type_doc=7) then begin for select fk_bd_1 from bd_act_diff where field_key = :fk_doc into :fk_parent do begin --приход type_parent = 1; suspend; exit; end end ---акт ревизии if (type_doc=11) then begin for select fk_bd_9 from bd_9_act where field_key = :fk_doc into :fk_parent do begin --ревизия type_parent = 5; suspend; exit; end end ---заказ на уч-к if (type_doc=24) then begin --пр-ный план for select FK_BD_PR_PLAN from bd_pr_zakaz_firm where field_key = :fk_doc into :fk_parent do begin type_parent = 27; suspend; exit; end end --любой тип документов - может быть порожден фин отчетом for select d.FK_BD_9_ACT from BD_9_ACT_DOC d where d.fk_bd_doc=:fk_doc and d.type_doc=:type_doc into :fk_parent do begin --фин отчет type_parent=15; suspend; exit; end --любой тип документов - может быть порожден макросом for select d.Fk_bd_macros_j from BD_MACROS_J_DOC d where d.fk_bd_doc=:fk_doc and d.type_doc=:type_doc into :fk_parent do begin --макрос type_parent=14; suspend; exit; end suspend; END^ SET TERM ; ^dдобавлен производственный план в качестве родителя заказа на участок16.7.19.1SP_GET_PARENT_DOC 1 ;s-SET TERM ^ ; create or ALTER PROCEDURE SP_CALC_SEB_PLAN ( FK_CALC Integer, WITH_NDS Integer DEFAULT 0 ) RETURNS ( SUMMA_SEB Decimal(12,3), CENA_PR Decimal(12,3), NAME Char(100), FULLNAME Char(200), NORMA Decimal(15,4), PRIM Varchar(200), HAS_0 Integer ) AS declare variable FK_BD_TOVAR integer; declare variable FK_BD_ZAMENA integer; declare variable KOEF type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_SUB_CALC integer; declare variable SUB_NORMA type of column BD_CALC_COMPONENT.NORMA; declare variable I integer; declare variable NOMER_CALC type of column BD_CALC.NOMER_CALC; declare variable SUB_TTK_HAS_0 integer; declare variable is_sbor integer; declare variable sub_sbor integer; BEGIN summa_seb=0; is_sbor=coalesce((select is_sbor from bd_calc where field_key=:fk_calc),0); --сначала находим все сырье без ТТК for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and coalesce(c.norma,0)>0 and (:is_sbor=1) union select fk_bd_tovar, coalesce(norma,0) from BD_CALC_PRODUCT p where p.fk_calc=:fk_calc and coalesce(p.norma,0)>0 and (:is_sbor=0) into :fk_bd_tovar, :norma do begin --ищем, есть ли ТТК у компонента fk_sub_calc=null; fk_sub_calc= ( select max(fk) from ( select bd_calc.field_key as fk from bd_calc join bd_calc_product pr on pr.fk_calc=bd_calc.field_key where pr.fk_bd_tovar=:FK_BD_TOVAR and BD_CALC.valid_flag=1 and bd_calc.is_sbor=1 union select bd_calc.field_key as fk from bd_calc join BD_CALC_COMPONENT c on c.fk_calc=bd_calc.field_key where c.fk_bd_tovar=:FK_BD_TOVAR and BD_CALC.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=0 ) ); if (fk_sub_calc is null) then begin --простое сырье has_0=0; prim=null; cena_pr=0; --находим ПЦ select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; prim='Последняя приходная цена'; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (coalesce(cena_pr,0)=0) then begin prim='цена не найдена'; has_0=1; end suspend; end else begin --полуфабрикат select bd_calc.NOMER_CALC, is_sbor from BD_CALC where field_key=:fk_sub_calc into :nomer_calc, :sub_sbor; prim='Расчет по ТТК №'||nomer_calc; if (sub_sbor=1) then sub_norma=(select norma from BD_CALC_PRODUCT where fk_calc=:fk_sub_calc and fk_bd_tovar=:fk_bd_tovar); else sub_norma=(select norma from BD_CALC_COMPONENT where fk_calc=:fk_sub_calc and fk_bd_tovar=:fk_bd_tovar); --находим себ по ТТК select max(summa_seb), max(has_0) from sp_calc_seb_plan(:fk_sub_calc, :with_nds) into :cena_pr, :sub_ttk_has_0; cena_pr=cena_pr/sub_norma; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (sub_ttk_has_0=1) then has_0=1; suspend; end end --товары с ТТК - находим ТТК, по ней рекурсивно получаем сумму себ --suspend; END ^ SET TERM ; ^dрасчет себестоимости по ттк16.7.19.1SP_CALC_SEB_PLANтом date1=cast('01.01.'||(cast (cyear as char(4))) as date); date2=cast('01.04.'||(cast (cyear as char(4))) as date); end if (cquarter=2) then begin date1=cast('01.04.'||(cast (cyear as char(4))) as date); date2=cast('01.07.'||(cast (cyear as char(4))) as date); end if (cquarter=3) then begin date1=cast('01.07.'||(cast (cyear as char(4))) as date); date2=cast('01.10.'||(cast (cyear as char(4))) as date); end if (cquarter=4) then begin date1=cast('01.10.'||(cast (cyear as char(4))) as date); date2=cast('01.01.'||(cast (cyear+1 as char(4))) as date); end zapr=0; sogl=0; fact=0; if (cfo<>0) then begin --по конкретному ЦФО select sum(coalesce(zaprosheno,0)), sum(coalesce(soglasovano,0)) from bd_budget_cfo11 join bd_budget_cfo on bd_budget_cfo.field_key=bd_budget_cfo11.fk_bd_budget_cfo where fk_stat=:stat and is_actual=1 and fk_kind=:kind and is_arh<>1 and valid_flag=1 and fk_cfo=:cfo -- and tip=3 and quarter_num=:cquarter -- and year_num=:cyear into :zapr, :sogl; select SUMMA_PLAT from SP_SUM_BUDGET_PLAT_BY_STAT(:is_bdds, :cfo, :stat, :date1, :date2) into :fact; end else begin --по всем ЦФО select sum(coalesce(zaprosheno,0)), sum(coalesce(soglasovano,0)) from bd_budget_cfo11 join bd_budget_cfo on bd_budget_cfo.field_key=bd_budget_cfo11.fk_bd_budget_cfo join bd_budget_j_cfo bcfo on bd_budget_cfo.fk_cfo=bcfo.field_key where fk_stat=:stat and is_actual=1 and fk_kind=:kind and is_arh<>1 and valid_flag=1 and bcfo.active_flag=1 and tip=3 and quarter_num=:cquarter -- and year_num=:cyear into :zapr, :sogl; select SUMMA_PLAT from SP_SUM_BUDGET_CONSOL_BY_STAT(:is_bdds, :stat, :date1, :date2) into :fact; end zapr=coalesce(zapr,0); sogl=coalesce(sogl,0); fact=coalesce(fact,0); suspend; if (cquarter=4) then begin cquarter=1; cyear=cyear+1; end else begin cquarter=cquarter+1; end end --while end --tip=3 if (tip=12) then begin cyear=year1; while (cyear<=year2) do begin select name from SP_GET_BUDGET_PERIOD_NAME(12,0,0,:cyear) into :name; date1=cast('01.01.'||(cast (cyear as char(4))) as date); date2=cast('01.01.'||(cast (cyear+1 as char(4))) as date); zapr=0; sogl=0; fact=0; if (cfo<>0) then begin --по конкретному ЦФО select sum(coalesce(zaprosheno,0)), sum(coalesce(soglasovano,0)) from bd_budget_cfo11 join bd_budget_cfo on bd_budget_cfo.field_key=bd_budget_cfo11.fk_bd_budget_cfo where fk_stat=:stat and is_actual=1 and fk_kind=:kind and is_arh<>1 and valid_flag=1 and fk_cfo=:cfo -- and tip=12 -- and year_num=:cyear into :zapr, :sogl; select SUMMA_PLAT from SP_SUM_BUDGET_PLAT_BY_STAT(:is_bdds, :cfo, :stat, :date1, :date2) into :fact; end else begin --по всем ЦФО select sum(coalesce(zaprosheno,0)), sum(coalesce(soglasovano,0)) from bd_budget_cfo11 join bd_budget_cfo on bd_budget_cfo.field_key=bd_budget_cfo11.fk_bd_budget_cfo join bd_budget_j_cfo bcfo on bd_budget_cfo.fk_cfo=bcfo.field_key where fk_stat=:stat and is_actual=1 and fk_kind=:kind and is_arh<>1 and valid_flag=1 and bcfo.active_flag=1 and tip=12 -- and year_num=:cyear into :zapr, :sogl; select SUMMA_PLAT from SP_SUM_BUDGET_CONSOL_BY_STAT(:is_bdds, :stat, :date1, :date2) into :fact; end zapr=coalesce(zapr,0); sogl=coalesce(sogl,0); fact=coalesce(fact,0); suspend; cyear=cyear+1; end --while end --tip=12 END^ SET TERM ; ^dВременной анализ статьи бюджета16.7.19.1CREATE procedure SP_BUD_TIME_ANALIZ = u1aUPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка остатков на начало','alcdeclar_edit_ost', (select field_key from BD_USERS_RIGHTS_NAME where name_var='alcdeclar')) matching (name_var);eДекларация: ручная правка остатков на начало16.7.21.1update or insert into BD_USERS_RIGHTS_NAME7 SSET TERM ^ ; CREATE OR ALTER procedure SP_BUD_TIME_ANALIZ ( TIP smallint, MONTH1 smallint, QUARTER1 smallint, YEAR1 integer, MONTH2 smallint, QUARTER2 smallint, YEAR2 integer, KIND integer, STAT integer, CFO integer = 0) returns ( NAME varchar(25), ZAPR decimal(18,2), SOGL decimal(18,2), FACT decimal(18,2)) as declare variable TMP_SUM decimal(18,2); declare variable NEXT_STAT integer; declare variable IS_BDDS smallint; declare variable CMONTH smallint; declare variable CQUARTER smallint; declare variable CYEAR integer; declare variable date1 date; declare variable date2 date; BEGIN select coalesce(class,0) from bd_budget_kinds where field_key=:kind into :is_bdds; if (tip=1) then begin cmonth=month1; cyear=year1; while ( (cyear0) then begin --по конкретному ЦФО select sum(coalesce(zaprosheno,0)), sum(coalesce(soglasovano,0)) from bd_budget_cfo11 join bd_budget_cfo on bd_budget_cfo.field_key=bd_budget_cfo11.fk_bd_budget_cfo where fk_stat=:stat and is_actual=1 and fk_kind=:kind and is_arh<>1 and valid_flag=1 and fk_cfo=:cfo -- and tip=1 and month_num=:cmonth and year_num=:cyear into :zapr, :sogl; select SUMMA_PLAT from SP_SUM_BUDGET_PLAT_BY_STAT(:is_bdds, :cfo, :stat, :date1, :date2) into :fact; end else begin --по всем ЦФО select sum(coalesce(zaprosheno,0)), sum(coalesce(soglasovano,0)) from bd_budget_cfo11 join bd_budget_cfo on bd_budget_cfo.field_key=bd_budget_cfo11.fk_bd_budget_cfo join bd_budget_j_cfo bcfo on bd_budget_cfo.fk_cfo=bcfo.field_key where fk_stat=:stat and is_actual=1 and fk_kind=:kind and is_arh<>1 and valid_flag=1 and bcfo.active_flag=1 --and not(exists(select field_key from bd_budget_j_cfo where fk_parent=bcfo.field_key)) -- and tip=1 and month_num=:cmonth and year_num=:cyear into :zapr, :sogl; select SUMMA_PLAT from SP_SUM_BUDGET_CONSOL_BY_STAT(:is_bdds, :stat, :date1, :date2) into :fact; end zapr=coalesce(zapr,0); sogl=coalesce(sogl,0); fact=coalesce(fact,0); suspend; if (cmonth=12) then begin cmonth=1; cyear=cyear+1; end else begin cmonth=cmonth+1; end end --while end --tip=1 if (tip=3) then begin cquarter=quarter1; cyear=year1; while ( (cyear=:bd and date_create<:ed and fk_bd_budget_j_cfo=:id_cfo and fk_bd_budget_j_stat=:id_stat and valid_flag=1 INTO :plat, :n_pko, :n_plp, :date_plat, :firm_name, :prim, :kodi_name do begin SUSPEND; end END ELSE exit; END^ SET TERM ; ^eПечать выполнения БДДС - I16.7.21.1ALTER procedure SP_BUDGET_PLAT_BY_STAT ;%SET TERM ^ ; CREATE OR ALTER procedure SP_COPY_RASH ( FK_BD_2 integer, FK_FIRM integer) as declare variable DATE_NAKL date; declare variable NOMER_RASH varchar(10); declare variable FK_RECIPIENT integer; declare variable FK_FACE integer; declare variable COD_RASH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_PFIRM integer; declare variable FK_PFIRM_RECIPIENT integer; declare variable FK_CENA_RASH integer; declare variable IW Y%'SET TERM ^ ; CREATE OR ALTER trigger tr_bd2_delete for bd_2 active after delete position 0 AS declare variable fk_ch2 integer; declare variable fk_bd_1 integer; declare variable ex_22 integer; BEGIN update bd_egais_reqs set fk_doc=null where fk_doc=old.field_key; delete from BD_PR_ZAKAZ_6 where fk_bd_2=old.FIELD_KEY; update BD_PR set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr set bd_pr.valid_flag=0 where fk_bd_1 is null and fk_bd_2 is null; update bd_9 set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update BD_RETROBONUS set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr_zf_prod_prep set fk_bd_2=null, done=0 where fk_bd_2=old.field_key; delete from BD_WAY_LIST_11 where fk_bd_2 = old.FIELD_KEY; if (old.COD_RASH in ('0','3','7')) then begin if (exists(select first 1 1 from bd_22 where fk_bd_2=old.FIELD_KEY)) then ex_22=1; else ex_22=0; for select bd_ch2.FIELD_KEY from bd_ch2 where fk_bd_Firm=old.FK_BD_FIRM and date_close=old.DATE_RASH and fk_bd_2=old.FIELD_KEY into :fk_ch2 do begin update bd_ch2 set fk_bd_2=null, bd_ch2.ACCEPT_FLAG=0 where field_key=:fk_ch2; if (ex_22=1) then update bd_ch21 set bd_ch21.ACCEPT_FLAG=0 where fk_bd_ch2=:fk_ch2; end end --удаление излишков, созданных по расходу for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=old.FIELD_KEY into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end END^ SET TERM ; ^eпри удалении излишек and cnt>0 and stock>0 and cnt>=stock;16.7.21.1tr_bd2_deleteN_PRIH_CENA integer; declare variable FK_BD_DOGOVOR integer; declare variable FK_BD_2NEW integer; declare variable FK_BD_TOVAR integer; declare variable CENA_WITH_NDS decimal(8,2); declare variable CENA_WITHOUT_NDS decimal(8,2); declare variable CNT decimal(8,3); declare variable NDS decimal(3,2); declare variable DATE_SAVE date; declare variable GTD varchar(26); declare variable FK_USER integer; declare variable FIRMNAME varchar(30); declare variable FK_BD_TOVAR_MOD integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable SUM_INPUT_MAN_FLAG integer; declare variable SUMMA type of column BD_22.SUMMA; declare variable CNT_IN_INPLACE type of column BD_22.CNT_IN_INPLACE; declare variable PRIM type of column BD_2.comment; declare variable DATE_RASH date; begin select field_key from bd_users where upper(login)=upper(current_user) into :fk_user; select name from bd_firm where field_key=(select fk_bd_firm from bd_2 where field_key=:fk_bd_2) into :firmname; if (fk_firm is null) then begin select bd_2.nomer_rash, bd_2.date_nakl, bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_bd_pfirm, bd_2.fk_bd_firm, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT", bd_2.date_rash from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_bd_pfirm, :fk_firm, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim, :date_rash; end else begin select bd_2.nomer_rash, bd_2.date_nakl ,bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT", bd_2.date_rash from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim, :date_rash; end fk_bd_2new=gen_id(GEN_BD_2_ID,1); insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1, FK_BD_dogovor) VALUES ( :fk_bd_2new,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), null, :date_rash, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_user, coalesce(:prim,'Копия расхода '||:nomer_rash||' '||:firmname), 0, :fk_bd_pfirm, null, null, :fk_firm, null, 0, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, null, null, null,:fk_bd_dogovor); for select a.FK_BD_TOVAR, a.FK_BD_TOVAR_MOD, a.CENA_WITH_NDS, a.CENA_WITHOUT_NDS, a.NDS, a.CNT, a.FK_TOVAR_NABOR_MASTER, a.SUM_INPUT_MAN_FLAG, a.SUMMA, a.CNT_IN_INPLACE from bd_22 a where fk_bd_2=:fk_bd_2 order by field_key into :fk_bd_tovar, :fk_bd_tovaR_MOD, :CENA_WITH_NDS, :CENA_without_nds, :nds, :cnt, :fk_tovar_nabor_master, :sum_input_man_flag, :summa, :cnt_in_inplace do begin INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, FK_TOVAR_NABOR_MASTER, SUM_INPUT_MAN_FLAG, SUMMA, CNT_IN_INPLACE) VALUES (:fk_bd_2new, :FK_BD_TOVAR, :FK_BD_TOVAR_MOD, :CENA_WITH_NDS, :CENA_WITHOUT_NDS, :NDS, :CNT, :FK_TOVAR_NABOR_MASTER, :SUM_INPUT_MAN_FLAG, :SUMMA, :CNT_IN_INPLACE); end end^ SET TERM ; ^eПри копировании расхода, копировать и дату расх16.7.21.1SP_COPY_RASH  3MSET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=bd_91.count_real-new.cnt where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar; end end end^ SET TERM ; ^fесли скач чеки во время ревизии то редактируем реал.кол-во в ревизии16.7.24.1trigger bd_ch21_ai0 new_rev_form Us/UPDATE or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('new_revision_form', '0', 'Новая форма ревизии') MATCHING (PARAMNAME);fGLOBAL_OPTIONS Новая форма ревизии16.7.24.1new_revision_formb qkaSET TERM ^ ; CREATE OR ALTER procedure SP_PRINT_BUDGET_BDDS_VYPOL ( FK_BUDGET integer) returns ( PLAT decimal(18,2), N_PKO integer, N_PLP integer, FK_STAT integer, NAME_STAT varchar(100), PLAN_STAT decimal(18,2), IS_DOHOD integer, PERIOD_NAME varchar(20), VERSIA integer, CFO_NAME varchar(100), DATE_PLAT date, FIRM_NAME varchar(100), PRIM varchar(200), KODI_NAME varchar(100)) as declare variable BD date; declare variable ED date; declare variable IS_BDDS integer; declare variable ID_CFO integer; declare variable TIP integer; declare variable MONTH_NUM integer; declare variable QUARTER_NUM integer; declare variable YEAR_NUM integer; BEGIN select bd, ed from SP_BUDGET_FK_TO_INTERVAL(:FK_BUDGET) into :bd, :ed; select bd_budget_kinds.class, fk_cfo, tip, month_num, quarter_num, year_num, versia, bd_budget_j_cfo.name from bd_budget_cfo join bd_budget_kinds on bd_budget_cfo.fk_kind=bd_budget_kinds.field_key join bd_budget_j_cfo on bd_budget_j_cfo.field_key=bd_budget_cfo.fk_cfo where bd_budget_cfo.field_key=:FK_BUDGET into :is_bdds, :id_cfo, :tip, :month_num, :quarter_num, :year_num, :versia, :cfo_name; select name from SP_GET_BUDGET_PERIOD_NAME(:tip, :month_num, :quarter_num, :year_num) into :period_name; for select bd_budget_j_stat.field_key, bd_budget_j_stat.is_active, bd_budget_cfo11.name, soglasovano from bd_budget_cfo11 join bd_budget_j_stat on bd_budget_j_stat.field_key=bd_budget_cfo11.fk_stat where FK_BD_BUDGET_CFO=:FK_BUDGET into :fk_stat, :is_dohod, :name_stat, :plan_stat do begin for select plat, n_pko, n_plp, date_plat, firm_name, prim, kodi_name from SP_BUDGET_PLAT_BY_STAT (:IS_BDDS, :ID_CFO, :fk_STAT, :BD, :ED) into :plat, :n_pko, :n_plp, :date_plat, :firm_name, :prim, :kodi_name do begin suspend; end end END^ SET TERM ; ^eПечать выполнения БДДС - II16.7.21.1ALTER procedure SP_PRINT_BUDGET_BDDS_VYPOL  l h lx {+AALTER TABLE BD_91 ADD CH_PERIOD DECIMAL(12,3) DEFAULT 0 ; ALTER TABLE BD_91 ADD CH_DAY DECIMAL(12,3) DEFAULT 0 ;gкэш поля для чеков за период, и день ревизии16.7.25.1BD_91 ADD CH_PERIOD CH_DAY 'U#SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(bd_91.count_real-new.cnt>=0,bd_91.count_real-new.cnt,0) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar and bd_91.count_real>0; end end end^ SET TERM ; ^gпо скачке чеков, менять кол-во только если результат >= 016.7.25.1bd_ch21_ai0 a8 })ASET TERM ^ ; create or alter procedure SP_GET_REV_RASH_PRICE_W_CH ( ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, CH_PERIOD type of column BD_91.CH_PERIOD, CH_DAY type of column BD_91.CH_DAY) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable CNT_REAL_REVDAY decimal(7,3); declare variable FK_SMENA integer; declare variableÙ K#?SET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_SAVEOLD ( ID_9 integer, SET_REAL integer = 0) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, CNT_IZL type of column BD_91.CNT_IZL, COUNT_11 type of column BD_STOCK_1.CNT, CH_PERIOD type of column BD_91.CH_PERIOD, CH_DAY type of column BD_91.CH_DAY) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tov and bd_1.fk_bd_firm=:skl into :cnt_izl; select sum(bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and (bd_ch2.date_close between :bd and (:ed-1)) into :ch_period; select sum(bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and bd_ch2.date_close=:ed into :ch_day; if (id_91 is distinct from null) then begin update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, old_count_11=count_11, count_11=:count_11, cnt_izl=:cnt_izl, ch_day=:ch_day, ch_period=:ch_period where field_key=:id_91; if (set_real=1) then update bd_91 set count_real=:count_11 where field_key=:id_91; end end END^ SET TERM ; ^gпересчет рев. заполнять кэш поля по чекам16.7.25.1SP_FILL_91DATECNT_SAVEOLD BD date; declare variable ED date; declare variable SKL integer; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; SUSPEND; --остатки по группе товаров в указанной расходной цене select date_from, date_rev, fk_bd_firm from bd_9 where field_key=:fk_9 into :bd, :ed, :skl; for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.VALID_FLAG=1) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=0; if (is_opt=1) THEN BEGIN --bd_115 select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end select sum(bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:skl and (bd_ch2.date_close between :bd and (:ed-1)) into :ch_period; select sum(bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:skl and bd_ch2.date_close=:ed into :ch_day; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY, ch_period, ch_day) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY, :ch_period, :ch_day ); -- suspend; END END^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_FIRM TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_9 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_TOVAR TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_11 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_1 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_115 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_CPR TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_CH21 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT SELECT ON BD_CH2 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; GRANT INSERT ON BD_91 TO PROCEDURE SP_GET_REV_RASH_PRICE_W_CH; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_GET_REV_RASH_PRICE_W_CH TO PROCEDURE SP_GET_NDS_GRP_TOVAR; GRANT EXECUTE ON PROCEDURE SP_GET_REV_RASH_PRICE_W_CH TO PROCEDURE SP_SPS_REPORT; GRANT EXECUTE ON PROCEDURE SP_GET_REV_RASH_PRICE_W_CH TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_REV_RASH_PRICE_W_CH TO SYSDBA;gЗаполнение ревизизии с кеш полями по чекам16.7.25.1SP_GET_REV_RASH_PRICE_W_CH e "e# e_5INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Производственный план', 'tfrmjurnalprplan', '53'); INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Производственный план', 'tfrmeditprplan', '53');hРежимы печати пр плана16.7.26.1BD_SMARTPRINT_REZHIM "  k?SET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_PR_PLAN_MAKE ( FK_BD_PR_PLAN Integer, FK_BD_CALC Integer, FK_BD_TOVAR Integer, CNT_ZAKAZ Decimal(15,4), NORMA_MIN Decimal(15,4), IS_SBOR Integer, FK_BD_FIRM_REC Integer, FK_BD_SECTOR_REC Integer, FK_FIRM_PROD Integer, FK_SECTOR_PROD Integer, NAME_CALC Varchar(100), DOPRASH Decimal(15,2), FK_MASTER_PR Integer, FK_PR_PLAN_PROD Integer ) AS DECLARE VARIABLE fk_bd_users integer; DECLARE VARIABLE fk_pr integer; DECLARE VARIABLE koef decimal(15,2); DECLARE VARIABLE fk_bd_tovar_prod integer; DECLARE VARIABLE cnt_prod decimal(15,4); DECLARE VARIABLE fk_bd_tovar_cmp integer; DECLARE VARIABLE cnt_cmp decimal(15,4); declare variable FK_BD_pr_zakaz_firm integer; declare variable no_tovar_zakaz integer; declare variable curr_stock decimal(15,4); declare variable curr_stock_rezerv decimal(15,4); declare variable cnt_new_rezerv decimal(15,4); declare variable fk_zf_prod integer; declare variable alg_type integer; declare variable cnt_pr decimal(15,4); declare variable IS_PF integer; declare variable FK_PF_CALC integer; declare variable is_sbor_cmp integer; declare variable norma_min_cmp decimal(15,4); declare variable fk_firm_prod_cmp integer; declare variable fk_sector_prod_cmp integer; declare variable name_calc_cmp varchar(100); declare variable doprash_cmp Decimal(15,2); declare variable fk_zamena integer; declare variable koef_zamena decimal(15,2); declare variable stock_zamena decimal(15,4); declare variable curr_stock_rezerv_zamena decimal(15,4); declare variable cnt_new_rezerv_zamena decimal(15,4); declare variable curr_stock_dops decimal(15,4); declare variable fk_zf_prep integer; BEGIN alg_type=2; --произвести --текущий пользователь FK_BD_USERS=(select field_key from BD_USERS where upper(login)=upper(current_user)); --в любом случае создаем заказ на участок и строку в прод, которую затем апдейтимŋZ! ;M#SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)-new.cnt>=0,coalesce(bd_91.count_real,0)-new.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)+new.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)+new.cnt,coalesce(bd_91.ch_day,0)) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar and bd_91.count_real>0; end end end^ SET TERM ; ^gСкачка чеков заполнение кеш полей по чекам в ревизии16.7.25.1bd_ch21_ai0 на нужный алгоритм FK_BD_pr_zakaz_firm=(select first 1 z.field_key from bd_pr_zakaz_firm z where z.fk_bd_pr_plan=:fk_bd_pr_plan and z.fk_bd_calc_sector=:FK_SECTOR_PROD); if (FK_BD_pr_zakaz_firm is null) then begin insert into bd_pr_zakaz_firm (fk_bd_pr_plan, fk_bd_firm, nomer, fk_bd_calc_sector) values (:fk_bd_pr_plan, :fk_firm_prod, coalesce((select max(nomer)+1 from bd_pr_zakaz_firm where fk_bd_firm=:fk_firm_prod),1),:FK_SECTOR_PROD) returning (field_key) into :FK_BD_pr_zakaz_firm; end INSERT into bd_pr_zakaz_firm_prod (FK_BD_FIRM, FK_BD_FIRM_PROD, FK_BD_TOVAR, CNT, STOCK_CNT_6, FK_BD_CALC, FK_BD_PR_ZAKAZ_FIRM,alg_type, fk_recipient_sector, FK_PR_PLAN_PROD, fk_bd_calc_sector) VALUES (:FK_BD_FIRM_REC, :fk_firm_prod, :fk_bd_tovar, :CNT_ZAKAZ, iif((:FK_BD_FIRM_REC<>:FK_FIRM_PROD),:cnt_zakaz,0), :fk_bd_calc, :fk_bd_pr_zakaz_firm, :alg_type, :fk_bd_sector_rec, :FK_PR_PLAN_PROD,:FK_SECTOR_PROD) returning (field_key) into :fk_zf_prod; --определяем количество заказанного товара на остатках на цехе производства select coalesce(sum(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0))),0) from bd_11 where fk_bd_firm=:FK_FIRM_PROD and fk_bd_tovar=:fk_bd_tovar and stock>0 and valid_flag=1 and bd_11.PRIORITY>0 into :curr_stock; --сохраняем текущий остаток update BD_PR_ZAKAZ_FIRM_PROD set stock_11=:curr_stock where field_key=:fk_zf_prod; --плюсуем к остатку произведенные побочные продукты предыдущих итераций select coalesce(sum(cnt),0) from bd_pr_plan_dops where fk_bd_pr_plan=:fk_bd_pr_plan and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm_prod=:FK_FIRM_PROD into :curr_stock_dops; curr_stock=curr_stock+curr_stock_dops; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv=0; if (curr_stock=CNT_ZAKAZ) then cnt_new_rezerv=CNT_ZAKAZ; if (cnt_new_rezerv>0) then begin alg_type=0; --произвести и переместить if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then fk_zf_prep=gen_id(GEN_BD_PR_ZF_PROD_PREP_ID,1); else fk_zf_prep=null; --резервируем. в резерве ссылка на подготовку к перемещению execute procedure sp_set_rezerv_11(:fk_bd_tovar,:cnt_new_rezerv,:fk_firm_prod,:fk_zf_prod,2); --готовим к перемещению, если склад заказчик не совпадает с цехом изготовления if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then begin update bd_pr_zakaz_firm_prod p set p.alg_type=:alg_type where field_key=:fk_zf_prod; end end if (CNT_ZAKAZ-curr_stock<=0) then begin --производить не требуется, только перемещаем на склад-заказчик --обновляем прод, создаем подготовку к перемещению if (FK_BD_FIRM_REC<>FK_FIRM_PROD) then begin alg_type=1; --только переместить update bd_pr_zakaz_firm_prod p set p.alg_type=:alg_type where field_key=:fk_zf_prod; /* INSERT INTO BD_PR_ZF_PROD_PREP (field_key, FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prep, :fk_zf_prod, :FK_BD_TOVAR, :cnt_zakaz, null, :FK_BD_FIRM_REC); */ end --заполняем список продукции exit; end CNT_PR=CNT_ZAKAZ-curr_stock; ---------------------------------------------------------------------------------------------------------- --корректируем количество для производства по минимальной норме if ((IS_SBOR=1)and(CNT_PRFK_FIRM_PROD) then begin INSERT INTO BD_PR_ZF_PROD_PREP (field_key, FK_PROD, FK_BD_TOVAR, CNT, FK_BD_11, FK_RECIPIENT) VALUES (:fk_zf_prep,:fk_zf_prod, :FK_BD_TOVAR, :cnt_zakaz, null, :FK_BD_FIRM_REC); end */ end else begin --побочные продукты производства INSERT INTO BD_PR_PLAN_DOPS (FK_BD_PR_PLAN, FK_BD_FIRM_PROD, FK_BD_TOVAR, CNT) VALUES (:FK_BD_PR_PLAN,:FK_FIRM_PROD,:FK_BD_TOVAR_prod,(:cnt_prod*:koef)); end /* if (IS_SBOR=1) then begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end else begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_prod, (:cnt_prod*:koef)); end */ end --заполняем список сырья for select p.fk_bd_tovar, p.norma from BD_CALC_PRODUCT p where p.fk_calc=:fk_bd_calc and (:is_sbor=0) union select c.fk_bd_tovar, c.norma from BD_CALC_COMPONENT c where c.fk_calc=:fk_bd_calc and (:is_sbor=1) into :fk_bd_tovar_cmp, :cnt_cmp do begin cnt_cmp=cnt_cmp*koef; --определяем количество товара на остатках на цехе производства select coalesce(sum(iif((stock-coalesce(rezerv,0)<0),0,stock-coalesce(rezerv,0))),0) from bd_11 where fk_bd_firm=:FK_FIRM_PROD and fk_bd_tovar=:fk_bd_tovar_cmp and stock>0 and valid_flag=1 and bd_11.PRIORITY>0 into :curr_stock; --плюсуем к остатку побочные продукты предыдущих итераций select coalesce(sum(cnt),0) from bd_pr_plan_dops where fk_bd_pr_plan=:fk_bd_pr_plan and fk_bd_tovar=:fk_bd_tovar_cmp and fk_bd_firm_prod=:FK_FIRM_PROD into :curr_stock_dops; curr_stock=curr_stock+curr_stock_dops; --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv=0; if (curr_stock=CNT_cmp) then cnt_new_rezerv=CNT_cmp; --резервируем if (cnt_new_rezerv>0) then begin --резервируем сколько требуется и есть в наличии execute procedure sp_set_rezerv_11(:fk_bd_tovar_cmp,:cnt_new_rezerv,:FK_FIRM_PROD,:fk_zf_prod,6); end --если на остатках недостаточно if (cnt_new_rezerv0) then begin INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan, fk_supplier) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_new_rezerv, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, 0, null, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan, (select fk_supplier_main from bd_tovar where field_key=:fk_bd_tovar_cmp)); curr_STOCK=curr_STOCK-cnt_new_rezerv; end cnt_cmp=cnt_cmp-cnt_new_rezerv; --сколько не хватает --проверяем наличие ттк FK_PF_CALC=null; FK_PF_CALC= ( select max(fk) from ( select bd_calc.field_key as fk from bd_calc join bd_calc_product pr on pr.fk_calc=bd_calc.field_key where pr.fk_bd_tovar=:FK_BD_TOVAR_cmp and BD_CALC.valid_flag=1 and bd_calc.is_sbor=1 union select bd_calc.field_key as fk from bd_calc join BD_CALC_COMPONENT c on c.fk_calc=bd_calc.field_key where c.fk_bd_tovar=:FK_BD_TOVAR_cmp and BD_CALC.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=0 ) ); if (FK_PF_CALC is not null) then is_pf=1; else is_pf=0; if (is_pf=0) then begin --ттк нет, сырье является простым --если на остатках не хватает, проверяем замены for select fk_bd_tovar_zamena, koef, coalesce(sum(iif((stock-coalesce(rezerv,0)<0),0,stock-coalesce(rezerv,0))),0) from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:FK_FIRM_PROD and (bd_11.STOCK-coalesce(bd_11.rezerv,0))>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar_cmp group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena, :stock_zamena do begin --ищем сколько надо зарезервировать для данного акта cnt_new_rezerv_zamena=0; if (stock_zamena/KOEF_zamena=cnt_cmp) then cnt_new_rezerv_zamena=cnt_cmp*KOEF_zamena; CNT_cmp=CNT_cmp-stock_zamena/KOEF_zamena; if (cnt_new_rezerv_zamena>0) then begin --резервируем execute procedure sp_set_rezerv_11(:fk_zamena,:cnt_new_rezerv_zamena,:FK_FIRM_PROD,:fk_zf_prod,6); --сохраняем в список сырья по акту пр-ва и пр плану /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_zamena,:cnt_new_rezerv_zamena); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_zamena,:cnt_new_rezerv_zamena); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_zamena, :FK_BD_TOVAR_cmp, :cnt_new_rezerv_zamena, :stock_zamena, :FK_PR, :fk_bd_calc, :FK_FIRM_PROD, :FK_SECTOR_PROD,0, null, :FK_BD_pr_zakaz_firm,:fk_bd_pr_plan); end if (cnt_cmp<=0) then break; end if (cnt_cmp>0) then --если после замены все равно не хватило, делаем заказ поставщику begin /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan, fk_supplier) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan, (select fk_supplier_main from bd_tovar where field_key=:fk_bd_tovar_cmp)); end --заказ поставщику end else begin --ттк есть, сохраняем инфу в акт и список сырья, запускаем производство /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, :IS_PF, :FK_PF_CALC, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan); select coalesce(c.IS_SBOR,0), c.norma_min, c.FK_BD_FIRM_PROD, c.FK_BD_CALC_SECTOR, c.NAME_CALC, c.DOPRASH from bd_calc c where field_key=:FK_PF_CALC into :is_sbor_cmp, :norma_min_cmp, :fk_firm_prod_cmp, :fk_sector_prod_cmp, :name_calc_cmp, :doprash_cmp; execute procedure sp_create_by_pr_plan_make(:fk_bd_pr_plan, :fk_pf_calc, :fk_bd_tovar_cmp, :cnt_cmp, :norma_min_cmp, :is_sbor_cmp, :FK_FIRM_PROD, :FK_SECTOR_PROD, :fk_firm_prod_cmp, :fk_sector_prod_cmp, :name_calc_cmp, :doprash_cmp, :fk_pr, null); end end else --конец если на остатках недостаточно begin-- на остатках хватает /* if (is_sbor=1) then begin INSERT INTO BD_PR_COMPONENT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end else begin INSERT INTO BD_PR_PRODUCT (FK_PR, FK_BD_TOVAR, NORMA) VALUES (:FK_PR, :FK_BD_TOVAR_cmp,:cnt_cmp); end */ INSERT INTO BD_PR_PLAN_CMP (FK_BD_TOVAR, FK_TOVAR_IN_CALC, CNT, STOCK, FK_PR, FK_BD_CALC, FK_BD_FIRM_PROD, FK_SECTOR_PROD, IS_PF, FK_PF_CALC, FK_ZAKAZ_PF, fk_bd_pr_plan) VALUES (:FK_BD_TOVAR_cmp, :FK_BD_TOVAR_cmp, :cnt_cmp, :curr_STOCK, :FK_PR, :FK_BD_CALC, :FK_FIRM_PROD, :FK_SECTOR_PROD, 0, null, :FK_BD_pr_zakaz_firm, :fk_bd_pr_plan); end end --закончили идти по списку сырья END ^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_BY_PR_PLAN_MAKE TO SYSDBA;hИсправлено неверное примечание к сырью по пр плану (пф- не пф)16.7.26.1SP_CREATE_BY_PR_PLAN_MAKE r !r+' W'OSET TERM ^ ; CREATE OR ALTER trigger tr_ks1_del for ks_1 active after delete position 0 AS declare variable ks1 integer; BEGIN delete from ks_11 where fk_ks_1=old.FIELD_KEY and coalesce(is_zv,0)=0; update ks_11 set fk_ks_1=null, summa=0 where fk_ks_1=old.FIELD_KEY and coalesce(is_zv,0)=1; update bd_z set fk_ks_1_sales=null where fk_ks_1_sales=old.field_key; update bd_z set fk_ks_1_sales4=null where fk_ks_1_sales4=old.field_key; update ig_zp_nach set fk_ks_1=null where fk_ks_1=old.field_key; END^ SET TERM ; ^iУдаление связи с з/п при удалении платёжки16.7.29.1ALTER trigger tr_ks1_del for ks_1G& % UALTER TABLE BD_TOVAR ALTER COLUMN IN_PRICE_FLAG SET DEFAULT 1 ; ALTER TABLE BD_TOVAR ALTER COLUMN MAN_ENTER_CASH_FLAG SET DEFAULT 1 ;i16.7.29.1BD_TOVAR IN_PRICE_FLAG SET DEFAULT 1*% {-#SET TERM ^ ; CREATE trigger bd_ch21_ad0 for bd_ch21 active after delete position 0 as declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = old.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)+old.cnt>=0,coalesce(bd_91.count_real,0)+old.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)-old.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)-old.cnt,coalesce(bd_91.ch_day,0)) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=old.fk_bd_tovar; end end end^ SET TERM ; ^iизменение данных по чекам при удалении чека16.7.29.1bd_ch21_ad0b$   #SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)-new.cnt>=0,coalesce(bd_91.count_real,0)-new.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)+new.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)+new.cnt,coalesce(bd_91.ch_day,0)) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar; end end end^ SET TERM ; ^h16.7.26.1bd_ch21_ai0 3r 3\+ O%=SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ad0 for bd_ch21 active after delete position 0 as declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = old.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)+old.cnt>=0,coalesce(bd_91.count_real,0)+old.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)-old.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)-old.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)-(coalesce(old.cena, 0)* old.cnt) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=old.fk_bd_tovar; end end end^ SET TERM ; ^ibd_91.ch_sum16.7.29.1bd_ch21_ad0 after deleteZ* K%=SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)-new.cnt>=0,coalesce(bd_91.count_real,0)-new.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)+new.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)+new.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)+coalesce(new.cena, 0)* new.cnt where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar; end end end^ SET TERM ; ^ibd_91.ch_sum16.7.29.1bd_ch21_ai0 after insert~)ee-ALTER TABLE BD_91 ADD CH_SUM DECIMAL(12,2);iСумма по чекам в ревизии16.7.29.1BD_91 ADD CH_SUM ( K 5INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Заказ на участок', 'tfrmeditzakazsector', '54'); INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Заказ на участок', 'tfrmjournalzakazfirm', '54');iРежим печати для заказа на участок16.7.29.1BD_SMARTPRINT_REZHIM ==?, /?SET TERM ^ ; CREATE OR ALTER procedure SP_FILL_91DATECNT_SAVEOLD ( ID_9 integer, SET_REAL integer = 0) returns ( SUM_PRIH type of column BD_91.CNT_PRIH, SUM_RASH type of column BD_91.CNT_RASH, OST_BEGIN type of column BD_STOCK_1.CNT, CNT_IZL type of column BD_91.CNT_IZL, COUNT_11 type of column BD_STOCK_1.CNT, CH_PERIOD type of column BD_91.CH_PERIOD, CH_DAY type of column BD_91.CH_DAY) as declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable ID_TOV integer; declare variable ID_91 integer; declare variable CH_SUM_PERIOD decimal(12,2); declare variable CH_SUM_DAY decimal(12,2); BEGIN FOR select bd_9.date_from, bd_9.date_rev, bd_9.fk_bd_firm, bd_91.fk_bd_tovar, bd_91.field_key from bd_9 join bd_91 on bd_9.field_key=bd_91.fk_bd_9 where bd_9.field_key=:id_9 into :BD, :ED, :skl, :id_tov, :id_91 do begin sum_prih=0; sum_rash=0; ost_begin=0; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) join bd_firm on (bd_1.fk_bd_firm = bd_firm.field_key) WHERE (bd_1.date_prih between :bd AND :ed) AND ( bd_11.fk_bd_tovar=:id_tov) AND (bd_1.fk_bd_firm=:skl) and bd_1.valid_flag=1 into :sum_prih; select coalesce(sum(bd_21.cnt),0) from bd_21 join bd_2 on (bd_21.fk_bd_2 = bd_2.field_key) join bd_firm on (bd_2.fk_bd_firm = bd_firm.field_key) WHERE (bd_2.date_rash between :bd AND :ed) AND ( bd_21.fk_bd_tovar=:id_tov) AND (bd_2.fk_bd_firm=:skl) and bd_2.valid_flag=1 into :sum_rash; select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<:bd into :ost_begin; --остатки на дату ревизии - в count_11 select coalesce(sum(cnt),0) from bd_stock_1 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and date_morning<=:ed into :count_11; select coalesce(sum(bd_11.cnt),0) from bd_11 join bd_1 on bd_11.fk_bd_1=bd_1.field_key join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key where bd_1.valid_flag=1 and bd_1.date_prih between :bd and :ed and bd_1.cod_prih=7 and bd_11.fk_bd_tovar=:id_tov and bd_1.fk_bd_firm=:skl into :cnt_izl; ch_period=0; ch_sum_period=0; ch_day=0; CH_SUM_DAY=0; select sum(bd_ch21.cnt), sum(bd_ch21.cena*bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and (bd_ch2.date_close between :bd and (:ed-1)) into :ch_period, :ch_sum_period; select sum(bd_ch21.cnt), sum(bd_ch21.cena*bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:id_tov and fk_bd_firm=:skl and bd_ch2.date_close=:ed into :ch_day, :ch_sum_day; if (id_91 is distinct from null) then begin update bd_91 set cnt_start=:ost_begin, cnt_prih=:sum_prih, cnt_rash=:sum_rash, old_count_11=count_11, count_11=:count_11, cnt_izl=:cnt_izl, ch_day=:ch_day, ch_period=:ch_period, ch_sum=coalesce(:ch_sum_period,0)+coalesce(:ch_sum_day, 0) where field_key=:id_91; if (set_real=1) then update bd_91 set count_real=:count_11 where field_key=:id_91; end end END^ SET TERM ; ^iперерасчет с учетом сумм по чекам16.7.29.1SP_FILL_91DATECNT_SAVEOLD TT(- } ASET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_RASH_PRICE_W_CH ( ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, CH_PERIOD type of column BD_91.CH_PERIOD, CH_DAY type of column BD_91.CH_DAY) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable CNT_REAL_REVDAY decimal(7,3); declare variable FK_SMENA integer; declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable CH_SUM_PERIOD decimal(15,2); declare variable CH_SUM_DAY decimal(15,2); BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; SUSPEND; --остатки по группе товаров в указанной расходной цене select date_from, date_rev, fk_bd_firm from bd_9 where field_key=:fk_9 into :bd, :ed, :skl; for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.VALID_FLAG=1) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=0; if (is_opt=1) THEN BEGIN --bd_115 select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end select sum(bd_ch21.cnt), sum(bd_ch21.cena*bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:skl and (bd_ch2.date_close between :bd and (:ed-1)) into :ch_period, :ch_sum_period; select sum(bd_ch21.cnt), sum(bd_ch21.cena*bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:skl and bd_ch2.date_close=:ed into :ch_day, :ch_sum_day; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY, ch_period, ch_day, ch_sum) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY, :ch_period, :ch_day, coalesce(:ch_sum_period,0)+coalesce(:ch_sum_day, 0) ); -- suspend; END END^ SET TERM ; ^ iсоздание рев. запись сумм по чекам16.7.29.1SP_GET_REV_RASH_PRICE_W_CHable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^jПроведение разборного акта пр-ва без ТТК16.7.31.1ALTER procedure SP_CREATE_BY_PR  S1 ?;#SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; declare variable ts_ch_close timestamp; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm, cast(bd_ch2.date_close+bd_ch2.time_close as timestamp) from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm, :ts_ch_close; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)-new.cnt>=0,coalesce(bd_91.count_real,0)-new.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)+new.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)+new.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)+coalesce(new.cena, 0)* new.cnt where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar and coalesce(bd_91.ts_upd_count_real,current_timestamp-1000)<=:ts_ch_close; end end end^ SET TERM ; ^jучет изм. времени поз. рев. во время скачки чеков16.7.31.1bd_ch21_ai0&0 AsSET TERM ^ ; CREATE trigger bd_91_biu0 for bd_91 active before insert or update position 0 AS begin if (coalesce(new.count_real,0)<>coalesce(old.count_real,0)) then begin new.ts_upd_count_real=current_timestamp; end end^ SET TERM ; ^jфиксирования времени последнего изм. факт. кол-ва16.7.31.1 bd_91_biu0 new.ts_upd_count_real=current_timestampd/s CALTER TABLE BD_91 ADD TS_UPD_COUNT_REAL TIMESTAMP;j16.7.31.1BD_91 ADD TS_UPD_COUNT_REALq. k!KSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare vari > '>4 g #SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; declare variable ts_ch_close timestamp; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm, cast(bd_ch2.date_close+bd_ch2.time_close as timestamp) from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm, :ts_ch_close; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=IIF((coalesce(bd_91.ts_upd_count_real,current_timestamp-1000)<=:ts_ch_close),iif(coalesce(bd_91.count_real,0)-new.cnt>=0,coalesce(bd_91.count_real,0)-new.cnt,0),bd_91.count_real), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)+new.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)+new.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)+coalesce(new.cena, 0)* new.cnt where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar; end end end^ SET TERM ; ^k16.8.5.1bd_ch21_ai0T3c 5ALTER TABLE KS_KODI ADD ZP_FLAG BOOLFIELD;k16.8.5.1 KS_KODI add ZP_FLAGU2 C;#SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ad0 for bd_ch21 active after delete position 0 as declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; declare variable ts_ch_close timestamp; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm, cast(bd_ch2.date_close+bd_ch2.time_close as timestamp) from bd_ch2 where field_key = old.fk_bd_ch2 into :date_ch, :fk_firm, :ts_ch_close; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.count_real,0)+old.cnt>=0,coalesce(bd_91.count_real,0)+old.cnt,0), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)-old.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)-old.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)-(coalesce(old.cena, 0)* old.cnt) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=old.fk_bd_tovar and coalesce(bd_91.ts_upd_count_real,current_timestamp-1000)<=:ts_ch_close; end end end^ SET TERM ; ^jучет изм. времени поз. рев. во время скачки чеков16.7.31.1bd_ch21_ad0  n)6 =U;DROP TRIGGER BD_91_BIU0;kубираем триггер установки времени ред.кол-ва в ревизии16.8.5.1DROP TRIGGER BD_91_BIU05 g #SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ad0 for bd_ch21 active after delete position 0 as declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; declare variable ts_ch_close timestamp; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if (trim(new_rev_form)='1') then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm, cast(bd_ch2.date_close+bd_ch2.time_close as timestamp) from bd_ch2 where field_key = old.fk_bd_ch2 into :date_ch, :fk_firm, :ts_ch_close; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=iif(coalesce(bd_91.ts_upd_count_real,current_timestamp-1000)<=:ts_ch_close,iif(coalesce(bd_91.count_real,0)+old.cnt>=0,coalesce(bd_91.count_real,0)+old.cnt,0),bd_91.count_real), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)-old.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)-old.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)-(coalesce(old.cena, 0)* old.cnt) where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=old.fk_bd_tovar; end end end^ SET TERM ; ^k16.8.5.1bd_ch21_ad0eld_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "втоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; fk_2_6=null; select first 1 field_key from bd_2 where fk_bd_1_6=new.fk_bd_1 into :fk_2_6; in_prih_cena=0; if (fk_2_6 is not null) then begin select first 1 in_prih_cena from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena; in_prih_cena=coalesce(in_prih_cena,0); end if ((fk_2_6 is not null) and (in_prih_cena<>1)) then --если внутряк и расход не в приходных ценах, то ставим 115 из 11 update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else begin if (exists(select first 1 field_key from bd_9 where coalesce(in_prih_price,0)=0 and fk_bd_1=new.fk_bd_1)) then begin --если приход от ревизии в расх. ценах - цена115="прих." цена из bd_11, т.к. она там уже с наценкой update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end end --обновляем кэш суммы115 при проведении прихода update bd_1 set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=bd_1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_11.fk_bd_1=new.fk_bd_1) where field_key=new.fk_bd_1; if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^kисправления алгоритма назначения цены 115 для внутр.перемещ.16.8.5.1bd_11_ai1 vq9  KCREATE OR ALTER trigger bd_calc_product_bi0 for bd_calc_product active before insert or update position 0 AS declare variable i varchar (100); begin if (new.fk_calc is not null) then begin update bd_calc set fk_bd_tovar=new.fk_bd_tovar where field_key=new.fk_calc; select name from bd_tovar where bd_tovar.field_key=new.fk_bd_tovar into :i; update bd_calc set name_calc=:i where field_key=new.fk_calc; end endm16.8.29.1Наименование ТТКK8 m=eALTER TABLE BD_SCAN ADD COMMIT_FLAG INTEGERlфлаг означает, что штрихкод передан в общую базу16.8.16.1флаг передачи штрихкодаz7 egSET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; declare variable fk_2_6 integer; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохранении if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.fi bb: I WCREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null) returns ( FIELD_KEY type of column BD_CALC_COMPONENT.FIELD_KEY, FK_PARENT integer, FK_CALC type of column BD_CALC_COMPONENT.FK_CALC, FK_BD_TOVAR type of column BD_CALC_COMPONENT.FK_BD_TOVAR, NORMA type of column BD_CALC_COMPONENT.NORMA, SEB_ED type of column BD_CALC_COMPONENT.SEB_ED, SEB_SUM type of column BD_CALC_COMPONENT.SEB_SUM, NETTO type of column BD_CALC_COMPONENT.NETTO, PROCENT_POTER type of column BD_CALC_COMPONENT.PROCENT_POTER, FK_SKLAD_ZAKAZ type of column BD_CALC_COMPONENT.FK_SKLAD_ZAKAZ, FK_OPERATION type of column BD_CALC_COMPONENT.FK_OPERATION, TRACK_FLAG type of column BD_CALC_COMPONENT.TRACK_FLAG, TRACK_VARIANT type of column BD_CALC_COMPONENT.TRACK_VARIANT, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer) as declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min from bd_calc where field_key=:fk_ttk into :norma_ttk; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; norma_sum=0; netto_sum=0; suspend; end fk_ttk_tmp=null; end end endm16.8.29.1себестоимость в ТТК1  H<  Q+SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT deciيJ; ) WCREATE OR ALTER procedure SP_CALC_SEB_TOV ( FK_BD_TOVAR integer, FK_BD_FIRM integer, NORMA decimal(3,2)) returns ( CENA_CPR decimal(15,2), CENA_PR decimal(15,2), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4)) as declare variable FK_TTK integer; declare variable FK_TOV_TTK integer; declare variable CENA_TTK decimal(15,2); declare variable NORMA_TTK decimal(12,5); declare variable NORMA_TTK_SUM integer; declare variable MOTHER_NORM decimal(15,4); declare variable SOM_VAR decimal(15,4); begin select cena from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=(select fk_bd_cena_basic from bd_firm where field_key=:fk_bd_firm) into :cena_cpr; select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; select first 1 c.field_key, c.norma_min from bd_calc c where c.fk_bd_tovar=:fk_bd_tovar and c.valid_flag=1 into :fk_ttk,:mother_norm; if (fk_ttk is not null) then begin select max(summa_seb)/(select iif(coalesce(norma_min,0)=0,1,coalesce(norma_min,0)) from bd_calc where field_key=:fk_ttk) as total_seb from SP_CALC_SEB_PLAN(:fk_ttk) into :cena_pr; cena_seb=cena_pr*norma; end else begin cena_seb=:cena_pr*:norma; cena_seb_ed=:cena_pr; end suspend; endm16.8.29.1себестоимость в ттк2mal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^nубран учет резерва16.9.21.1SP_CREATE_BY_PR2_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by date_prih, priority, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произве߁ти автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt cc3/******************************************************************************/ /*** Generated by IBExpert 25.09.2016 18:29:03 ***/ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_STOCK_HEAD_ID; CREATE TABLE BD_EGAIS_STOCK_HEAD ( FIELD_KEY INTEGER NOT NULL, FSRAR_ID VARCHAR(30), FK_BD_FIRM INTEGER, DATESTOCK VARCHAR(40) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_STOCK_HEAD ADD CONSTRAINT PK_BD_EGAIS_STOCK_HEAD PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_STOCK_HEAD_IDX1 ON BD_EGAIS_STOCK_HEAD (FSRAR_ID); CREATE INDEX BD_EGAIS_STOCK_HEAD_IDX2 ON BD_EGAIS_STOCK_HEAD (FK_BD_FIRM); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_STOCK_HEAD_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_STOCK_HEAD_BI FOR BD_EGAIS_STOCK_HEAD ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_stock_head_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_STOCK_HEAD TO PUBLIC;oзаголовки остатков егаис (дата обновления)(Сычев обновлен)16.10.6.1BD_EGAIS_STOCK_HEAD ww? !-3/******************************************************************************/ /*** Generated by IBExpert 25.09.2016 18:30:24 ***/ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_STOCK_BODY_ID; CREATE TABLE BD_EGAIS_STOCK_BODY ( FIELD_KEY INTEGER NOT NULL, EG_FULLNAME VARCHAR(200), EG_STOCK DECIMAL(12,3), EG_ALCCODE VARCHAR(64), FK_BD_EGAIS_STOCK_HEAD INTEGER, FSRAR_ID VARCHAR(64) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_STOCK_BODY ADD CONSTRAINT PK_BD_EGAIS_STOCK_BODY PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_STOCK_BODY_IDX1 ON BD_EGAIS_STOCK_BODY (EG_ALCCODE); CREATE INDEX BD_EGAIS_STOCK_BODY_IDX2 ON BD_EGAIS_STOCK_BODY (FK_BD_EGAIS_STOCK_HEAD); CREATE INDEX BD_EGAIS_STOCK_BODY_IDX3 ON BD_EGAIS_STOCK_BODY (FSRAR_ID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_STOCK_BODY_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_STOCK_BODY_BI FOR BD_EGAIS_STOCK_BODY ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_stock_body_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_STOCK_BODY TO PUBLIC;oСуммированые остатки егаис (Сычев обновлен)16.10.6.1BD_EGAIS_STOCK_BODY WB_ =CREATE SEQUENCE GEN_EGAIS_TRANSFERTOSHOP;o16.10.6.1GEN_EGAIS_TRANSFERTOSHOPA QQALTER TABLE BD_EGAIS_STOCK_BODY ADD EG_STOCK2 DECIMAL(12,3);o BD_EGAIS_STOCK_BODY ADD EG_STOCK216.10.6.1 BD_EGAIS_STOCK_BODY ADD EG_STOCK2m@ UC9/******************************************************************************/ /*** Generated by IBExpert 25.09.2016 18:30:43 ***/ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_STOCK_BODY_11_ID; CREATE TABLE BD_EGAIS_STOCK_BODY_11 ( FIELD_KEY INTEGER NOT NULL, FORMA_A VARCHAR(50), FORMA_B VARCHAR(50), EG_STOCK DECIMAL(12,3), FK_BD_EGAIS_STOCK_BODY INTEGER, FSRAR_ID VARCHAR(64) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_STOCK_BODY_11 ADD CONSTRAINT PK_BD_EGAIS_STOCK_BODY_11 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_STOCK_BODY_11_IDX1 ON BD_EGAIS_STOCK_BODY_11 (FK_BD_EGAIS_STOCK_BODY); CREATE INDEX BD_EGAIS_STOCK_BODY_11_IDX2 ON BD_EGAIS_STOCK_BODY_11 (FSRAR_ID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_STOCK_BODY_11_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_STOCK_BODY_11_BI FOR BD_EGAIS_STOCK_BODY_11 ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_stock_body_11_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_STOCK_BODY_11 TO PUBLIC;oОстатки егаис по позициям (спр А Б)(Сычев обновлен)16.10.6.1BD_EGAIS_STOCK_BODY_11 j VG !M!3DROP INDEX BD_TOVAR_EGAIS_LINK_IDX2; ALTER TABLE BD_TOVAR_EGAIS_LINK DROP EG_ALCCODE; ALTER TABLE BD_TOVAR_EGAIS_LINK ADD EG_ALCCODE VARCHAR(64); CREATE INDEX BD_TOVAR_EGAIS_LINK_IDX2 ON BD_TOVAR_EGAIS_LINK (EG_ALCCODE); ALTER TABLE BD_TOVAR_EGAIS_LINK ADD EG_FULLNAME VARCHAR(200); insert into bd_tovar_egais_link (fk_bd_tovar, eg_alccode, eg_fullname) select field_key, eg_alccode, eg_fullname from bd_tovar where eg_alccode is not null;qизменение структуры таблицы BD_TOVAR_EGAIS_LINK и заполнение16.10.29.1BD_TOVAR_EGAIS_LINK/F w+!3ALTER TABLE BD_FIRM ADD use_115_cena_flag BOOLFIELD;pфлаг дефолтной отгрузки по партионной цене16.10.10.1ALTER TABLE BD_FIRMtEc]!!ALTER TABLE BD_2 ADD in_115_cena BOOLFIELD;pфлаг "партионные цены"16.10.10.1alter bd_2ZDa !?CREATE SEQUENCE GEN_EGAIS_ACTWRITEOFFSHOP;p16.10.10.1GEN_EGAIS_ACTWRITEOFFSHOPC O !?SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_TOVAR_EGAIS_LINK_ID; CREATE TABLE BD_TOVAR_EGAIS_LINK ( FIELD_KEY INTEGER NOT NULL, FK_BD_TOVAR INTEGER, EG_ALCCODE INTEGER ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_TOVAR_EGAIS_LINK ADD CONSTRAINT PK_BD_TOVAR_EGAIS_LINK PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_TOVAR_EGAIS_LINK_IDX1 ON BD_TOVAR_EGAIS_LINK (FK_BD_TOVAR); CREATE INDEX BD_TOVAR_EGAIS_LINK_IDX2 ON BD_TOVAR_EGAIS_LINK (EG_ALCCODE); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_TOVAR_EGAIS_LINK_BI */ CREATE OR ALTER TRIGGER BD_TOVAR_EGAIS_LINK_BI FOR BD_TOVAR_EGAIS_LINK ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_tovar_egais_link_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_TOVAR_EGAIS_LINK TO PUBLIC;pдля связи товаров егаис и меркурий16.10.10.1TABLE BD_TOVAR_EGAIS_LINK  0AuM 1 !#COMMENT ON COLUMN BD_PR.FK_BD_2_BASIS IS 'rashod-osnovanie dlya avtoproizvodstva's16.11.22.1commentariyL m!'ALTER TABLE BD_PR ADD FK_BD_2_BASIS INTEGERsрасход-основание в автопроизводстве16.11.22.1FK_BD_2_BASISsK QQ!9CREATE OR ALTER procedure SP_CALC_SEB_PLAN ( FK_CALC integer, WITH_NDS integer = 0) returns ( SUMMA_SEB decimal(12,3), CENA_PR decimal(12,3), NAME char(100), FULLNAME char(200), NORMA decimal(15,4), PRIM varchar(200), HAS_0 integer) as declare variable FK_BD_TOVAR integer; declare variable FK_BD_ZAMENA integer; declare variable KOEF type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_SUB_CALC integer; declare variablsJ 7!SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE WI W'!%SET TERM ^ ; CREATE OR ALTER trigger tr_115_round for bd_115 active before insert or update position 5 AS DECLARE VARIABLE rcena DECIMAL(8,2); declare variable cena_pr type of column bd_11.cena_pr_with_nds; declare variable margin11 type of column bd_11.margin115; declare variable sum115 decimal(15,2); --DECLARE VARIABLE step_r DECIMAL(8,2); --DECLARE VARIABLE kop integer; BEGIN /* округляем расходную цену*/ /* val=new.CENA_WITH_NDS; select first 1 step_round, minus_kop from BD_ROUND where :val between min_predel and max_predel order by min_predel into :step_r, :kop; val=round(val/coalesce(step_r,1),0)*coalesce(step_r,1); if (kop=1) then val=val-0.01; new.CENA_WITH_NDS=val; */ select roundedcena from round_rcena((select fk_bd_tovar from bd_11 where bd_11.field_key=new.fk_bd_11) , coalesce(new.cena_with_nds,0)) into :rcena; new.cena_with_nds=:rcena; /*select bd_11.cena_pr_with_nds, bd_11.margin115 from bd_11 where field_key=new.fk_bd_11 into :cena_pr, margin11; if ((margin11 is not null)and(coalesce(cena_pr,0)<>0)) then begin update bd_11 set margin115=(coalesce(:rcena,0)/:cena_pr-1)*100 where field_key=new.fk_bd_11; end*/ END^ SET TERM ; ^qУбран расчет наценки для цены115 в приходах16.10.29.1tr_115_roundLH ?'!'ALTER TABLE BD_2 ADD TYPE_CALC_115_6 SMALLINT; ALTER TABLE BD_FIRM ADD TYPE_CALC_115 SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_FIRM.TYPE_CALC_115 IS 'Отгрузка по внутренним перемещениям.Варианты установки цены 115 0.сохранить расходные цены получателя без изменения 1.Наценить приход согласно матрице наценок склада получателя 2.передать партионные цены'; ALTER TABLE BD_FIRM ADD MASTER_CALC_115_FLAG BOOLFIELD;qДля вариантов алгоритма вычисления цены11516.10.29.1TYPE_CALC_115step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; declare variable fk_2_6 integer; declare variable TYPE_CALC_115_6 smallint; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохранении if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; fk_2_6=null; select first 1 field_key from bd_2 where fk_bd_1_6=new.fk_bd_1 into :fk_2_6; in_prih_cena=0; if (fk_2_6 is not null) then begin select first 1 in_prih_cena, TYPE_CALC_115_6 from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena, :TYPE_CALC_115_6; in_prih_cena=coalesce(in_prih_cena,0); TYPE_CALC_115_6=coalesce(TYPE_CALC_115_6,0); end if ((fk_2_6 is not null) /*and (in_prih_cena<>1)*/) then --если внутряк /* TYPE_CALC_115_6 0 - сохранить расходные цены получателя без изменения. Это значит, что в 115 заносим цену из прайса 1 - Наценить приход согласно матрице наценок склада получателя. Это работает, когда расход идет по приходной цене. 2 - передать партионные цены. когда 115 у получателя становится как 115 у поставщика */ if (TYPE_CALC_115_6=0) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, coalesce((select first 1 cena from bd_cpr_now where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar),new.cena_pr_with_nds)) matching (FK_BD_11, FK_BD_CENA); end else if (TYPE_CALC_115_6=1) then begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, :cenabase) matching (FK_BD_11, FK_BD_CENA); end else if (TYPE_CALC_115_6=2) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, coalesce((select first 1 bd_115.cena_with_nds from bd_115 where fk_bd_11=new.fk_bd_11_6_main),new.cena_pr_with_nds)) matching (FK_BD_11, FK_BD_CENA); end else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else begin /* if (exists(select first 1 field_key from bd_9 where coalesce(in_prih_price,0)=0 and fk_bd_1=new.fk_bd_1)) then begin --если приход от ревизии в расх. ценах - цена115="прих." цена из bd_11, т.к. она там уже с наценкой update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end */ end --обновляем кэш суммы115 при проведении прихода update bd_1 set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=bd_1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_11.fk_bd_1=new.fk_bd_1) where field_key=new.fk_bd_1; if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^qотключен авторасчет цен115 при проведении прихода, для внутр.перемещ. учет выбраного алгоритма расчета16.10.29.1bd_11_ai1e SUB_NORMA type of column BD_CALC_COMPONENT.NORMA; declare variable I integer; declare variable NOMER_CALC type of column BD_CALC.NOMER_CALC; declare variable SUB_TTK_HAS_0 integer; declare variable IS_SBOR integer; declare variable SUB_SBOR integer; BEGIN summa_seb=0; is_sbor=coalesce((select is_sbor from bd_calc where field_key=:fk_calc),0); --сначала находим РІСЃРµ сырье без РўРўРљ for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and coalesce(c.norma,0)>0 and (:is_sbor=1) union select fk_bd_tovar, coalesce(norma,0) from BD_CALC_PRODUCT p where p.fk_calc=:fk_calc and coalesce(p.norma,0)>0 and (:is_sbor=0) into :fk_bd_tovar, :norma do begin --ищем, есть ли РўРўРљ Сѓ компонента fk_sub_calc=null; fk_sub_calc= ( select max(fk) from ( select bd_calc.field_key as fk from bd_calc join bd_calc_product pr on pr.fk_calc=bd_calc.field_key where pr.fk_bd_tovar=:FK_BD_TOVAR and BD_CALC.valid_flag=1 and bd_calc.is_sbor=1 union select bd_calc.field_key as fk from bd_calc join BD_CALC_COMPONENT c on c.fk_calc=bd_calc.field_key where c.fk_bd_tovar=:FK_BD_TOVAR and BD_CALC.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=0 ) ); if (fk_sub_calc is null) then begin --простое сырье has_0=0; prim=null; cena_pr=0; --находим РџР¦ select coalesce(last_cena_pr,0) from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; prim='Последняя приходная цена'; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (coalesce(cena_pr,0)=0) then begin prim='цена РЅРµ найдена'; has_0=1; end suspend; end else begin --полуфабрикат select bd_calc.NOMER_CALC, is_sbor from BD_CALC where field_key=:fk_sub_calc into :nomer_calc, :sub_sbor; prim='Расчет РїРѕ РўРўРљ в„–'||nomer_calc; if (sub_sbor=1) then sub_norma=(select norma from BD_CALC_PRODUCT where fk_calc=:fk_sub_calc and fk_bd_tovar=:fk_bd_tovar); else sub_norma=(select norma from BD_CALC_COMPONENT where fk_calc=:fk_sub_calc and fk_bd_tovar=:fk_bd_tovar); --находим себ РїРѕ РўРўРљ select max(summa_seb), max(has_0) from sp_calc_seb_plan(:fk_sub_calc, :with_nds) into :cena_pr, :sub_ttk_has_0; cena_pr=cena_pr/sub_norma; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (sub_ttk_has_0=1) then has_0=1; suspend; end end --товары СЃ РўРўРљ - находим РўРўРљ, РїРѕ ней рекурсивно получаем СЃСѓРјРјСѓ себ --suspend; ENDrнеправильная себестоимость, если товар без цены в ТТК16.11.20.2 SP_CALC_SEB_PLAN BUG! 3 B a J=vS )1SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; declare variable fk_2_6 integer; declare variable TYPE_CALC_115_6 smallint; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохранении iyR KSET TERM ^ ; CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN decimal(15,2)) as declare variable CNT_AVTOPR_OST decimal(15,3)Q ]wKALTER TABLE BD_CALC ADD USE_ROUND_NORMA_MIN BOOLFIELD DEFAULT 0 ; COMMENT ON COLUMN BD_CALC.USE_ROUND_NORMA_MIN IS 'округление до мин. нормы';uфлаг округление до мин. нормы16.12.2.1BD_CALC ADD USE_ROUND_NORMA_MIN]P Qu!kupdate bd_1 set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 b1 on b1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=b1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_11.fk_bd_1=bd_1.field_key)tпринуд.обновлений кэш сумм11516.11.24.1принуд.обновлений bd_1.summa115O K5!CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN decimal(15,2)) as declare variable CNT_AVTOPR_OST dIN I!/CREATE trigger bd_2_avtopr_basis for bd_2 active after delete position 0 AS declare variable a integer; declare variable b varchar(50); begin /* Trigger text */ for select bd_pr.field_key from bd_pr where bd_pr.fk_bd_2_basis=old.field_key into :a do select res from SP_PR_PROVCANCEL(:a) into :b; delete from bd_pr where fk_bd_2_basis=old.field_key and valid_flag=0; endsтригер на расход16.11.22.1bd_2_avtopr_basisecimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end ENDsавтопроизв16.11.22.1sp_avtopr; declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; declare variable USE_ROUND_NORMA integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min, coalesce(bd_calc.use_round_norma_min,0) from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check, :use_round_norma; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение  fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END^ SET TERM ; ^uучитывать флаг окр.до мин.нормы16.12.2.1SP_AVTOPRf (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная цена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; fk_2_6=null; select first 1 field_key from bd_2 where fk_bd_1_6=new.fk_bd_1 into :fk_2_6; in_prih_cena=0; if (fk_2_6 is not null) then begin select first 1 in_prih_cena, TYPE_CALC_115_6 from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena, :TYPE_CALC_115_6; in_prih_cena=coalesce(in_prih_cena,0); TYPE_CALC_115_6=coalesce(TYPE_CALC_115_6,0); end if ((fk_2_6 is not null) /*and (in_prih_cena<>1)*/) then --если внутряк /* TYPE_CALC_115_6 0 - сохранить расходные цены получателя без изменения. Это значит, что в 115 заносим цену из прайса 1 - Наценить приход согласно матрице наценок склада получателя. Это работает, когда расход идет по приходной цене. 2 - передать партионные цены. когда 115 у получателя становится как 115 у поставщика */ if (TYPE_CALC_115_6=0) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, coalesce((select first 1 cena from bd_cpr_now where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar),new.cena_pr_with_nds)) matching (FK_BD_11, FK_BD_CENA); if (new.cena_pr_with_nds>0) then update bd_11 set margin115=((coalesce((select first 1 cena from bd_cpr_now where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar),new.cena_pr_with_nds)/new.cena_pr_with_nds)-1)*100 where field_key=new.field_key; end else if (TYPE_CALC_115_6=1) then begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, :cenabase) matching (FK_BD_11, FK_BD_CENA); update bd_11 set margin115=:margin where field_key=new.field_key; end end else if (TYPE_CALC_115_6=2) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, coalesce((select first 1 bd_115.cena_with_nds from bd_115 where fk_bd_11=new.fk_bd_11_6_main),new.cena_pr_with_nds)) matching (FK_BD_11, FK_BD_CENA); if (new.cena_pr_with_nds>0) then update bd_11 set margin115=((coalesce((select first 1 bd_115.cena_with_nds from bd_115 where fk_bd_11=new.fk_bd_11_6_main),new.cena_pr_with_nds)/new.cena_pr_with_nds)-1)*100 where field_key=new.field_key; end else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else begin /* if (exists(select first 1 field_key from bd_9 where coalesce(in_prih_price,0)=0 and fk_bd_1=new.fk_bd_1)) then begin --если приход от ревизии в расх. ценах - цена115="прих." цена из bd_11, т.к. она там уже с наценкой update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end */ end --обновляем кэш суммы115 при проведении прихода update bd_1 set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=bd_1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_11.fk_bd_1=new.fk_bd_1) where field_key=new.fk_bd_1; if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^uсохр. наценку115 для внутр.перемещ.16.12.2.1 trigger bd_11_ai1   tVy!I ALTER TABLE BD_EGAIS_STOCK_BODY ADD MARKER BOOLFIELD;wADD MARKER16.12.3.1BD_EGAIS_STOCK_BODY ADD MARKER\U -O3 ALTER TABLE BD_EGAIS_STOCK_BODY ADD CAPACITY VARCHAR(10); ALTER TABLE BD_EGAIS_STOCK_BODY ADD ALCVOLUME VARCHAR(10); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PRODUCTVCODE VARCHAR(64); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_NAME VARCHAR(255); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_SHORTNAME VARCHAR(64); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_DESCRIPTION VARCHAR(2000); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_CLIENTREGID VARCHAR(64); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_INN VARCHAR(12); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_KPP VARCHAR(12); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_COUNTRY VARCHAR(64); ALTER TABLE BD_EGAIS_STOCK_BODY ADD PROD_REGIONCODE VARCHAR(64);vДоп.поля товаров егаис (обем, алкоголь производитель)16.12.3.1BD_EGAIS_STOCK_BODYT q5SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_STOCK_QUERY_ID; CREATE TABLE BD_EGAIS_STOCK_QUERY ( FIELD_KEY INTEGER NOT NULL, FK_BD_EGAIS_STOCK_HEAD INTEGER, QUERYNAME VARCHAR(50), REPLYID VARCHAR(50), URL VARCHAR(200) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_STOCK_QUERY ADD CONSTRAINT PK_BD_EGAIS_STOCK_QUERY PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_STOCK_QUERY_IDX1 ON BD_EGAIS_STOCK_QUERY (FK_BD_EGAIS_STOCK_HEAD); CREATE INDEX BD_EGAIS_STOCK_QUERY_IDX2 ON BD_EGAIS_STOCK_QUERY (QUERYNAME); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_STOCK_QUERY_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_STOCK_QUERY_BI FOR BD_EGAIS_STOCK_QUERY ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_stock_query_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_STOCK_QUERY TO PUBLIC;vзапросы по операциям с остатками16.12.3.1BD_EGAIS_STOCK_QUERYBANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa,0)<>0)or(coalesce(summa_disc,0)=coalesce(summa_all,0))) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^xобрабатывать чеки с нулевой суммой, вдруг там скидка 100проц16.12.8.1SP_CH_TO_RASH_22_OP  k[ ?!SET TERM ^ ; CREATE OR ALTER procedure SP_AVTOPR ( FK_BD_TOVAR integer, FK_BD_TTK_AVTOPR integer, CNT_OST decimal(15,3), CNT_22 decimal(15,3), FK_BD_FIRM integer, FK_USER integer, LANG varchar(2), FK_BD_2 integer, DATE_RASH date, SUMMA_OST decimal(18,2), CENA_WITH_NDS decimal(8,2)) returns ( FK_BD_11 integer, CNT_11 decimal(15,3), MAN_FLAG integer, SUMMA_MAN decimal(15,2)) as declare variable CNT_AVTOPR_OST decimal(15,3); declare Z ?!+SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declY  ![ execute block as declare variable fk_ch2 integer; begin for select field_key from bd_ch2 where summa_disc=summa_all into :fk_ch2 do update bd_ch21 set bd_ch21.cena=0, bd_ch21.sumpos=0, bd_ch21.sumpos_with_discount=0 where fk_bd_ch2=:fk_ch2; endy16.12.11.1исправл.скрипт обнуления цен для чеков со скидкой 100процFX 9 = execute block as declare variable fk_ch2 integer; begin for select field_key from bd_ch2 where summa_disc=summa_all into :fk_ch2 do update bd_ch21 set bd_ch21.cena=0 where fk_bd_ch2=:fk_ch2; endx16.12.8.1скрипт обнуления цен для чеков со скидкой 100проц;W Se3 SET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_are variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недотачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/iif(coalesce(cnt,0)=0,1,cnt) where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*coalesce(inplace,1); summa_without_nds=cena*coalesce(inplace,1); end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*coalesce(inplace,1); summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/coalesce(inplace,1); end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^zпроверки дел.016.12.12.1SP_CREATE_BY_PR variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; declare variable USE_ROUND_NORMA integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min, coalesce(bd_calc.use_round_norma_min,0) from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check, :use_round_norma; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение  fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END^ SET TERM ; ^zпроверки дел.016.12.12.1SP_AVTOPR l HlX] i!)SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_TOVAR_ID; CREATE TABLE BD_EGAIS_TOVAR ( FIELD_KEY INTEGER NOT NULL, EG_ALCCODE VARCHAR(64), EG_FULLNAME VARCHAR(200), CAPACITY VARCHAR(10), ALCVOLUME VARCHAR(10), PROD_NAME VARCHAR(255), PROD_SHORTNAME VARCHAR(64), PROD_DESCRIPTION VARCHAR(2000), PROD_CLIENTREGID VARCHAR(64), PROD_INN VARCHAR(12), PROD_KPP VARCHAR(12), PROD_COUNTRY VARCHAR(64), PROD_REGIONCODE VARCHAR(64), PRODUCTVCODE VARCHAR(64) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_TOVAR ADD CONSTRAINT PK_BD_EGAIS_TOVAR PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_TOVAR_IDX1 ON BD_EGAIS_TOVAR (PROD_INN); CREATE INDEX BD_EGAIS_TOVAR_IDX2 ON BD_EGAIS_TOVAR (EG_ALCCODE); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_TOVAR_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_TOVAR_BI FOR BD_EGAIS_TOVAR ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_tovar_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_TOVAR TO PUBLIC;{справочник товаров егаис16.12.16.1BD_EGAIS_TOVAR4\ K]!5CREATE OR ALTER trigger tr_bd_11_setcashcena for bd_11 active after insert or update position 200 AS declare variable issklad integer; BEGIN select first 1 sklad from bd_firm where field_key=new.fk_supplier into :issklad; if (coalesce(old.CENA_PR_WITH_NDS,0)<>coalesce(new.CENA_PR_WITH_NDS,0) and (:issklad<>1)) THEN update bd_tovar set BD_TOVAR.LAST_CENA_PR=coalesce(new.CENA_PR_WITH_NDS,0) where field_key=new.fk_bd_tovar and coalesce(BD_TOVAR.LAST_CENA_PR,0)<>coalesce(new.CENA_PR_WITH_NDS,0); END{не менять последнюю приходную цену, если поставщик склад16.12.16.1tr_bd_11_setcashcena if (not((coalesce(old.VALID_FLAG,0)=0)and(new.VALID_FLAG=1))) then -- skip_cenarlog=1; exit; -- insert into tmp(prim) values ('проверка на проведение - ок'); if (not exists(select bd_firm.CENAR_AVT_FLAG from bd_firm join bd_1 on bd_1.FK_BD_FIRM=bd_firm.FIELD_KEY where bd_1.FIELD_KEY=new.FK_BD_1 and coalesce(bd_firm.CENAR_AVT_FLAG,0)=1)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на вкл автомата у склада - ок'); if (coalesce(new.COD_PRIH,0) in (7,9)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на не излишки или бонус - ок'); -- если есть параметр автоподсчета расх.цены находим базовую цену склада код склада? и текущую дату прихода select first 1 bd_firm.fk_bd_cena_basic, bd_firm.field_key, bd_1.date_prih from bd_firm join bd_1 on (bd_1.fk_bd_firm=bd_firm.field_key) where bd_1.field_key=new.fk_bd_1 into :fk_cena_base, :fk_firm, :date_pr; --если данный приход не является последним - в cenar_log не пишем if ((select first 1 bd_1.field_key from bd_1 join BD_FIRM on bd_firm.FIELD_KEY=bd_1.FK_BD_FIRM join bd_11 on bd_11.FK_BD_1=bd_1.FIELD_KEY and bd_11.FK_BD_TOVAR=new.FK_BD_TOVAR where BD_FIRM.FK_BD_CENA_BASIC=:fk_cena_base and bd_1.VALID_FLAG=1 order by bd_1.DATE_PRIH desc, bd_1.field_key desc )<>new.FK_BD_1) then skip_cenarlog=1; --insert into tmp(prim) values ('проверка на последний приход - ок'); cenaprnew=new.cena_pr_with_nds; -- по базовой цене ищем опорную цену select first 1 coalesce(bd_cena.fk_maincena,bd_cena.field_key) from bd_cena where bd_cena.field_key=:fk_cena_base into :fkmaincena; while ((select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena) is not null) do select first 1 bd_cena.fk_maincena from bd_cena where field_key=:fkmaincena into :fkmaincena; if (:fkmaincena is null) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на тип опорной цены - ок'); -- наценка и минимал. наценка для товара select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('nacenka_matrix') into :nac_matrix; if (trim(nac_matrix)='1') then select first 1 margin from bd_nacenka_matrix where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar into :margin; else select first 1 coalesce(margin,0) from bd_tovar where field_key=new.fk_bd_tovar into :margin; if (coalesce(margin,0)=0) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на нулевую наценку - ок'); -- новая расходная опорная цена cenabase=:cenaprnew+(coalesce(:margin,0)*:cenaprnew/100); ----[09.11.15] -- округление новой расходной цены -- старая приходная цена select first 1 bd_11.cena_pr_with_nds from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_1.fk_bd_firm in (select field_key from bd_firm where fk_bd_cena_basic=:fk_cena_base) and (bd_11.fk_bd_tovar=new.fk_bd_tovar) and bd_1.VALID_FLAG=1 and bd_1.DATE_PRIH<=:date_pr and bd_1.FIELD_KEY<>new.FK_BD_1 order by bd_1.date_prih desc, bd_1.field_key desc, bd_11.FIELD_KEY desc into :oldcenapr; oldcenapr=coalesce(oldcenapr,0); -- if (:oldcenapr=0) then exit; --вызывает проблемы с первым приходом -- Если новая приходная ена равна старой - в cenar_log не пишем if (round(new.cena_pr_with_nds,2)=round(:oldcenapr,2)) then skip_cenarlog=1; -- insert into tmp(prim) values ('проверка на изменение последней ПЦ - ок'); -- ср.себестоимость -- текущая расходная цена oldcenar=0; select first 1 cena from BD_CPR_NOW where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.FK_BD_TOVAR into :oldcenar; oldcenar=coalesce(oldcenar,0); -- статусы (modifytype) 0 - рекомендация 1 - принята 2 - убыточна modifytype=0; if ((modifytype<2)and(:oldcenapr>:cenaprnew)) then modifytype=2; if ((modifytype<2)and(:oldcenar>:cenabase)) then modifytype=2; if ((modifytype=2) and (:oldcenar<:cenabase)) then modifytype=0; val=cenabase; select ROUNDEDCENA from round_rcena(new.fk_bd_tovar,:val) into :cenabase; --проверяем ГО "Автоматически поднимать расходную цену при увеличении приходной" --если надо, помечаем, что сразу "принять" в жур. расх. цен (измененным триггером BD_CENAR_LOG_AIU0) if (cenabase>oldcenar) then begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('auto_rise_cenar') into :arc; if (trim(:arc)='1') then modifytype=1; end if (skip_cenarlog<>1) then update or insert into bd_cenar_log (fk_bd_cena, fk_bd_tovar, date_create, date_start, cenanew, cenaold, cenaprnew, cenaprold, modifytype,nds, margin_proc, fk_bd_11) values (:fk_cena_base, new.fk_bd_tovar, current_date, current_date, :cenabase, :oldcenar, :cenaprnew,:oldcenapr,:modifytype,new.nds, :margin, new.field_key) matching (fk_bd_cena, fk_bd_tovar,cenanew, modifytype); -- returning (field_key) into :fklog; fk_2_6=null; select first 1 field_key from bd_2 where fk_bd_1_6=new.fk_bd_1 into :fk_2_6; in_prih_cena=0; if (fk_2_6 is not null) then begin select first 1 in_prih_cena, TYPE_CALC_115_6 from bd_2 where fk_bd_1_6=new.fk_bd_1 into :in_prih_cena, :TYPE_CALC_115_6; in_prih_cena=coalesce(in_prih_cena,0); TYPE_CALC_115_6=coalesce(TYPE_CALC_115_6,0); end if ((fk_2_6 is not null) /*and (in_prih_cena<>1)*/) then --если внутряк /* TYPE_CALC_115_6 0 - сохранить расходные цены получателя без изменения. Это значит, что в 115 заносим цену из прайса 1 - Наценить приход согласно матрице наценок склада получателя. Это работает, когда расход идет по приходной цене. 2 - передать партионные цены. когда 115 у получателя становится как 115 у поставщика */ if (TYPE_CALC_115_6=0) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, coalesce((select first 1 cena from bd_cpr_now where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar),new.cena_pr_with_nds)) matching (FK_BD_11, FK_BD_CENA); if (new.cena_pr_with_nds>0) then update bd_11 set margin115=((coalesce((select first 1 cena from bd_cpr_now where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar),new.cena_pr_with_nds)/new.cena_pr_with_nds)-1)*100 where field_key=new.field_key; end else if (TYPE_CALC_115_6=1) then begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, :cenabase) matching (FK_BD_11, FK_BD_CENA); update bd_11 set margin115=:margin where field_key=new.field_key; end end else if (TYPE_CALC_115_6=2) then begin update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, coalesce((select first 1 bd_115.cena_with_nds from bd_115 where fk_bd_11=new.fk_bd_11_6_main),new.cena_pr_with_nds)) matching (FK_BD_11, FK_BD_CENA); if (new.cena_pr_with_nds>0) then update bd_11 set margin115=((coalesce((select first 1 bd_115.cena_with_nds from bd_115 where fk_bd_11=new.fk_bd_11_6_main),new.cena_pr_with_nds)/new.cena_pr_with_nds)-1)*100 where field_key=new.field_key; end else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else begin /* if (exists(select first 1 field_key from bd_9 where coalesce(in_prih_price,0)=0 and fk_bd_1=new.fk_bd_1)) then begin --если приход от ревизии в расх. ценах - цена115="прих." цена из bd_11, т.к. она там уже с наценкой update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); end else begin if ((new.margin115 is not null)and(coalesce(new.cena_pr_with_nds,0)<>0)) then update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, (new.margin115/100+1)*new.cena_pr_with_nds) matching (FK_BD_11, FK_BD_CENA); else update or insert into bd_115 (FK_BD_11, FK_BD_CENA, WORKPLACE, CENA_WITH_NDS) values (new.field_key, :fk_cena_base, null, iif(:skip_cenarlog=1,new.cena_pr_with_nds,iif(:modifytype=1,:cenabase,:oldcenar))) matching (FK_BD_11, FK_BD_CENA); end */ end --обновляем кэш суммы115 при проведении прихода update bd_1 set summa115=( select coalesce(sum(bd_11.cnt*bd_115.cena_with_nds),0) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_firm skl on skl.field_key=bd_1.fk_bd_firm left join bd_115 on bd_115.fk_bd_11=bd_11.field_key and bd_115.fk_bd_cena=skl.fk_bd_cena_basic where bd_11.fk_bd_1=new.fk_bd_1) where field_key=new.fk_bd_1; if (skip_cenarlog<>1) then update bd_nacenka_matrix set last_prih_cena=:cenaprnew where fk_bd_cena=:fk_cena_base and fk_bd_tovar=new.fk_bd_tovar; end^ SET TERM ; ^{контрольное обновление триггера 11516.12.16.1bd_11_ai1 h { kQhec e3!)ALTER TABLE BD_EGAIS_TOVAR ADD QUERY_DATE DATE; ALTER TABLE BD_EGAIS_TOVAR ADD QUERY_REPLYID VARCHAR(50); ALTER TABLE BD_EGAIS_TOVAR ADD QUERY_FSRARID VARCHAR(64);~новые поля16.12.28.1BD_EGAIS_TOVAR^b 3-!Qupdate or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('kassa_service_tovar', null, 'Код товара для кассы оплата за обслуживание') matching (PARAMNAME);}Код товара для кассы оплата за обслуживание16.12.24.1GLOBAL_OPTIONS kassa_service_tovar4a u-!=ALTER TABLE BD_CH2 ADD SUMMA_SERVICE DECIMAL(12,2);}заголовок чека поле с сумой за обслуживание16.12.24.1BD_CH2 ADD SUMMA_SERVICE}`]a!5update bd_tovar set num_kitch_printer=1|все товары кухпринтер 116.12.23.1кухпринтер _yi!/ ALTER TABLE BD_TOVAR ADD NUM_KITCH_PRINTER SMALLINT|номер кухонного принтера16.12.23.1num_kitch_printerq^ ) !SET TERM ^ ; CREATE OR ALTER trigger bd_11_ai1 for bd_11 active after insert or update position 1 AS declare variable fk_cena_base integer; declare variable fk_firm integer; declare variable cenabase decimal(12,5); declare variable date_pr date; declare variable margin type of column bd_tovar.margin; declare variable oldcenapr type of column bd_11.cena_pr_with_nds; declare variable oldcenar type of column bd_11.cena_pr_with_nds; declare variable cenaprnew type of column bd_11.cena_pr_with_nds; declare variable fkmaincena integer; declare variable avgcost type of column bd_11.cena_pr_with_nds; declare variable fklog integer; declare variable modifytype integer; DECLARE VARIABLE val DECIMAL(8,2); DECLARE VARIABLE step_r DECIMAL(8,2); DECLARE VARIABLE kop integer; DECLARE VARIABLE nac_matrix varchar(10); DECLARE VARIABLE arc varchar(10); declare variable skip_cenarlog smallint; declare variable in_prih_cena smallint; declare variable fk_2_6 integer; declare variable TYPE_CALC_115_6 smallint; begin skip_cenarlog=0; -- delete from tmp; -- insert into tmp(prim) values ('старт'); --работает только на проведение, а изначальная вставка в 115 - в коде прихода при сохраненииe_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin  cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where  field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^приоритет16.12.30.1SP_CREATE_BY_PRmal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT)  VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^priority "desc"16.12.30.2SP_CREATE_BY_PREDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемс произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make;  date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cntj M)alter table bd_egais_tovar add IMP_NAME VARCHAR(255); alter table bd_egais_tovar add IMP_SHORTNAME VARCHAR(64); alter table bd_egais_tovar add IMP_DESCRIPTION VARCHAR(2000); alter table bd_egais_tovar add IMP_CLIENTREGID VARCHAR(64); alter table bd_egais_tovar add IMP_INN VARCHAR(12); alter table bd_egais_tovar add IMP_KPP VARCHAR(12); alter table bd_egais_tovar add IMP_COUNTRY VARCHAR(64); alter table bd_egais_tovar add IMP_REGIONCODE VARCHAR(64);поля по импортеру17.1.16.1bd_egais_tovari Q9ALTER TABLE BD_EGAIS_QUERY ADD XML BLOB SUB_TYPE 1 SEGMENT SIZE 4096;поле для xml запроса17.1.13.1BD_EGAIS_QUERY ADD XMLFh 5%!)SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_QUERY_ID; CREATE TABLE BD_EGAIS_QUERY ( FIELD_KEY INTEGER NOT NULL, FSRAR_ID VARCHAR(30) NOT NULL, QUERYDATE DATE DEFAULT current_date, QUERYTIME TIME DEFAULT current_time, QUERYNAME VARCHAR(50), REPLYID VARCHAR(50), URL VARCHAR(200), XML_T1 BLOB SUB_TYPE 1 SEGMENT SIZE 80, XML_T2 BLOB SUB_TYPE 1 SEGMENT SIZE 80, RES_T1 BOOLFIELD DEFAULT 0 /* BOOLFIELD = INTEGER */, RES_T2 BOOLFIELD DEFAULT 0 /* BOOLFIELD = INTEGER */, RES_STR1 VARCHAR(500), RES_STR2 VARCHAR(500) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_QUERY ADD CONSTRAINT PK_BD_EGAIS_QUERY PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_QUERY_IDX1 ON BD_EGAIS_QUERY (FSRAR_ID); CREATE INDEX BD_EGAIS_QUERY_IDX2 ON BD_EGAIS_QUERY (QUERYDATE); CREATE INDEX BD_EGAIS_QUERY_IDX3 ON BD_EGAIS_QUERY (QUERYNAME); CREATE INDEX BD_EGAIS_QUERY_IDX4 ON BD_EGAIS_QUERY (REPLYID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_QUERY_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_QUERY_BI FOR BD_EGAIS_QUERY ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_query_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_QUERY TO PUBLIC;журнал16.12.30.2BD_EGAIS_QUERY1.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr if (cena is null) then select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); -- suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and bd_11.STOCK>0 left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where (t2.field_key=:id_gruppa) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rev between coalesce(o1.begin_date,:date_rev) and coalesce(o1.end_date,:date_rev) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_bd_tovar and ocpr.fk_bd_cena=:id_cena into :cena; if (is_opt=1) THEN BEGIN --bd_115 if (cena is null) then select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; cena=coalesce(:cena,0); end ELSE BEGIN --bd_cpr if (cena is null) then select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; cena=coalesce(:cena,0); END fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); -- suspend; END END END^ SET TERM ; ^учет отложенных цен при заполнении ревизии17.1.18.1 SP_GET_REV_RASH_PRICE *l ]+C!SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_RASH_PRICE_W_CH ( ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer, CH_PERIOD type of column BD_91.CH_PERIOD, CH_DAY type of column BD_91.CH_DAY) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable Ok 1+9 SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable CNT_REAL_REVDAY decimal(7,3); declare variable FK_SMENA integer; declare variable DATE_REV date; BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; SUSPEND; select date_rev from bd_9 where field_key=:fk_9 into :date_rev; --остатки по группе товаров в указанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 --and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_1.VALID_FLAG=1) -- and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rev between coalesce(o1.begin_date,:date_rev) and coalesce(o1.end_date,:date_rev) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_bd_tovar and ocpr.fk_bd_cena=:id_cena into :cena; if (is_opt=1) THEN BEGIN --bd_115 if (cena is null) then select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_1CNT_REAL_REVDAY decimal(7,3); declare variable FK_SMENA integer; declare variable BD date; declare variable ED date; declare variable SKL integer; declare variable CH_SUM_PERIOD decimal(15,2); declare variable CH_SUM_DAY decimal(15,2); BEGIN select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; SUSPEND; --остатки по группе товаров в указанной расходной цене select date_from, date_rev, fk_bd_firm from bd_9 where field_key=:fk_9 into :bd, :ed, :skl; for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_1.VALID_FLAG=1) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN --находим последнюю расходную цену cena=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :ed between coalesce(o1.begin_date,:ed) and coalesce(o1.end_date,:ed) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_bd_tovar and ocpr.fk_bd_cena=:id_cena into :cena; if (is_opt=1) THEN BEGIN --bd_115 if (cena is null) then select first 1 coalesce(bd_115.CENA_WITH_NDS,0) from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 --join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_11.FK_BD_FIRM=:id_sklad order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end ELSE BEGIN --bd_cpr if (cena is null) then select first 1 coalesce(bd_cpr.CENA,0) from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end select sum(bd_ch21.cnt), sum(bd_ch21.cena*bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:skl and (bd_ch2.date_close between :bd and (:ed-1)) into :ch_period, :ch_sum_period; select sum(bd_ch21.cnt), sum(bd_ch21.cena*bd_ch21.cnt) from bd_ch21 join bd_ch2 on bd_ch2.field_key=bd_ch21.fk_bd_ch2 where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:skl and bd_ch2.date_close=:ed into :ch_day, :ch_sum_day; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY, ch_period, ch_day, ch_sum) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY, :ch_period, :ch_day, coalesce(:ch_sum_period,0)+coalesce(:ch_sum_day, 0) ); -- suspend; END END^ SET TERM ; ^учет отложенных цен при заполнении ревизии17.1.18.1 SP_GET_REV_RASH_PRICE_W_CH Lm +G"SET TERM ^ ; CREATE OR ALTER procedure SP_GET_REV_MATRIX_RASH_PRICE ( BY_MATRIX integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable CNT_REAL decimal(7,3); declare variable CNT_REAL_REVDAY decimal(7,3); declare variable FK_SMENA integer; declare variable DATE_REV date; BEGIN fk_smena=(select fk_bd_smena from bd_9 where field_key=:fk_9); suspend; --остатки по группе товаров в РАСхОДНЫх ценах select date_rev from bd_9 where field_key=:fk_9 into :date_rev; for select bd_tovar.field_key, bd_tovar.name, sum(coalesce(stock,0)) from bd_tovar left join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY and stock>0 and (bd_11.FK_BD_FIRM=:id_sklad) left join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 and (bd_11.FK_BD_FIRM=:id_sklad) and (bd_11.VALID_FLAG=1) and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) where exists(select 1 from bd_matrix_tovar mt where mt.fk_bd_tovar=bd_tovar.field_key and mt.fk_bd_matrix=:by_matrix) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rev between coalesce(o1.begin_date,:date_rev) and coalesce(o1.end_date,:date_rev) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_bd_tovar and ocpr.fk_bd_cena=:id_cena into :cena; if (cena is null) then select coalesce ( (select first 1 coalesce(BD_CPR_NOW.CENA,0) from BD_CPR_NOW where BD_CPR_NOW.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR_NOW.fk_bd_cena=:id_cena) ,0) from rdb$database into :cena; --ищем цену по заданному типу цены; если нету - то по последней приходной --и находим общее количество if (coalesce(:cena,0)=0) then begin select first 1 bd_11.CENA_PR_WITH_NDS from bd_11 where bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and fk_bd_tovar=:fk_bd_tovar order by bd_11.DATE_PRIH desc, bd_11.PRIORITY desc into :cena; end cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then begin cnt_real=cnt_11; cnt_real_revday=cnt_11; end INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL, CNT_REAL_REVDAY) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real, :cnt_real_REVDAY ); END END^ SET TERM ; ^учет отложенных цен при заполнении ревизии17.1.18.1 SP_GET_REV_MATRIX_RASH_PRICE,:date_rev) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_bd_tovar and ocpr.fk_bd_cena=:id_cena into :cena; --находим последнюю расходную цену if (is_opt=1) THEN BEGIN --bd_115 if (cena is null) then select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena; end ELSE BEGIN --bd_cpr if (cena is null) then select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END end ELSE BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_grt_tovar on (bd_tovar.fk_grt = bd_grt_tovar.field_key) JOIN bd_grt_tovar t2 ON bd_grt_tovar.lb >= t2.lb AND bd_grt_tovar.rb <= t2.rb join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (t2.field_key=:id_gruppa) and (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rev between coalesce(o1.begin_date,:date_rev) and coalesce(o1.end_date,:date_rev) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_bd_tovar and ocpr.fk_bd_cena=:id_cena into :cena; --находим последнюю расходную цену if (is_opt=1) THEN BEGIN --bd_115 if (cena is null) then select first 1 bd_115.CENA_WITH_NDS from bd_115 join bd_11 on bd_11.FIELD_KEY=bd_115.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=BD_11.FK_BD_1 where bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_1.VALID_FLAG=1 and bd_115.FK_BD_CENA=:id_cena and bd_1.FK_BD_FIRM=:id_sklad order by bd_1.DATE_PRIH desc, bd_1.NOMER_PRIH desc into :cena; end ELSE BEGIN --bd_cpr if (cena is null) then select first 1 bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena; END cena=coalesce(:cena,0); fk_revsp=GEN_ID(GEN_BD_91_ID,1); if (set_real=1) then cnt_real=cnt_11; INSERT INTO BD_91 (FIELD_KEY, FK_BD_9, FK_BD_TOVAR, CENA, COUNT_11, COUNT_REAL) VALUES ( :fk_revsp, :fk_9, :FK_BD_TOVAR, :CENA, :cnt_11, :cnt_real ); suspend; END END END^ SET TERM ; ^учет отложенных цен при заполнении ревизии17.1.18.1 SP_GET_OST_RASH_PRICE  1o ##$SET TERM ^ ; CREATE OR ALTER trigger bd_21_biud2 for bd_21 active before insert or update or delete position 30 AS declare variable cr char(1); declare variable fk1_6 integer; declare variable fktov integer; declare variable priority integer; declare variable nds integer; declare variable date_save date; declare variable date_make date; declare variable gtd varchar(26); declare variable cena_pr_nds decimal(12,5); declare variable cena_pr_wo_nds decimal(12,5); declare variable inplace decimal(7,3); declare variable articul varchar(20); declare variable cnt decimal(7,3); declare variable stock decimal(7,3); declare variable fk11 integer; decl!7n +9#SET TERM ^ ; CREATE OR ALTER procedure SP_GET_OST_RASH_PRICE ( ID_GRUPPA integer, ID_CENA integer, ID_SKLAD integer, FK_9 integer, SET_REAL integer) returns ( FK_BD_TOVAR integer, NAME varchar(100), CENA decimal(8,2), CNT_11 decimal(7,3), FK_REVSP integer) as declare variable IS_OPT integer; declare variable CNT_REAL decimal(7,3); declare variable FK_SMENA integer; declare variable DATE_REV date; BEGIN select fk_bd_smena, date_rev from bd_9 where field_key=:fk_9 into :fk_smena, :date_rev; select bd_firm.WHOLESALE from bd_firm where field_key=:id_sklad into :is_opt; --остатки по группе товаров в указанной расходной цене if (id_gruppa=0) THEN --если все товары, то группы не присоединяем BEGIN for select bd_tovar.field_key, bd_tovar.name, sum(stock) from bd_tovar join bd_11 on bd_11.fk_bd_tovar=bd_tovar.FIELD_KEY join bd_1 on bd_1.FIELD_KEY=bd_11.fk_bd_1 where (bd_11.STOCK>0) and bd_11.FK_BD_FIRM=:id_sklad and bd_11.VALID_FLAG=1 and (:fk_smena is null or bd_1.fk_bd_smena=:fk_smena) and bd_tovar.is_old_flag<>1 group by 1,2 order by 2 into :fk_bd_tovar, :name, :cnt_11 do BEGIN cena=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rev between coalesce(o1.begin_date,:date_rev) and coalesce(o1.end_date"are variable new_fk_11_6 integer; declare variable fk_supplier_6 integer; declare variable fk_bd_11_6_main integer; declare variable new_cnt_11 decimal(7,3); declare variable fk_1_izl integer; declare variable fk_recipient integer; declare variable date_prih date; declare variable no_izlish_flag integer; declare variable fk_creator_11 integer; begin if ((inserting)or(updating)) then select fk_bd_1_6 from bd_2 where field_key=new.fk_bd_2 into :fk1_6; if (fk1_6 is not null) then begin if ((inserting)or(updating)) then begin select bd_11.fk_bd_tovar, bd_11.priority,bd_11.nds,bd_11.date_save,bd_11.date_make, bd_11.gtd, bd_11.inplace,bd_11.articul, coalesce(bd_11.FK_SUPPLIER_6, bd_11.FK_SUPPLIER), coalesce(fk_bd_11_6_main,bd_11.FIELD_KEY), bd_11.fk_creator_11 from bd_11 where field_key=new.fk_bd_11 into :fktov,:priority,:nds,:date_save,:date_make,:gtd,:inplace,:articul, :fk_supplier_6, :fk_bd_11_6_main, :fk_creator_11; cena_pr_nds=new.cena_with_nds; cena_pr_wo_nds=new.cena_without_nds; end if (inserting) then begin insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE,date_make,GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main, fk_bd_21_6, track_11, fk_creator_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make,:gtd,:cena_pr_nds,:cena_pr_wo_nds,new.cnt, (iif(new.SUM_INPUT_MAN_FLAG=1,new.SUMMA,(new.cnt*:cena_pr_nds))),(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*100),0,:inplace, :articul,(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*:nds), :fk_supplier_6, :fk_bd_11_6_main, new.FIELD_KEY, new.track_21, :fk_creator_11 ) RETURNING (FIELD_KEY) into :new_fk_11_6; new.fk_bd_11_6=:new_fk_11_6; end if (updating) then begin fk11=null; select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0), bd_11.FK_BD_FIRM, bd_11.date_prih from bd_11 where ((field_key=new.fk_bd_11_6)and(fk_bd_1=:fk1_6)) into :fk11, :cnt, :stock, :fk_recipient, :date_prih; /* if (fk11 is null) then select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0) from bd_11 where ((fk_bd_1=:fk1_6) and (fk_bd_tovar=:fktov) and (cnt=old.cnt)) into :fk11, :cnt, :stock; */ if ((:cnt-:stock)>new.cnt) then begin --если мы меняем количество на меньшее, чем возможно, то -- 0) проверяем, разрешены ли излишки по данному товару -- 1) выносим эту позицию в излишки -- 2) в приход вставляем новую позицию, в ней кол-во=колво из расхода, в расходе ссылку на новую позицию select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fktov into :NO_IZLISH_FLAG; if (no_izlish_flag=1) then exception E_ZAPRET_IZLISH; if (fk_1_izl is null) then begin fk_1_izl=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG) VALUES (:fk_1_izl, :fk_recipient,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_recipient), :date_prih,current_time, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ','RU')), :date_prih, :fk_recipient, 7, (select TR_NAME from SP_TRANSLATE('Излишки по перемещению','RU')), 1, (select field_key from BD_USERS where upper(login)=current_user), 1); end new_cnt_11=cnt-stock; update bd_11 set fk_bd_1=:fk_1_izl, cnt=:new_cnt_11, summa_with_nds=cena_pr_with_nds*:new_cnt_11, summa_without_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*100.00, summa_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*nds, fk_supplier_6=:fk_recipient, fk_bd_11_6_main=null, fk_creator_11=:fk_creator_11 where field_key=:fk11; insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE,date_make,GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main, fk_bd_21_6,track_11,fk_creator_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make,:gtd,:cena_pr_nds,:cena_pr_wo_nds,new.cnt, (iif(new.SUM_INPUT_MAN_FLAG=1,new.SUMMA,(new.cnt*:cena_pr_nds))),(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*100),0,:inplace, :articul,(new.cnt*:cena_pr_wo_nds/(100.00+:nds)*:nds), :fk_supplier_6, :fk_bd_11_6_main, new.FIELD_KEY, new.track_21, :fk_creator_11 ) RETURNING (FIELD_KEY) into :new_fk_11_6; new.fk_bd_11_6=:new_fk_11_6; end else --если все хорошо, просто меняем количество update bd_11 set cnt=new.cnt, NDS=:nds, CENA_PR_with_nds=:cena_pr_nds, cena_pr_without_nds=:cena_pr_wo_nds, summa_with_nds=(iif(new.SUM_INPUT_MAN_FLAG=1,new.SUMMA,(new.cnt*:cena_pr_nds))), summa_without_nds=(new.cnt*:cena_pr_nds/(100+:nds)*100), summa_nds=(new.cnt*:cena_pr_nds-(new.cnt*:cena_pr_nds/(100+:nds)*100)), fk_supplier_6=:fk_supplier_6, fk_bd_11_6_main=:fk_bd_11_6_main, fk_creator_11=:fk_creator_11 where ((field_key=:fk11) and (fk_bd_1=:fk1_6) and (fk_bd_tovar=:fktov) and (cnt=:cnt) and (stock=:stock)); end end if (deleting) then begin select fk_bd_1_6 from bd_2 where field_key=old.fk_bd_2 into :fk1_6; if (fk1_6 is not null) then begin --select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0) from bd_11 where (field_key=old.FK_BD_11_6) --into :fk11, :cnt, :stock; select first 1 bd_11.field_key, coalesce(bd_11.cnt,0), coalesce(bd_11.stock,0), bd_11.FK_BD_FIRM, bd_11.date_prih from bd_11 where ((field_key=old.fk_bd_11_6)and(fk_bd_1=:fk1_6)) into :fk11, :cnt, :stock, :fk_recipient, :date_prih; if (:cnt<>:stock) then --exception E_BD_21_6_DELETE; begin --если мы меняем количество на меньшее, чем возможно, то -- 0) проверяем, разрешены ли излишки по данному товару -- 1) выносим эту позицию в излишки select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fktov into :NO_IZLISH_FLAG; if (no_izlish_flag=1) then exception E_ZAPRET_IZLISH; if (fk_1_izl is null) then begin fk_1_izl=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG) VALUES (:fk_1_izl, :fk_recipient,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_recipient), :date_prih,current_time, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ','RU')), :date_prih, :fk_recipient, 7, (select TR_NAME from SP_TRANSLATE('Излишки по перемещению','RU')), 1, (select field_key from BD_USERS where upper(login)=current_user), 1); end new_cnt_11=cnt-stock; update bd_11 set fk_bd_1=:fk_1_izl, cnt=:new_cnt_11, summa_with_nds=cena_pr_with_nds*:new_cnt_11, summa_without_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*100.00, summa_nds=cena_pr_with_nds*:new_cnt_11/(100+nds)*nds, fk_supplier_6=:fk_recipient, fk_bd_11_6_main=null where field_key=:fk11; end else delete from bd_11 where (field_key=:fk11) and (fk_bd_1=:fk1_6); end end end^ SET TERM ; ^bd_21_biud217.1.24.1bd_21_biud2where upper(login)=upper(current_user) into fkuser; /* newcod_prih='0'; if (new.cod_rash='0') then newcod_prih='0'; if (new.cod_rash='1') then newcod_prih='1'; if (new.cod_rash='2') then newcod_prih='2'; if (new.cod_rash='3') then newcod_prih='3'; if (new.cod_rash='8') then newcod_prih='4'; if (new.cod_rash='6') then newcod_prih='6'; */ newcod_prih=coalesce((select min(COD_PRIH_6) from BD_COD_RASH where field_key=new.COD_RASH),'0'); fk1_6=gen_id(gen_bd_1_id,1); /*UPDATE OR*/ INSERT INTO BD_1 ( FIELD_KEY /*INTEGER NOT NULL*/, FK_BD_FIRM /*INTEGER*/, NOMER_PRIH /*INTEGER*/, DATE_PRIH /*DATE*/, TIME_PRIH /*TIME*/, NOMER_NAKL /*CHAR(25)*/, DATE_NAKL /*DATE*/, NOMER_SF /*CHAR(25)*/, FK_SUPPLIER /*INTEGER*/, FK_FACE /*INTEGER*/, COD_PRIH /*CHAR(1)*/, DAY_CONS_PRIH /*INTEGER*/, DATE_SF /*DATE*/, POST_FLAG /*INTEGER*/, EXPORT_FLAG /*INTEGER*/, VALID_FLAG /*INTEGER*/, FK_BD_PFIRM /*INTEGER*/, FK_BD_USERS /*INTEGER*/, PRICE_NDS_FLAG/*BOOLFIELD BOOLFIELD = INTEGER */, FK_BD_SF_IN /*INTEGER*/, FK_SPS1 /*INTEGER*/, MARKER /*INTEGER NOT NULL*/, FK_SELFUL_FROM, FK_SELFUL, DATE_CONS, fk_bd_smena, COMM ) values (:fk1_6,new.fk_recipient,(select coalesce(max(nomer_prih)+1,1) from bd_1 where fk_bd_firm=new.fk_recipient), new.date_rash,current_time,new.nomer_rash,new.date_nakl,null,new.fk_bd_firm,new.fk_face,:newcod_prih,new.day_cons_rash,null, 0,0,0,new.fk_bd_pfirm,:fkuser,:price_nds,null, null, 0,new.fk_selful,new.fk_selful2,new.date_rash+new.day_cons_rash, new.FK_BD_SMENA2, new."COMMENT"); --matching () new.fk_bd_1_6=:fk1_6; if (updating) then begin --если это создание прихода при обновлении, то мы добавляем позиции в новый приход for select bd_11.fk_bd_tovar, bd_21.field_key, bd_21.cnt, bd_21.cena_with_nds, bd_21.CENA_WITHOUT_NDS, bd_11.NDS, bd_11.PRIORITY, bd_11.GTD, bd_11.ARTICUL, bd_11.INPLACE, bd_11.DATE_SAVE, bd_11.date_make, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, coalesce(bd_11.FK_SUPPLIER_6,bd_11.FK_SUPPLIER), coalesce(bd_11.fk_bd_11_6_main,bd_11.field_key), bd_21.field_key, bd_21.track_21, bd_11.fk_creator_11 from bd_21 join bd_11 on bd_11.FIELD_KEY=bd_21.FK_BD_11 where fk_bd_2=new.FIELD_KEY into :fktov, :fk21, :cnt_, :cena_nds, :cena_nonds, :nds, :priority, :gtd, :articul, :inplace, :date_save, :date_make, :summa_21, :man_flag, :fk_supplier_6, :fk_bd_11_6_main, :fk_bd_21_6, :track_21, :fk_creator_11 do begin summa_w_nds=(iif(man_flag=1,SUMMA_21,(cnt_*cena_nds))); --cnt_*cena_nds; summa_wo_nds=summa_w_nds/(100.00+nds)*100.00; summa_nds=summa_w_nds-summa_wo_nds; insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE, date_make, GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main,fk_bd_21_6, track_11, fk_creator_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make, :gtd, :cena_nds, :cena_nonds, :cnt_, :summa_w_nds,:summa_wo_nds,0,:inplace,:articul, :summa_nds, :fk_supplier_6, :fk_bd_11_6_main, :fk_bd_21_6, :track_21, :fk_creator_11) returning (FIELD_KEY) into :newfk_11_6; update bd_21 set bd_21.fk_bd_11_6=:newfk_11_6 where bd_21.field_key=:fk21; track_21=null; end end ----------------------------------<<------------ END end^ SET TERM ; ^bd_2_ins_1_617.1.24.1bd_2_ins_1_6 Ar =#-SET TERM ^ ; CREATE OR ALTER procedure SP_22_BY_21 ( FK_BD_2 integer, WITH_FK_11 integer) as declare variable FK_21 integer; declare variable FK_22 integer; declare variable FK_TOVAR integer; declare variable FK_MOD integer; declare variable CNT decimal(7,3); /* type of column bd_22.CNT; */ declare variable CENA_WITH_NDS decimal(8,2); /* type of column bd_22.CENA_WITH_NDS; */ declare variable CENA_WITHOUT_NDS decimal(8,2); /* type of column bd_22.CENA_WITHOUT_NDS; */ declare variable FK_11 integer; declare variable FK_BD_ORDER_OUT_11 integer; declare variable NDS integer; declare variable NAME_CENA varchar(10); declare variable FK_CENA integer; declare variable IN_PRIH_CENA integer; declare variable SUMMA_21 decimal(15,2); declare variable SUMMA_MAN integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable IN_115_CENA integer; declare variable FK_FIRM integer; declare variable DATE_RASH date; %aq  /, ALTER TABLE BD_TARA_TYPE ADD WEIGHT DECIMAL(8,3)17.2.1.1вес ящикаap q%%%SET TERM ^ ; CREATE OR ALTER trigger bd_2_ins_1_6 for bd_2 active before insert or update position 3 AS declare variable fk1_6 integer; declare variable fk21 integer; declare variable fkuser integer; declare variable price_nds integer; declare variable skl integer; declare variable fktov integer; declare variable priority integer; declare variable nds integer; declare variable date_save date; declare variable date_make date; declare variable gtd varchar(26); declare variable cena_nds decimal(12,5); declare variable cena_nonds decimal(12,5); declare variable summa_nds decimal(12,5); declare variable summa_w_nds decimal(12,5); declare variable summa_wo_nds decimal(12,5); declare variable cnt_ decimal(7,3); declare variable inplace decimal(7,3); declare variable articul varchar(20); declare variable newcod_prih type of column bd_1.cod_prih; declare variable newfk_11_6 integer; declare variable summa_21 decimal(12,5); declare variable man_flag integer; declare variable fk_supplier_6 integer; declare variable fk_bd_11_6_main integer; declare variable fk_bd_21_6 integer; declare variable track_21 type of column bd_21.track_21; declare variable fk_creator_11 integer; begin /* Trigger text */ --приход по расходу уже есть, обрабатываем смену кода расхода, даты расхода, юр.лица получателя, юр.лица отправителя if ((new.FK_BD_1_6 is not null)and((coalesce(old.COD_RASH,'0')<>coalesce(new.COD_RASH,'0'))or(coalesce(old.FK_SELFUL2,0)<>coalesce(new.FK_SELFUL2,0)) or(coalesce(old.DATE_RASH,'1.1.1800')<>coalesce(new.DATE_RASH,'1.1.1800'))or(coalesce(old.FK_SELFUL,0)<>coalesce(new.FK_SELFUL,0))or(coalesce(old.FK_BD_SMENA2,0)<>coalesce (new.FK_BD_SMENA2,0)))) then begin newcod_prih=coalesce((select min(COD_PRIH_6) from BD_COD_RASH where field_key=new.COD_RASH),'0'); update bd_1 set cod_prih=:newcod_prih, fk_selful_from=new.FK_SELFUL, fk_selful=new.FK_SELFUL2, date_prih=new.DATE_RASH, fk_bd_smena=new.FK_BD_SMENA2 where field_key=new.FK_BD_1_6; end --прихода по расходу еще нет и контрагент - не склад if ((new.cod_rash in ('0','1','2','3','8','6'))and((new.fk_bd_firm<>new.fk_recipient)or(coalesce(new.FK_BD_SMENA,0)<>coalesce(new.FK_BD_SMENA2,0)))and (new.fk_bd_1_6 is null)and(coalesce(new.VALID_FLAG,0)<>coalesce(old.VALID_FLAG,0))and(new.VALID_FLAG=1)) then BEGIN if (not exists(select coalesce(bd_firm.sklad,0) from bd_firm where bd_firm.field_key=new.fk_recipient and sklad=1)) then exit; ---------------------------------->>------------ select field_key from bd_users #declare variable CENA_OTL decimal(12,3); BEGIN select coalesce(bd_2.IN_PRIH_CENA,0),coalesce(bd_2.in_bd115_cena,0), bd_2.date_rash from bd_2 where field_key=:fk_bd_2 into :in_prih_cena, :in_115_cena, :date_rash; select first 1 bd_cena.FIELD_KEY, bd_cena.name, bd_firm.field_key from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY join bd_2 on bd_2.FK_BD_FIRM=BD_Firm.FIELD_KEY where bd_2.FIELD_KEy=:FK_BD_2 into :fk_cena, :name_cena, :fk_firm; if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd_2)) then begin update bd_21 set fk_bd_22=null where fk_bd_2=:fk_bd_2 and fk_bd_22 is not null; delete from bd_22 where fk_bd_2=:fk_bd_2; end for select bd_21.field_key, bd_21.fk_bd_tovar, bd_21.fk_bd_tovar_mod , (case when (coalesce(:with_fk_11,0)=0) then null else bd_21.fk_bd_11 end), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_with_nds,bd_11.CENA_PR_WITH_NDS)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_without_nds, bd_11.CENA_PR_WITHOUT_NDS)), bd_21.cnt, -- sum(bd_21.cnt), coalesce(bd_11.nds,bd_tovar.nds,0) , bd_21.FK_BD_ORDER_OUT_11, iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds*bd_21.cnt, iif(((:in_prih_cena=1)and(bd_21.CNT=bd_11.CNT)),bd_11.SUMMA_WITH_NDS,bd_21.SUMMA)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), 0, iif((:in_prih_cena=1) and (bd_21.cena_with_nds<>bd_11.CENA_PR_WITH_NDS), 0, bd_21.SUM_INPUT_MAN_FLAG)), bd_21.CNT_IN_INPLACE -- max(bd_11.NDS) from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 left join bd_115 on bd_115.fk_bd_11=bd_11.field_key left join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar where bd_21.fk_bd_2=:fk_bd_2 -- group by 1,2,3,4,5,6 into :fk_21, :fk_tovar, :fk_mod, :fk_11, :cena_with_nds, :cena_without_nds,:cnt, :nds,:FK_BD_ORDER_OUT_11, :summa_21, :summa_man, :cnt_in_inplace do begin if (in_prih_cena=0) then begin cena_otl=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rash between coalesce(o1.begin_date,:date_rash) and coalesce(o1.end_date,:date_rash) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:fk_firm))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_tovar and ocpr.fk_bd_cena=:fk_cena into :cena_otl; if ((:in_115_cena=1)and(:cena_otl is not null)) then begin cena_with_nds=:cena_otl; cena_without_nds=:cena_with_nds/(100.00+:NDS)*100.00; summa_21=:cena_with_nds*:cnt; end end cnt=abs(cnt); fk_22=gen_id(GEN_BD_22_ID,1); if (coalesce(with_fk_11,0)=0) then fk_11=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, FK_BD_ORDER_OUT_11, NDS, FK_BD_11, CNT, summa, SUM_INPUT_MAN_FLAG, cnt_in_inplace) VALUES (:fk_22,:FK_BD_2,:FK_TOVAR,:FK_MOD,:cena_with_nds,:cena_without_nds,:FK_BD_ORDER_OUT_11,:NDS,:FK_11,:cnt, :summa_21, :summa_man, :cnt_in_inplace); update bd_21 set fk_bd_22=:fk_22, cena_without_nds=:cena_without_nds, cena_with_nds=:cena_with_nds, SUM_INPUT_MAN_FLAG=:summa_man where field_key=:fk_21; end update bd_2 set bd_2.name_ifs=(case when (cod_rash in (4,5,6,9)) then 'В прих.ценах' else 'По цене '||:name_cena end), bd_2.FK_CENA_RASH=(case when (cod_rash in (4,5,6,9)) then null else :fk_cena end), bd_2.IN_PRIH_CENA=(case when (cod_rash in (4,5,6,9)) then 1 else 0 end) where field_key=:fk_bd_2 and name_ifs is null; update bd_2 set valid_flag=1 where field_key=:fk_bd_2; END^ SET TERM ; ^cena_otl17.2.2.1SP_22_BY_21'UTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пыт(емся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_mak)e; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt=:pos) then new.nomer_disc_card=cast(substring(new.idcard from :pos for :len-:pos+1) as integer); else new.nomer_disc_card=new.idcard; end else if ((new.idcard is null)and(new.nomer_disc_card is not null)) then begin -- select first 1 trim(prefix_disc_card) from bd_firm where prefix_disc_card is not null into :mask; len=char_length(:mask); pos=position('S',:mask); prefix=substring(:mask from 1 for :pos-1); new.idcard=:prefix||lpad(new.nomer_disc_card, :len-:pos+1 ,'0'); end end^ SET TERM ; ^ PARAMNAME disc_card_mask17.2.2.1trigger bd_disc_card_nomer v ---1SET TERM ^ ; CREATE trigger bd_115_audit_115 for bd_115 active after insert or update or delete position 31000 AS declare variable fkaudit type of column bd_audit_11.field_key; declare variable fk_tov integer; declare variable fk_1 integer; declare variable fk_firm integer; begin if ((inserting) or (updating)) then select fk_bd_1, fk_bd_tovar, fk_bd_firm from bd_11 where field_key=new.fk_bd_11 into :fk_1, :fk_tov, :fk_firm; if (deleting) then select fk_bd_1, fk_bd_tovar, fk_bd_firm from bd_11 where field_key=old.fk_bd_11 into :fk_1, :fk_tov, :fk_firm; if (inserting) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_11',new.fk_bd_11,'BD_1',:fk_1,'I',current_user,current_date,current_time, :fk_tov) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change,fk_main_field) values ('BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_firm) matching(tablename, fk_table, operation, login, date_change); if (new.cena_with_nds is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',null,new.cena_with_nds, 'Цена 115'); end if (updating) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_11',new.fk_bd_11,'BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_tov) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change,fk_main_field) values ('BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_firm) matching(tablename, fk_table, operation, login, date_change); if ((new.cena_with_nds is distinct from old.cena_with_nds)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.CENA_WITH_NDS,new.CENA_WITH_NDS,'Цена 115'); end if (deleting) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_11',old.fk_bd_11,'BD_1', :fk_1, 'D',current_user,current_date,current_time, :fk_tov) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_firm) matching(tablename, fk_table, operation, login, date_change); if (old.CENA_WITH_NDS is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.CENA_WITH_NDS,null,'Цена 115'); end end^ SET TERM ; ^bd_115_audit_11517.2.2.1bd_115_audit_115   rw 7]K2SET TERM ^ ; CREATE OR ALTER trigger bd_nacenka_matrix_audit for bd_nacenka_matrix active after insert or update or delete position 31000 AS declare variable fkaudit type of column bd_audit_1.field_key; declare variable operation varchar(1); declare variable fk integer; begin if (inserting) then begin operation='I'; fk=new.field_key; end if (updating) then begin operation='U'; fk=new.field_key; end if (deleting) then begin operation='D'; fk=old.field_key; end insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change) values ('BD_NACENKA_MATRIX',:fk,:operation,current_user,current_date,current_time) returning (field_key) into :fkaudit; if (coalesce(old.fk_bd_tovar,-1)<>coalesce(new.fk_bd_tovar,-1)) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'FK_BD_TOVAR',old.fk_bd_tovar,new.fk_bd_tovar,'BD_NACENKA_MATRIX',:fk, 'Код товара'); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table,fieldnametxt) values (:fkaudit,'TOVAR',(select name from bd_tovar where field_key=old.fk_bd_tovar),(select name from bd_tovar where field_key=new.fk_bd_tovar),'BD_NACENKA_MATRIX',:fk,'Товар'); end if (coalesce(old.fk_bd_cena,-1)<>coalesce(new.fk_bd_cena,-1)) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'FK_BD_CENA',old.fk_bd_cena,new.fk_bd_cena,'BD_NACENKA_MATRIX',:fk, 'Код цены'); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table,fieldnametxt) values (:fkaudit,'CENA',(select name from bd_CENA where field_key=old.fk_bd_cena),(select name from bd_CENA where field_key=new.fk_bd_cena),'BD_NACENKA_MATRIX',:fk,'Цена'); end if (coalesce(old.margin,-1)<>coalesce(new.margin,-1)) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'MARGIN',old.margin,new.margin,'BD_NACENKA_MATRIX',:fk, 'Наценка'); end end^ SET TERM ; ^Аудит матрицы наценок17.2.2.1trigger bd_nacenka_matrix_audit y [mm4UPDATE OR INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Отложеные цены', 'tfrmotlcena', 55) MATCHING (FORMCLASS_NAME);BD_SMARTPRINT_REZHIM Отложеные цены17.2.4.1BD_SMARTPRINT_REZHIM Отложеные ценыx I9-3SET TERM ^ ; CREATE OR ALTER trigger bd_115_audit_115 for bd_115 active after insert or update or delete position 31000 AS declare variable fkaudit type of column bd_audit_11.field_key; declare variable fk_tov integer; declare variable fk_1 integer; declare variable fk_firm integer; begin if ((inserting) or (updating)) then select fk_bd_1, fk_bd_tovar, fk_bd_firm from bd_11 where field_key=new.fk_bd_11 into :fk_1, :fk_tov, :fk_firm; if (deleting) then select fk_bd_1, fk_bd_tovar, fk_bd_firm from bd_11 where field_key=old.fk_bd_11 into :fk_1, :fk_tov, :fk_firm; if (inserting) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_11',new.fk_bd_11,'BD_1',:fk_1,'I',current_user,current_date,current_time, :fk_tov) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change,fk_main_field) values ('BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_firm) matching(tablename, fk_table, operation, login, date_change); if (new.cena_with_nds is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',null,new.cena_with_nds, 'Цена 115'); end if (updating) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_11',new.fk_bd_11,'BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_tov) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change,fk_main_field) values ('BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_firm) matching(tablename, fk_table, operation, login, date_change); if ((new.cena_with_nds is distinct from old.cena_with_nds)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.CENA_WITH_NDS,new.CENA_WITH_NDS,'Цена 115'); end /* if (deleting) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_11',old.fk_bd_11,'BD_1', :fk_1, 'D',current_user,current_date,current_time, :fk_tov) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_1',:fk_1,'U',current_user,current_date,current_time, :fk_firm) matching(tablename, fk_table, operation, login, date_change); if (old.CENA_WITH_NDS is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.CENA_WITH_NDS,null,'Цена 115'); end */ end^ SET TERM ; ^исправления17.2.4.1bd_115_audit_115 I ] z * GIz oK3:ALTER TABLE BD_EGAIS_FORMB_REGS add AREG_ID VARCHAR(50), add CNT DECIMAL(12,3), add FSRAR_ID VARCHAR(64), add ALCCODE VARCHAR(64), ADD CURRCNT DECIMAL(12,3);bd_egais_formb_regs add ALCCODE17.2.11.1bd_egais_formb_regs_~ W U9CREATE OR ALTER trigger tr_bd_calc_ad for bd_calc active after delete position 0 AS BEGIN update bd_pr set BD_PR.FK_BD_CALC=null where fk_bd_calc=old.FIELD_KEY; update BD_PR_ZAKAZ_PRODUCT p set p.FK_BD_CALC=null where fk_bd_calc=old.FIELD_KEY; delete from bd_calc_product where bd_calc_product.fk_calc=old.field_key; delete from bd_calc_component where bd_calc_component.fk_calc=old.field_key; END17.2.6.2полное удаление ТТКM}e %8COMMENT ON TABLE BD_AUTHOR IS 'Авторы'17.2.6.1авторы_| 'AQ7ALTER TABLE BD_TOVAR ADD FK_BD_PUBLISHER INTEGER, ADD FK_BD_AUTHOR INTEGER, ADD PRINT_YEAR SMALLINT, ADD ISBN VARCHAR(13)книги в товаре17.2.6.1изменения для книг'{ i S6CREATE TABLE BD_AUTHOR ( FIELD_KEY INTEGER NOT NULL, NAME VARCHAR(50)); CREATE SEQUENCE GEN_BD_AUTHOR_ID; SET TERM ^ ; create trigger bd_author_bi for bd_author active before insert position 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_author_id,1); end^ SET TERM ; ^ GRANT ALL ON BD_AUTHOR TO PUBLIC;17.2.6.1справочник авторовtz s c5CREATE TABLE BD_PUBLISHER ( FIELD_KEY INTEGER NOT NULL, NAME VARCHAR(15), FULLNAME VARCHAR(30), ADDR VARCHAR(100)); CREATE SEQUENCE GEN_BD_PUBLISHER_ID; SET TERM ^ ; create trigger bd_publisher_bi for bd_publisher active before insert position 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_publisher_id,1); end^ SET TERM ; ^ GRANT ALL ON BD_PUBLISHER TO PUBLIC;17.2.6.1Справочник издательств 9 Oy#= :lb) AND (bd_tovar.grp_rb <= :rb) into :fk_tovar,:name_tovar, :edizm do begin cnt_stock_1=0; sum_stock_1=0; cnt_prih=0; sum_prih=0; cnt_rash=0; sum_rash=0; cnt_stock_2=0; sum_stock_2=0; -- :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' это фильтр по складу. -- находим остатки 1 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<:date_start and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_1, :sum_stock_1; -- находим приход select sum(bd_11.cnt),sum(bd_11.summa_with_nds) from bd_11 join bd_firm on (bd_11.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end into :cnt_prih,:sum_prih; -- находим расход select sum(bd_21.cnt),sum(bd_21.summa) from bd_21 join bd_firm on (bd_21.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_21.fk_bd_tovar=:fk_tovar and bd_21.date_rash between :date_start and :date_end into :cnt_rash,:sum_rash; -- находим остатки 2 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<(:date_end+1) and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_2, :sum_stock_2; suspend; end endдля отчета Оборотка по товару17.2.13.1o_oborotka1 v ?#= CREATE OR ALTER procedure O_OBOROTKA1 ( DATE_START date, DATE_END date, FK_SKLAD_POINTER blob sub_type 0 segment size 200, FK_GRT integer) returns ( FK_TOVAR integer, NAME_TOVAR varchar(50), EDIZM varchar(4), CNT_STOCK_1 decimal(15,3), SUM_STOCK_1 decimal(15,2), CNT_PRIH decimal(15,3), SUM_PRIH decimal(15,2), CNT_RASH decimal(15,3), SUM_RASH decimal(15,2), CNT_STOCK_2 decimal(15,3), SUM_STOCK_2 decimal(15,2)) as declare variable LB integer; declare variable RB integer; begin -- цикл РїРѕ всем РЅРµ архивным товарам РёР· выбранной РіСЂСѓРїРїС‹ select lb,rb from bd_grt_tovar where field_key=:fk_grt into :lb,:rb; for select field_key,name,ed_izm_name from bd_tovar where ( bd_tovar.grp_lb >= :lb) AND (bd_tovar.grp_rb <= :rb) into :fk_tovar,:name_tovar, :edizm do begin cnt_stock_1=0; sum_stock_1=0; cnt_prih=0; sum_prih=0; cnt_rash=0; sum_rash=0; cnt_stock_2=0; sum_stock_2=0; -- :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' это фильтр РїРѕ складу. -- находим остатки 1 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<:date_start and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_1, :sum_stock_1; if (cnt_stock_1=0) then sum_stock_1=0; -- находим РїСЂРёС…РѕРґ select sum(bd_11.cnt),sum(bd_11.summa_with_nds) from bd_11 join bd_firm on (bd_11.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end into :cnt_prih,:sum_prih; -- находим расход select sum(bd_21.cnt),sum(bd_21.summa) from bd_21 join bd_firm on (bd_21.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_21.fk_bd_tovar=:fk_tovar and bd_21.date_rash between :date_start and :date_end into :cnt_rash,:sum_rash; -- находим остатки 2 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<(:date_end+1) and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_2, :sum_stock_2; if (cnt_stock_2=0) then sum_stock_2=0; suspend; end endубрать минуса17.2.17.1o_oborotka1 GG5 i9A>CREATE GENERATOR GEN_EGAIS_FORMA_P1_MARKCODE_ID; CREATE TABLE BD_EGAIS_FORMA_P1_MARKCODE ( FIELD_KEY INTEGER NOT NULL, FK_EGAIS_FORMA_P1 INTEGER, MARKCODE VARCHAR(68), ALCCODE VARCHAR(50), FSRAR_ID VARCHAR(50) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_FORMA_P1_MARKCODE ADD CONSTRAINT PK_BD_EGAIS_FORMA_P1_MARKCODE PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_FORMA_P1_MARKCODE_IDX1 ON BD_EGAIS_FORMA_P1_MARKCODE (FK_EGAIS_FORMA_P1); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_FORMA_P1_MARKCODE_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_FORMA_P1_MARKCODE_BI FOR BD_EGAIS_FORMA_P1_MARKCODE ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_egais_forma_p1_markcode_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_FORMA_P1_MARKCODE TO PUBLIC;акциз. марки17.2.17.1BD_EGAIS_FORMA_P1_MARKCODE o\o 7 WCCREATE INDEX IDX_BD_KASSA_MENU_DOPGRT1 ON BD_KASSA_MENU_DOPGRT (FK_BD_KASSA_MENU);17.2.20.1CREATE INDEX IDX_BD_KASSA_MENU_DOPGRTt OCOBCREATE TABLE bd_kassa_menu_dopgrt ( field_key integer not null primary key, fk_bd_kassa_menu integer, name varchar(100), ord_num integer );подгруппы меню17.2.20.1CREATE TABLE bd_kassa_menu_dopgrt\ I/7Aexecute block as declare variable num integer; declare variable fk_menu integer; declare variable fk_grt_firm integer; begin for select distinct m.FK_BD_GRT_FIRM from BD_KASSA_MENU m join BD_KASSA_MENU_GRT g on g.FIELD_KEY=m.FK_BD_KASSA_MENU_GRT into :fk_grt_firm do begin num=0; for select m.field_key from BD_KASSA_MENU m join BD_KASSA_MENU_GRT g on g.FIELD_KEY=m.FK_BD_KASSA_MENU_GRT where m.FK_BD_GRT_FIRM=:fk_grt_firm order by g.NAME into :fk_menu do begin num=num+1; update BD_KASSA_MENU m set m.ORD_NUM=:num where field_key=:fk_menu; end end endпроставляем порядковые номера для сущ групп17.2.20.1execute block Ord_num}kK?@ALTER TABLE BD_KASSA_MENU ADD ord_num Integer;порядковый номер17.2.20.1ALTER TABLE BD_KASSA_MENU  [-/?CREATE GENERATOR GEN_BD_EGAIS_FORMA_P1_ID; CREATE TABLE BD_EGAIS_FORMA_P1 ( FIELD_KEY INTEGER NOT NULL, AREG_ID VARCHAR(50), CNT DECIMAL(12,3), ALCCODE VARCHAR(64), FSRAR_ID VARCHAR(64), AREG_BOTTLINGDATE DATE, AREG_TTNNUMBER VARCHAR(64), AREG_TTNDATE DATE, AREG_EGAISNUMBER VARCHAR(64), AREG_EGAISDATE DATE, CURRCNT DECIMAL(12,3) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_FORMA_P1 ADD CONSTRAINT PK_BD_EGAIS_FORMA_P1 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_FORMA_P1_IDX1 ON BD_EGAIS_FORMA_P1 (ALCCODE); CREATE INDEX BD_EGAIS_FORMA_P1_IDX2 ON BD_EGAIS_FORMA_P1 (FSRAR_ID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_FORMA_P1_AD0 */ CREATE OR ALTER TRIGGER BD_EGAIS_FORMA_P1_AD0 FOR BD_EGAIS_FORMA_P1 ACTIVE AFTER DELETE POSITION 0 AS begin /* Trigger text */ delete from bd_egais_forma_p1_markcode where fk_egais_forma_p1=old.field_key; end ^ /* Trigger: BD_EGAIS_FORMA_P1_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_FORMA_P1_BI FOR BD_EGAIS_FORMA_P1 ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_forma_p1_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_FORMA_P1 TO PUBLIC;данные справок А для постановки на баланс Р117.2.17.1BD_EGAIS_FORMA_P1 /T  Hz/Hg LGRANT EXECUTE ON PROCEDURE stock_ig TO PUBLIC17.3.1.1grants ;KCREATE OR ALTER procedure STOCK_IG ( FK_SKLAD integer, FK_TOVAR integer) returns ( STOCK decimal(10,3)) as declare variable DATE_S date; declare variable CHECKS decimal(10,3); begin select max(date_rev) from bd_9 where not (fk_bd_1 is null and fk_bd_2 is null) into :date_s; select coalesce(sum(bd_11.stock),0) from bd_11 inner join bd_1 on (bd_11.fk_bd_1 = bd_1.field_key) where ( (bd_1.fk_bd_firm = :fk_sklad) and (bd_11.fk_bd_tovar=:fk_tovar) ) into :stock ; select coalesce(sum(bd_ch21.cnt),0) from bd_ch21 inner join bd_ch2 on (bd_ch21.fk_bd_ch2=bd_ch2.field_key) where bd_ch2.date_close between (:date_s+1) and current_date and bd_ch21.fk_bd_tovar=:fk_tovar and bd_ch2.fk_bd_firm = :fk_sklad and bd_ch2.accept_flag =0 into :checks; stock=stock-checks; suspend; endостаток с учетом не переведенных в расход чеков17.3.1.1stock_igG ! YJSET TERM ^ ; create TRIGGER BD_KASSA_MENU_dopgrt_AD for BD_KASSA_MENU_DOPGRT ACTIVE AFTER DELETE POSITION 0 AS begin update BD_KASSA_MENU_DOPGRT set ord_num=ord_num-1 where ord_num>old.ORD_NUM and fk_bd_kassa_menu=old.fk_bd_kassa_menu; end^ SET TERM ; ^ 17.2.20.1create TRIGGER BD_KASSA_MENU_dopgrt_ADw  YISET TERM ^ ; CREATE TRIGGER TR_KASSA_MENU_DOPGRT_BI FOR BD_KASSA_MENU_DOPGRT ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new.ORD_NUM is null) then begin new.ORD_NUM=coalesce((select max(ord_num) from BD_KASSA_MENU_DOPGRT where fk_bd_kassa_menu=new.FK_BD_KASSA_MENU)+1,1); end END^ SET TERM ; ^ 17.2.20.1CREATE TRIGGER TR_KASSA_MENU_DOPGRT_BIW O KHSET TERM ^ ; CREATE TRIGGER TR_KASSA_MENU_BI FOR BD_KASSA_MENU ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new.ORD_NUM is null) then begin new.ORD_NUM=coalesce((select max(ord_num) from bd_kassa_menu where fk_bd_grt_firm=new.FK_BD_GRT_FIRM)+1,1); end END^ SET TERM ; ^ 17.2.20.1CREATE TRIGGER TR_KASSA_MENU_BI^ ] KGSET TERM ^ ; ALTER TRIGGER BD_KASSA_MENU_AD0 ACTIVE AFTER DELETE POSITION 0 AS begin delete from bd_kassa_menu_tovar where fk_bd_kassa_menu=old.field_key; update bd_kassa_menu set ord_num=ord_num-1 where ord_num>old.ORD_NUM and fk_bd_grt_firm=old.FK_BD_GRT_FIRM; end^ SET TERM ; ^17.2.20.1ALTER TRIGGER BD_KASSA_MENU_AD06  YFCREATE GENERATOR GEN_BD_KASSA_MENU_DOPGRT_ID; SET TERM !! ; CREATE TRIGGER BD_KASSA_MENU_DOPGRT_BI FOR BD_KASSA_MENU_DOPGRT ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_KASSA_MENU_DOPGRT_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_KASSA_MENU_DOPGRT_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_KASSA_MENU_DOPGRT_ID, new.FIELD_KEY-tmp); END END!! SET TERM ; !!17.2.20.1CREATE TRIGGER BD_KASSA_MENU_DOPGRT_BI A WECREATE INDEX IDX_BD_KASSA_MENU_TOVAR1 ON BD_KASSA_MENU_TOVAR (FK_BD_KASSA_MENU_DOPGRT);17.2.20.1CREATE INDEX IDX_BD_KASSA_MENU_TOVAR1( gKDALTER TABLE BD_KASSA_MENU_TOVAR ADD fk_bd_kassa_menu_dopgrt Integer;ссылка на подгруппы меню17.2.20.1ALTER TABLE BD_KASSA_MENU_TOVAR t t& EA?OCREATE GENERATOR GEN_BD_EGAIS_DOC_RASH_TOV11_ID; CREATE TABLE BD_EGAIS_DOC_RASH_TOVAR11 ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER, ALCCODE VARCHAR(64), BREG_ID VARCHAR(50), AREG_ID VARCHAR(50), CNT NUMERIC(12,3), CURRCNT NUMERIC(12,3) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_DOC_RASH_TOVAR11 ADD CONSTRAINT PK_BD_EGAIS_DOC_RASH_TOVAR11 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_DOC_RASH_TOVAR11_IDX1 ON BD_EGAIS_DOC_RASH_TOVAR11 (FK_EDOCS); CREATE INDEX BD_EGAIS_DOC_RASH_TOVAR11_IDX2 ON BD_EGAIS_DOC_RASH_TOVAR11 (ALCCODE); CREATE INDEX BD_EGAIS_DOC_RASH_TOVAR11_IDX3 ON BD_EGAIS_DOC_RASH_TOVAR11 (BREG_ID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_DOC_RASH_TOVAR11_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_DOC_RASH_TOVAR11_BI FOR BD_EGAIS_DOC_RASH_TOVAR11 ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_doc_rash_tov11_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_DOC_RASH_TOVAR11 TO PUBLIC;таблица для справок (А,Б) при расходе или возврате17.3.2.1BD_EGAIS_DOC_RASH_TOVAR11^ 1_'MALTER TABLE BD_EGAIS_DOCS ADD WB_TYPE VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.WB_TYPE IS 'Тип накладной: WBInvoiceFromMe - расход; WBReturnToMe - возврат мне; WBInvoiceToMe - приход; WBReturnFromMe - возврат от меня;'; ALTER TABLE BD_EGAIS_DOCS ADD SHIPPER_CLIENTREGID VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.SHIPPER_CLIENTREGID IS 'Отправитель ФСРАР ИД'; ALTER TABLE BD_EGAIS_DOCS ADD CONSIGNEE_CLIENTREGID VARCHAR(50); COMMENT ON COLUMN BD_EGAIS_DOCS.CONSIGNEE_CLIENTREGID IS 'Грузополучатель ФСРАР ИД'; ALTER TABLE BD_EGAIS_DOCS ADD TRAN_COMPANY VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD TRAN_CAR VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD TRAN_CUSTOMER VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD TRAN_DRIVER VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD TRAN_LOADPOINT VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD TRAN_UNLOADPOINT VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD TRAN_FORWARDER VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD WB_BASE VARCHAR(100); ALTER TABLE BD_EGAIS_DOCS ADD WB_NOTE VARCHAR(200);новые поля для расхода17.3.2.1BD_EGAIS_DOCS B = 7RSET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200),8F !33QALTER TABLE BD_EGAIS_FORMB_REGS ADD PRICE DECIMAL(12,3); ALTER TABLE BD_EGAIS_FORMB_REGS ADD S_REGID VARCHAR(50); ALTER TABLE BD_EGAIS_FORMB_REGS ADD C_REGID VARCHAR(50); ALTER TABLE BD_EGAIS_FORMB_REGS ADD XML_HISTORY BLOB SUB_TYPE 1 SEGMENT SIZE 4096;новые поля17.3.5.1BD_EGAIS_FORMB_REGS! 7E?NSET TERM ^ ; CREATE OR ALTER trigger bd_egais_docs_ad0 for bd_egais_docs active after delete position 0 AS begin delete from bd_egais_doc_replies where fk_edocs=old.field_key; delete from bd_egais_formb_regs where fk_edocs=old.field_key; delete from bd_egais_nakl_facts where fk_edocs=old.field_key; delete from bd_egais_doc_rash_tovar where fk_edocs=old.field_key; end^ SET TERM ; ^чистит товары расходной накладной при ее удалении17.3.2.1trigger bd_egais_docs_ad0i e+;PCREATE GENERATOR GEN_BD_EGAIS_DOC_RASH_TOVAR_ID; CREATE TABLE BD_EGAIS_DOC_RASH_TOVAR ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER, ALCCODE VARCHAR(64), CNT DECIMAL(12,3) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_DOC_RASH_TOVAR ADD CONSTRAINT PK_BD_EGAIS_DOC_RASH_TOVAR PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_DOC_RASH_TOVAR_IDX1 ON BD_EGAIS_DOC_RASH_TOVAR (FK_EDOCS); CREATE INDEX BD_EGAIS_DOC_RASH_TOVAR_IDX2 ON BD_EGAIS_DOC_RASH_TOVAR (ALCCODE); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_DOC_RASH_TOVAR_BD0 */ CREATE OR ALTER TRIGGER BD_EGAIS_DOC_RASH_TOVAR_BD0 FOR BD_EGAIS_DOC_RASH_TOVAR ACTIVE BEFORE DELETE POSITION 0 AS begin delete from bd_egais_doc_rash_tovar11 where fk_edocs=old.fk_edocs and alccode=old.alccode; end ^ /* Trigger: BD_EGAIS_DOC_RASH_TOVAR_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_DOC_RASH_TOVAR_BI FOR BD_EGAIS_DOC_RASH_TOVAR ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_doc_rash_tovar_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_DOC_RASH_TOVAR TO PUBLIC;таблица товаров для расходов или возвратов17.3.2.1BD_EGAIS_DOC_RASH_TOVAR MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; BEGIN ins=0; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz into :cnt do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --stock=0; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^добавить OLDKEY в выходные параметры17.3.5.2SP_GET_SPR_FOR_ZAKPOL цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.0000)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.0000) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^Добавить OLDKEY в выходные параметры17.3.5.2SP_GET_CURRSTATE_FOR_ZAKPOL b6bD U)TSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_RASH ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer, WITHCNT smallint = 1) returns ( FK_2 integer) as declare variable ID_SKLAD integer; declare variable ID_REC integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable COD_R integer; declare variable D_COD_R integer; declare variable FK_PFIRM_REC integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable CENA decimal(8,2); declare variable FK_BD_TOVAR integer; declare variable CNT decimal(7,3); declare variable REZ integer; declare variable CNT_OTGR decimal(7,3); declare variable FK_O11 integer; declare variable SUM_DOC decimal(8,2); declare variable SUM_OK decimal(8,2); declare variable SUMRAZNES decimal(8,2); declare variable FK_KS1 integer; declare variable CNT_SO decimal(8,3); declare variable FK_SELFUL integer; declare variable MARGIN decimal(3,2); declare variable DISCOUNT decimal(3,2); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable NDS integer; declare variable FK_11_REZERV integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_USER integer; declare variable NAME_IFS type;> ) CSSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME type of column BD_TOVAR.NAME, CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME type of column BD_TOVAR.FULLNAME, INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана 9< of column BD_2.NAME_IFS; declare variable FK_REZ integer; declare variable FK_SNOOP_DOGG integer; declare variable STOCK_TOVAR decimal(12,3); declare variable FK_ZAMENA integer; declare variable CNT_ZAMENA decimal(12,3); declare variable KOEF decimal(12,3); declare variable INPLACE_Z decimal(12,3); declare variable NDS_Z decimal(12,3); declare variable CENA_Z decimal(12,3); BEGIN /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=1; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --заголовок расхода select fk_bd_firm, fk_recipient, cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :id_rec, :cod_r, :FK_PFIRM_REC, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_snoop_dogg; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_sklad), null, CURRENT_DATE, :id_rec, :fk_face, :cod_r, :d_cod_r, :fk_user, null, 0, null, null, null, :id_sklad, null, 0, :FK_PFIRM_REC, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_snoop_dogg); --перебираем все строки заказа --сначала переводим в расход строки с резервом cnt_so=0; rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 left join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) where fk_bd_out_1=:id_zakaz --and fk_bd_11_rezerv is null into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :rez, :nds, :inplace do BEGIN --ost_rash - ищем, сколько уже отгружено по данной позиции cnt_otgr=0; if (withcnt=1) then select sum(cnt) from BD_22 where bd_22.fk_bd_order_out_11=:fk_o11 into :cnt_otgr; cnt_otgr=coalesce(cnt_otgr,0); ost_rash=ost_rash-cnt_otgr; --проверяем по остаткам если нехватает, проверим замены select sum(stock) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and stock>0 into :stock_tovar; if (coalesce(:stock_tovar,0)<:ost_rash) then begin for select sp.fk_tovar_zamena, sp.cnt_tovar_zamena, sp.koef, t.nds, t.inplace from sp_create_rash_checktov_zamena(:id_zakaz,:fk_o11,:ost_rash-coalesce(:stock_tovar,0)) sp join bd_tovar t on t.field_key=sp.fk_tovar_zamena into :fk_zamena, :cnt_zamena, :koef, :nds_z, :inplace_z do begin cena_z=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_zamena and fk_bd_cena=:fk_cena into :cena_z; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, null , :cena_z, :cena_z/(1+(coalesce(:nds_z,0)/100)), :cnt_zamena, :fk_o11, :fk_zamena, :inplace_z, :nds_z); cnt_so=cnt_so+cnt_zamena; ost_rash=:ost_rash-(:cnt_zamena*:koef); end end --актуализируем цены --только для расходных цен if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (rez is not null) then begin update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; end else begin fk_11_rezerv=null; end --заполняем расход -- 1. Rezerv or position from fk_bd_11 if ((withcnt=0)or(ost_rash>0)) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); cnt_so=cnt_so+ost_rash; ost_rash=0; end rez=null; END if ((withcnt=0)or(cnt_so>0)) THEN BEGIN -- update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz; if (prov_bd_2_flag=1) then begin execute procedure sp_bd2_prov(:fk_2,'RU',coalesce(:tsd_check,0),:fk_user); if ((select count(*) from bd_2_resultprov r where r.fk_bd_2=:fk_2)>0) then begin delete from bd_21 where fk_bd_2=:fk_2; update bd_2 set valid_flag=0 where field_key=:fk_2; end end -- execute procedure sp_22_by_21(:fk_2,0); update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); -- END ELSE delete from BD_2 where field_key=:fk_2; --делаем разнесение --находим сумму расхода select sum(summa) from bd_21 where fk_bd_2=:fk_2 into :sum_doc; for select fk_ks_1, sum(summa) from ks_11 where fk_ks_1 is not null and coalesce(fo_order_out,0)=:ID_ZAKAZ group by fk_ks_1 into :fk_ks1, :sumraznes do BEGIN --находим сколько можем разнести по этой оплате select main.summa-coalesce((select sum(ks_11.summa) from ks_11 where ks_11.fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null and coalesce(ks_11.fk_bd_2,0)<>:fk_2),0) from ks_1 main where main.field_key=:fk_ks1 group by main.summa into :sum_ok; --сравниваем суммы sumraznes=minvalue(sumraznes,sum_ok,sum_doc); if (sumraznes>0) THEN BEGIN --создаем разнесение в этой же оплате по этому же расходу INSERT INTO KS_11 (FIELD_KEY, FK_KS_1, FK_BD_2, SUMMA) VALUES (gen_id(GEN_KS_11_ID,1), :FK_KS1, :FK_2, :sumraznes); sum_doc=sum_doc-sumraznes; END END END^ SET TERM ; ^WITHCNT создание расхода без кол-ва17.3.5.2SP_CREATE_RASH integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; BEGIN ins=0; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz into :cnt do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --stock=0; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end ENDАссортиментные матрицы в заявках покупателей17.3.9.1SP_GET_SPR_FOR_ZAKPOL  p p 57UCREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG=  g-VSET TERM ^ ; ALTER PROCEDURE SP_CALC_SEB_PLAN ( FK_CALC Integer, WITH_NDS Integer DEFAULT 0 ) RETURNS ( SUMMA_SEB Decimal(12,3), CENA_PR Decimal(12,3), NAME Char(100), FULLNAME Char(200), NORMA Decimal(15,4), PRIM Varchar(200), HAS_0 Integer ) AS declare variable FK_BD_TOVAR integer; declare variable FK_BD_ZAMENA integer; declare variable KOEF type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_SUB_CALC integer; declare variable SUB_NORMA type of column BD_CALC_COMPONENT.NORMA; declare variable I integer; declare variable NOMER_CALC type of column BD_CALC.NOMER_CALC; declare variable SUB_TTK_HAS_0 integer; declare variable IS_SBOR integer; declare variable SUB_SBOR integer; BEGIN summa_seb=0; is_sbor=coalesce((select is_sbor from bd_calc where field_key=:fk_calc),0); --сначала находим все сырье без ТТК for select fk_bd_tovar, coalesce(norma,0) from BD_CALC_COMPONENT c where c.fk_calc=:fk_calc and coalesce(c.norma,0)>0 and (:is_sbor=1) union select fk_bd_tovar, coalesce(norma,0) from BD_CALC_PRODUCT p where p.fk_calc=:fk_calc and coalesce(p.norma,0)>0 and (:is_sbor=0) --тут косяк into :fk_bd_tovar, :norma do begin --ищем, есть ли ТТК у компонента fk_sub_calc=null; fk_sub_calc= ( select max(fk) from ( select bd_calc.field_key as fk from bd_calc join bd_calc_product pr on pr.fk_calc=bd_calc.field_key where pr.fk_bd_tovar=:FK_BD_TOVAR and BD_CALC.valid_flag=1 and bd_calc.is_sbor=1 union select bd_calc.field_key as fk from bd_calc join BD_CALC_COMPONENT c on c.fk_calc=bd_calc.field_key where c.fk_bd_tovar=:FK_BD_TOVAR and BD_CALC.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=0 ) ); if (fk_sub_calc is null) then begin --простое сырье has_0=0; prim=null; cena_pr=0; --находим ПЦ select coalesce(last_cena_pr,0) from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; prim='Последняя приходная цена'; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (coalesce(cena_pr,0)=0) then begin prim='цена не найдена'; has_0=1; end suspend; end else begin --полуфабрикат select bd_calc.NOMER_CALC, is_sbor from BD_CALC where field_key=:fk_sub_calc into :nomer_calc, :sub_sbor; prim='Расчет по ТТК №'||nomer_calc; if (sub_sbor=1) then sub_norma=(select norma from BD_CALC_PRODUCT where fk_calc=:fk_sub_calc and fk_bd_tovar=:fk_bd_tovar); else sub_norma=(select norma from BD_CALC_PRODUCT where fk_calc=:fk_sub_calc) ; --sub_norma=(select norma from BD_CALC_COMPONENT where fk_calc=:fk_sub_calc and fk_bd_tovar=:fk_bd_tovar); --находим себ по ТТК select max(summa_seb), max(has_0) from sp_calc_seb_plan(:fk_sub_calc, :with_nds) into :cena_pr, :sub_ttk_has_0; cena_pr=cena_pr/sub_norma; select name, fullname from BD_TOVAR where field_key=:fk_bd_tovar into :name, :fullname; summa_seb=summa_seb+cena_pr*norma; if (sub_ttk_has_0=1) then has_0=1; suspend; end end --товары с ТТК - находим ТТК, по ней рекурсивно получаем сумму себ --suspend; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_PLAN TO SYSDBA;исправление бага с расчетом себестоимости по разборной ттк17.3.13.1SP_CALC_SEB_PLAN  | |  E+WSET TERM ^ ; ALTER PROCEDURE SP_CALC_SEB_TOV ( FK_BD_TOVAR Integer, FK_BD_FIRM Integer, NORMA Decimal(3,2) ) RETURNS ( CENA_CPR Decimal(15,2), CENA_PR Decimal(15,2), CENA_SEB Decimal(15,4), CENA_SEB_ED Decimal(15,4) ) AS declare variable FK_TTK integer; declare variable FK_TOV_TTK integer; declare variable CENA_TTK decimal(15,2); declare variable NORMA_TTK decimal(12,5); declare variable NORMA_TTK_SUM integer; declare variable MOTHER_NORM decimal(15,4); declare variable SOM_VAR decimal(15,4); begin select cena from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=(select fk_bd_cena_basic from bd_firm where field_key=:fk_bd_firm) into :cena_cpr; select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; select first 1 c.field_key, c.norma_min from bd_calc c where c.fk_bd_tovar=:fk_bd_tovar and c.valid_flag=1 into :fk_ttk,:mother_norm; if (fk_ttk is not null) then begin select max(summa_seb)/(select iif(coalesce(norma_min,0)=0,1,coalesce(norma_min,0)) from bd_calc where field_key=:fk_ttk) as total_seb from SP_CALC_SEB_PLAN(:fk_ttk) into :cena_pr; cena_seb=cena_pr*norma; end else begin cena_seb=:cena_pr*:norma; cena_seb_ed=:cena_pr; end suspend; end ^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO PROCEDURE SP_CALC_SEB_TOV; GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO PROCEDURE SP_GET_CALC_TREE; GRANT EXECUTE ON PROCEDURE SP_CALC_SEB_TOV TO SYSDBA;перекомпиляция17.3.13.1SP_CALC_SEB_TOV  EE-XSET TERM ^ ; ALTER PROCEDURE SP_GET_CALC_TREE ( FK_TTK Integer, FK_CMP Integer DEFAULT null, NORMA_PROD Decimal(15,4) DEFAULT null, IN_LEVEL Integer DEFAULT null ) RETURNS ( FIELD_KEY Integer, FK_PARENT Integer, FK_CALC Integer, FK_BD_TOVAR Integer, NORMA Decimal(15,4), SEB_ED Decimal(8,4), SEB_SUM Decimal(8,4), NETTO Decimal(15,4), PROCENT_POTER Decimal(5,2), FK_SKLAD_ZAKAZ Integer, FK_OPERATION Integer, TRACK_FLAG Smallint, TRACK_VARIANT Smallint, NAME Varchar(200), CENA_PR Decimal(15,4), CENA_SEB Decimal(15,4), CENA_SEB_ED Decimal(15,4), NORMA_SUM Decimal(15,4), CENA_SEB_SUM Decimal(15,4), CENA_SEB_ED_SUM Decimal(15,4), NETTO_SUM Decimal(15,4), FK_TTK_COMP Integer, OUT_LEVEL Integer ) AS declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min from bd_calc where field_key=:fk_ttk into :norma_ttk; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; norma_sum=0; netto_sum=0; suspend; end fk_ttk_tmp=null; end end end ^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_GET_CALC_TREE TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_CALC_TREE TO PROCEDURE SP_GET_CALC_TREE; GRANT EXECUTE ON PROCEDURE SP_GET_CALC_TREE TO SYSDBA;перекомпиляция17.3.13.1SP_GET_CALC_TREE  p  i d" })_SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_RASH ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer, WITHCNT smallint = 1) returns ( FK_2 integer) as declare variable ID_SKLAD integer; declare variable ID_REC integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable COD_R integer; declare variable D_COD_R integer; declare variable FK_PFIRM_REC integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable CENA decimal(8,2); declare variable FK_BD_TOVAR integer; declare variable CNT decimal(7,3); declare variable REZ integer; declare variable CNT_OTGR decimal(7,3); declare variable FK_O11 integer; declare variable SUM_DOC decimal(8,2); declare variable SUM_OK decimal(8,2); declare variable SUMRAZNES decimal(8,2); declare variable FK_KS1 integer; declare variable CNT_SO decimal(8,3); declare variable FK_SELFUL integer; declare variable MARGIN decimal(3,2); declare variable DISCOUNT decimal(3,2); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable NDS integer; declare variable FK_11_REZERV integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_USER integer; declare variable NAME_IFS type of column BD_2.NAME_IFS; declare variable FK_REZ integer; declare variable FK_SNOOP_DOGG integer; declare variable STOCK_TOVAR decimal(12,3); declare variaCJ!k ^update bd_kodi_realizacii_rash set field_key=id17.3.14.1prof5J k ]update bd_kodi_realizacii_prih set field_key=id17.3.14.1prof4Z   \ALTER TABLE BD_KODI_REALIZACII_RASH ADD FIELD_KEY INTEGER17.3.14.1prof3Z   [ALTER TABLE BD_KODI_REALIZACII_PRIH ADD FIELD_KEY INTEGER17.3.14.1prof2  i YINSERT INTO PROF_FILTER_TYPE (FIELD_KEY, FILTER_TYPE, KEY_NAME, DISPLAY_NAME, FROM_TABLE, JOIN_ON_ZTX, ORDER_BY, FILTER_NAME) VALUES (83, 'bd_kodi_realizacii_prih.name', 'field_key', 'name', 'bd_kodi_realizacii_prih', 'on ztx_selrecs.fkbd=bd_kodi_realizacii_prih.field_key', '1', 'spr'); INSERT INTO PROF_FILTER_TYPE (FIELD_KEY, FILTER_TYPE, KEY_NAME, DISPLAY_NAME, FROM_TABLE, JOIN_ON_ZTX, ORDER_BY, FILTER_NAME) VALUES (84, 'bd_kodi_realizacii_rash.name', 'field_key', 'name', 'bd_kodi_realizacii_rash', 'on ztx_selrecs.fkbd=bd_kodi_realizacii_rash.field_key', '1', 'spr');17.3.14.1BA kodiDble FK_ZAMENA integer; declare variable CNT_ZAMENA decimal(12,3); declare variable KOEF decimal(12,3); declare variable INPLACE_Z decimal(12,3); declare variable NDS_Z decimal(12,3); declare variable CENA_Z decimal(12,3); declare variable DATE_DELIVERY date; BEGIN /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=1; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --заголовок расхода select fk_bd_firm, fk_recipient, cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :id_rec, :cod_r, :FK_PFIRM_REC, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_snoop_dogg, :date_delivery; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_sklad), null, :date_delivery, :id_rec, :fk_face, :cod_r, :d_cod_r, :fk_user, null, 0, null, null, null, :id_sklad, null, 0, :FK_PFIRM_REC, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_snoop_dogg); --перебираем все строки заказа --сначала переводим в расход строки с резервом cnt_so=0; rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 left join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) where fk_bd_out_1=:id_zakaz --and fk_bd_11_rezerv is null into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :rez, :nds, :inplace do BEGIN --ost_rash - ищем, сколько уже отгружено по данной позиции cnt_otgr=0; if (withcnt=1) then select sum(cnt) from BD_22 where bd_22.fk_bd_order_out_11=:fk_o11 into :cnt_otgr; cnt_otgr=coalesce(cnt_otgr,0); ost_rash=ost_rash-cnt_otgr; --проверяем по остаткам если нехватает, проверим замены select sum(stock) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and stock>0 into :stock_tovar; if (coalesce(:stock_tovar,0)<:ost_rash) then begin for select sp.fk_tovar_zamena, sp.cnt_tovar_zamena, sp.koef, t.nds, t.inplace from sp_create_rash_checktov_zamena(:id_zakaz,:fk_o11,:ost_rash-coalesce(:stock_tovar,0)) sp join bd_tovar t on t.field_key=sp.fk_tovar_zamena into :fk_zamena, :cnt_zamena, :koef, :nds_z, :inplace_z do begin cena_z=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_zamena and fk_bd_cena=:fk_cena into :cena_z; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, null , :cena_z, :cena_z/(1+(coalesce(:nds_z,0)/100)), :cnt_zamena, :fk_o11, :fk_zamena, :inplace_z, :nds_z); cnt_so=cnt_so+cnt_zamena; ost_rash=:ost_rash-(:cnt_zamena*:koef); end end --актуализируем цены --только для расходных цен if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (rez is not null) then begin update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; end else begin fk_11_rezerv=null; end --заполняем расход -- 1. Rezerv or position from fk_bd_11 if ((withcnt=0)or(ost_rash>0)) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); cnt_so=cnt_so+ost_rash; ost_rash=0; end rez=null; END if ((withcnt=0)or(cnt_so>0)) THEN BEGIN -- update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz; if (prov_bd_2_flag=1) then begin execute procedure sp_bd2_prov(:fk_2,'RU',coalesce(:tsd_check,0),:fk_user); if ((select count(*) from bd_2_resultprov r where r.fk_bd_2=:fk_2)>0) then begin delete from bd_21 where fk_bd_2=:fk_2; update bd_2 set valid_flag=0 where field_key=:fk_2; end end -- execute procedure sp_22_by_21(:fk_2,0); update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); -- END ELSE delete from BD_2 where field_key=:fk_2; --делаем разнесение --находим сумму расхода select sum(summa) from bd_21 where fk_bd_2=:fk_2 into :sum_doc; for select fk_ks_1, sum(summa) from ks_11 where fk_ks_1 is not null and coalesce(fo_order_out,0)=:ID_ZAKAZ group by fk_ks_1 into :fk_ks1, :sumraznes do BEGIN --находим сколько можем разнести по этой оплате select main.summa-coalesce((select sum(ks_11.summa) from ks_11 where ks_11.fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null and coalesce(ks_11.fk_bd_2,0)<>:fk_2),0) from ks_1 main where main.field_key=:fk_ks1 group by main.summa into :sum_ok; --сравниваем суммы sumraznes=minvalue(sumraznes,sum_ok,sum_doc); if (sumraznes>0) THEN BEGIN --создаем разнесение в этой же оплате по этому же расходу INSERT INTO KS_11 (FIELD_KEY, FK_KS_1, FK_BD_2, SUMMA) VALUES (gen_id(GEN_KS_11_ID,1), :FK_KS1, :FK_2, :sumraznes); sum_doc=sum_doc-sumraznes; END END END^ SET TERM ; ^Дата расхода = дата доставки из заказа17.3.15.1SP_CREATE_RASH_supplier_main into :fk_supplier_main do begin fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_supplier_main), null, :date_delivery, :fk_recipient, :fk_face, :cod_r, :d_cod_r, :fk_user, null, 0, null, null, null, :fk_supplier_main, null, 0, :fk_recipient_pfirm, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_dogovor); cnt_so=0; id_rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz and bd_tovar.fk_supplier_main=:fk_supplier_main into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :id_rez, :nds, :inplace do begin if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (id_rez is not null) then update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; else fk_11_rezerv=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); id_rez=null; end --suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); end update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT,UPDATE ON BD_ORDER_OUT_11 TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT,DELETE ON BD_11_RESERV TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT ON BD_USERS TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT ON BD_ORDER_OUT_1 TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT EXECUTE ON PROCEDURE SP_TRANSLATE TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT ON BD_CENA TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT ON BD_TOVAR TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT ON BD_FIRM TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT,INSERT ON BD_2 TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT ON BD_CPR_NOW TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT INSERT ON BD_22 TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT EXECUTE ON PROCEDURE SP_REFACTOR_RASH_BY_SPEC TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; GRANT SELECT,UPDATE ON BD_ORDER_IN_1 TO PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_CREATE_RASH_TOV_SUPPLIER TO SYSDBA;заявки с распределением по расходам17.3.15.2SP_CREATE_RASH_TOV_SUPPLIER f# oC`SET TERM ^ ; create or alter procedure SP_CREATE_RASH_TOV_SUPPLIER ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer = 0, WITHCNT smallint = 0) as declare variable FK_O11 integer; declare variable FK_USER integer; declare variable ID_SKLAD integer; declare variable FK_RECIPIENT integer; declare variable FK_RECIPIENT_PFIRM integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_SELFUL integer; declare variable MARGIN decimal(12,3); declare variable DISCOUNT decimal(12,3); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_DOGOVOR integer; declare variable DATE_DELIVERY date; declare variable COD_R integer; declare variable NAME_IFS varchar(100); declare variable FK_SUPPLIER_MAIN integer; declare variable D_COD_R integer; declare variable FK_BD_TOVAR integer; declare variable OST_RASH decimal(12,3); declare variable CENA type of column BD_ORDER_OUT_11.CENA_PR_WITH_NDS; declare variable FK_11_REZERV integer; declare variable FK_REZ integer; declare variable ID_REZ integer; declare variable NDS integer; declare variable INPLACE decimal(7,3); declare variable CNT_SO decimal(12,3); declare variable FK_2 integer; begin /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=0; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --для заголовока расхода select fk_bd_firm, fk_recipient, bd_order_out_1.cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, bd_order_out_1.nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :fk_recipient, :cod_r, :fk_recipient_pfirm, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_dogovor, :date_delivery; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); for select bd_tovar.fk_supplier_main from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz group by 1 order by bd_tovar.fkE m$  !'a UPDATE BD_CHILD_DOCS SET DOC_TYPE = 4, NAME = 'Заявка покупателя', PARENT_TYPE = NULL, SQL = 'select a.field_key, ''Заявка покупателя №''||a.NOMER_SHET, a.DATE_ORDER, a.fk_bd_firm, skl.name, a.FK_RECIPIENT, sup.name, coalesce((select sum(BD_ORDER_OUT_11.SUMMA_WITH_NDS) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=a.FIELD_KEY),0), iif((select first 1 field_key from bd_2 where fk_bd_order_out_1=a.field_key) is not null,1,0) as flag, s.field_key from BD_ORDER_OUT_1 a join bd_firm skl on skl.field_key=a.fk_bd_firm join bd_firm sup on sup.field_key=a.FK_RECIPIENT join BD_9_ACT_DOC s on s.fk_bd_doc=a.FIELD_KEY and s.type_doc=4 where s.fk_bd_9_act=:fk_parent', FK_PARENT = 128 WHERE (FIELD_KEY = 150); UPDATE BD_CHILD_DOCS SET DOC_TYPE = 4, NAME = 'Заявка покупателя', PARENT_TYPE = NULL, SQL = 'select a.field_key, ''Заявка покупателя №''||a.NOMER_SHET, a.DATE_ORDER, a.fk_bd_firm, skl.name, a.FK_RECIPIENT, sup.name, coalesce((select sum(BD_ORDER_OUT_11.SUMMA_WITH_NDS) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=a.FIELD_KEY),0), iif((select first 1 field_key from bd_2 where fk_bd_order_out_1=a.field_key) is not null,1,0) as flag, s.field_key from BD_ORDER_OUT_1 a join bd_firm skl on skl.field_key=a.fk_bd_firm join bd_firm sup on sup.field_key=a.FK_RECIPIENT join BD_MACROS_J_DOC s on s.fk_bd_doc=a.FIELD_KEY and s.type_doc=4 where s.fk_BD_MACROS_J=:fk_parent', FK_PARENT = 171 WHERE (FIELD_KEY = 173); UPDATE BD_CHILD_DOCS SET DOC_TYPE = 4, NAME = 'Заявка покупателя', PARENT_TYPE = NULL, SQL = 'select a.field_key, ''Заявка покупателя №''||a.NOMER_SHET, a.DATE_ORDER, a.fk_bd_firm, skl.name, a.FK_RECIPIENT, sup.name, coalesce((select sum(BD_ORDER_OUT_11.SUMMA_WITH_NDS) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=a.FIELD_KEY),0), iif((select first 1 field_key from bd_2 where fk_bd_order_out_1=:fk_parent) is not null,1,0) as flag from BD_ORDER_OUT_1 a join bd_firm skl on skl.field_key=a.fk_bd_firm join bd_firm sup on sup.field_key=a.FK_RECIPIENT where a.field_key=:fk_parent', FK_PARENT = NULL WHERE (FIELD_KEY = 104); UPDATE BD_CHILD_DOCS SET DOC_TYPE = 4, NAME = 'Заявка покупателя', PARENT_TYPE = 3, SQL = 'select a.field_key, ''Заявка покупателя №''||a.NOMER_SHET, a.DATE_ORDER, a.fk_bd_firm, skl.name, a.FK_RECIPIENT, sup.name, coalesce((select sum(BD_ORDER_OUT_11.SUMMA_WITH_NDS) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=a.FIELD_KEY),0), iif((select first 1 field_key from bd_2 where fk_bd_order_out_1=a.field_key) is not null,1,0) as flag, null from BD_ORDER_OUT_1 a join bd_firm skl on skl.field_key=a.fk_bd_firm join bd_firm sup on sup.field_key=a.FK_RECIPIENT where a.fk_bd_order_in_1=:fk_parent', FK_PARENT = 7 WHERE (FIELD_KEY = 8);изменение запросов по Заявка покупателя17.3.15.3BD_CHILD_DOCSer into :fk_user; --для заголовока расхода select fk_bd_firm, fk_recipient, bd_order_out_1.cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, bd_order_out_1.nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :fk_recipient, :cod_r, :fk_recipient_pfirm, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_dogovor, :date_delivery; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); for select bd_tovar.fk_supplier_main from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz group by 1 order by bd_tovar.fk_supplier_main into :fk_supplier_main do begin fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_supplier_main), null, :date_delivery, :fk_recipient, :fk_face, :cod_r, :d_cod_r, :fk_user, null, 0, null, null, null, :fk_supplier_main, null, 0, :fk_recipient_pfirm, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_dogovor); cnt_so=0; id_rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz and bd_tovar.fk_supplier_main=:fk_supplier_main into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :id_rez, :nds, :inplace do begin if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (id_rez is not null) then update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; else fk_11_rezerv=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); id_rez=null; end --suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); end update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; end^ SET TERM ; ^DATE_DELIVERY тип данных integer в date17.3.15.3SP_CREATE_RASH_TOV_SUPPLIER 6# * M'gALTER TABLE BD_21 ADD START_CNT DECIMAL(7,3); ALTER TABLE BD_22 ADD START_CNT DECIMAL(7,3);ADD START_CNT17.3.19.1BD_21) ##1fSET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_check_flag for bd_1 active before update position 0 AS BEGIN if ((old.VALID_FLAG=1)and(new.VALID_FLAG=0)and(old.CHECK_FLAG=1)) then new.CHECK_FLAG=0; --сброс при распроведении if (old.CHECK_FLAG is distinct from new.CHECK_FLAG) then begin new.CHECK_LOGIN=current_user; new.CHECK_TS=current_timestamp; end if (new.check_flag=0) then begin new.CHECK_LOGIN=null; new.CHECK_TS=null; end END^ SET TERM ; ^снимать вериф. при распроведении прихода17.3.16.1tr_bd_1_check_flag2( #1eSET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER TR_BD_2_CHECK_FLAG FOR BD_2 ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN if ((old.VALID_FLAG=1)and(new.VALID_FLAG=0)and(old.CHECK_FLAG=1)) then new.CHECK_FLAG=0; --сброс при распроведении if (old.CHECK_FLAG is distinct from new.CHECK_FLAG) then begin new.CHECK_LOGIN=current_user; new.CHECK_TS=current_timestamp; end if (new.check_flag=0) then begin new.CHECK_LOGIN=null; new.CHECK_TS=null; end END ^ SET TERM ; ^снимать вериф. при распроведении расхода17.3.16.1TR_BD_2_CHECK_FLAG[' M/3dALTER TABLE BD_EGAIS_FORMB_REGS ADD XML_FA BLOB SUB_TYPE 1 SEGMENT SIZE 4096; ALTER TABLE BD_EGAIS_FORMB_REGS ADD XML_FB BLOB SUB_TYPE 1 SEGMENT SIZE 4096;ADD XML_FA XML_FB17.3.16.1BD_EGAIS_FORMB_REGS{& 73cALTER TABLE BD_EGAIS_FORMB_REGS ADD AREG_BOTTLINGDATE DATE;ADD AREG_BOTTLINGDATE17.3.16.1BD_EGAIS_FORMB_REGS>% CoCbSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_RASH_TOV_SUPPLIER ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer = 0, WITHCNT smallint = 0) as declare variable FK_O11 integer; declare variable FK_USER integer; declare variable ID_SKLAD integer; declare variable FK_RECIPIENT integer; declare variable FK_RECIPIENT_PFIRM integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_SELFUL integer; declare variable MARGIN decimal(12,3); declare variable DISCOUNT decimal(12,3); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_DOGOVOR integer; declare variable DATE_DELIVERY date; declare variable COD_R integer; declare variable NAME_IFS varchar(100); declare variable FK_SUPPLIER_MAIN integer; declare variable D_COD_R integer; declare variable FK_BD_TOVAR integer; declare variable OST_RASH decimal(12,3); declare variable CENA type of column BD_ORDER_OUT_11.CENA_PR_WITH_NDS; declare variable FK_11_REZERV integer; declare variable FK_REZ integer; declare variable ID_REZ integer; declare variable NDS integer; declare variable INPLACE decimal(7,3); declare variable CNT_SO decimal(12,3); declare variable FK_2 integer; begin /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=0; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_usH  -N- a+jSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; dK4, #)iSET TERM ^ ; create or alter procedure SP_SET_CENA155 ( FK_1 integer) as declare variable FK_CENA integer; declare variable FK_TOV integer; declare variable CENA_PR type of column BD_11.CENA_PR_WITH_NDS; declare variable CENA_115 type of column BD_115.CENA_WITH_NDS; declare variable FK_11 integer; begin select bd_firm.fk_bd_cena_basic from bd_firm where field_key=(select fk_bd_firm from bd_1 where field_key=:fk_1) into :fk_cena; if (fk_cena is null) then exit; for select field_key, fk_bd_tovar, cena_pr_with_nds from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_tov, :cena_pr do begin select cena from bd_cpr_now where fk_bd_tovar=:fk_tov and fk_bd_cena=:fk_cena into :cena_115; update or insert into bd_115 (FK_BD_11, FK_BD_CENA, CENA_WITH_NDS) values (:fk_11,:fk_cena,:cena_115) matching (FK_BD_11, FK_BD_CENA); if (coalesce(cena_pr,0)>0) then update bd_11 set margin115=(:cena_115/:cena_pr-1)*100 where field_key=:fk_11; end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_FIRM TO PROCEDURE SP_SET_CENA155; GRANT SELECT ON BD_1 TO PROCEDURE SP_SET_CENA155; GRANT SELECT,UPDATE ON BD_11 TO PROCEDURE SP_SET_CENA155; GRANT SELECT ON BD_CPR_NOW TO PROCEDURE SP_SET_CENA155; GRANT SELECT,INSERT,UPDATE ON BD_115 TO PROCEDURE SP_SET_CENA155; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_SET_CENA155 TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_SET_CENA155 TO SYSDBA;процедура установки цены115 у прихода17.3.19.1SP_SET_CENA155+ U1hSET TERM ^ ; CREATE OR ALTER trigger bd_2_set_start_cnt for bd_2 active before insert or update position 0 AS begin if ((inserting)and(new.valid_flag=1)) then begin update bd_21 set start_cnt=cnt where fk_bd_2=new.field_key and start_cnt is null; update bd_22 set start_cnt=cnt where fk_bd_2=new.field_key and start_cnt is null; end if ((updating)and(coalesce(old.valid_flag,0)=0)and(new.valid_flag=1)) then begin update bd_21 set start_cnt=cnt where fk_bd_2=new.field_key and start_cnt is null; update bd_22 set start_cnt=cnt where fk_bd_2=new.field_key and start_cnt is null; end end^ SET TERM ; ^Проставлять Кол-во изначальное при проведении расхода17.3.19.1bd_2_set_start_cntLeclare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:iMd_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rashN*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^При создании прихода при производстве проставлять цену 11517.3.19.1SP_CREATE_BY_PRPvariant,0); end else track_variant=0;*/ summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fQk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then select track_variant from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant; else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^При создании прихода при производстве проставлять цену 11517.3.19.1SP_CREATE_BY_PR_TTKRAZBOR . aa?kSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья /*if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_variant from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_O :0 +;1mSET TERM ^ ; CREATE OR ALTER trigger bd_2_set_start_cnt for bd_2 active before insert or update position 0 AS declare variable fk_tovar integer; declare variable cnt decimal(7,3); begin if ((inserting)and(new.valid_flag=1)) then begin for select fk_bd_tovar, coalesce(start_cnt,cnt) from bd_22 where fk_bd_2=new.field_key into :fk_tovar, :cnt do if (exists(select field_key from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)) then update bd_22 set start_cnt=(select cnt_23 from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar) where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; else begin insert into bd_23 (fk_bd_2, fk_bd_tovar, cnt_23) values (new.field_key, :fk_tovar, (select cnt from bd_22 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)); update bd_22 set start_cnt=cnt where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; end end if ((updating)and(coalesce(old.valid_flag,0)=0)and(new.valid_flag=1)) then begin for select fk_bd_tovar, coalesce(start_cnt,cnt) from bd_22 where fk_bd_2=new.field_key into :fk_tovar, :cnt do if (exists(select field_key from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)) then update bd_22 set start_cnt=(select cnt_23 from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar) where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; else begin insert into bd_23 (fk_bd_2, fk_bd_tovar, cnt_23) values (new.field_key, :fk_tovar, (select cnt from bd_22 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)); update bd_22 set start_cnt=cnt where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; end end end^ SET TERM ; ^запись и восстановление первоначального кол-ва17.3.22.1bd_2_set_start_cntB/ uqlCREATE GENERATOR GEN_BD_23_ID; CREATE TABLE BD_23 ( FIELD_KEY INTEGER NOT NULL, FK_BD_2 INTEGER, FK_BD_TOVAR INTEGER, CNT_23 DECIMAL(7,3) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_23 ADD CONSTRAINT PK_BD_23 PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_23_IDX1 ON BD_23 (FK_BD_2); CREATE INDEX BD_23_IDX2 ON BD_23 (FK_BD_TOVAR); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_23_BI */ CREATE OR ALTER TRIGGER BD_23_BI FOR BD_23 ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_23_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_23 TO PUBLIC;для хран. первоначал. кол-ва17.3.22.1BD_23  m 5 CsmrUPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Редактирование цен в заявке', 'zakpol_edit_price', (select first 1 field_key from BD_USERS_RIGHTS_NAME where upper(name_var)=upper('zakazrecipient'))) MATCHING (NAME_VAR);Редактирование цен в заявке17.3.25.1BD_USERS_RIGHTS_NAME add right zakpol_edit_priceX4 k 1qSET TERM ^ ; CREATE OR ALTER trigger bd_2_set_start_cnt for bd_2 active before insert or update position 0 AS declare variable fk_tovar integer; declare variable cnt decimal(7,3); begin if ((inserting)and(new.valid_flag=1)) then begin for select fk_bd_tovar, coalesce(start_cnt,cnt) from bd_22 where fk_bd_2=new.field_key into :fk_tovar, :cnt do if (exists(select field_key from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)) then update bd_22 set start_cnt=(select first 1 cnt_23 from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar) where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; else begin insert into bd_23 (fk_bd_2, fk_bd_tovar, cnt_23) values (new.field_key, :fk_tovar, (select first 1 cnt from bd_22 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)); update bd_22 set start_cnt=cnt where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; end end if ((updating)and(coalesce(old.valid_flag,0)=0)and(new.valid_flag=1)) then begin for select fk_bd_tovar, coalesce(start_cnt,cnt) from bd_22 where fk_bd_2=new.field_key into :fk_tovar, :cnt do if (exists(select field_key from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)) then update bd_22 set start_cnt=(select first 1 cnt_23 from bd_23 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar) where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; else begin insert into bd_23 (fk_bd_2, fk_bd_tovar, cnt_23) values (new.field_key, :fk_tovar, (select first 1 cnt from bd_22 where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar)); update bd_22 set start_cnt=cnt where fk_bd_2=new.field_key and fk_bd_tovar=:fk_tovar; end end end^ SET TERM ; ^17.3.22.2bd_2_set_start_cntb3a)5pALTER TABLE BD_PR ADD FK_BD_CENA INTEGER;ADD FK_BD_CENA17.3.22.1BD_PR ADD FK_BD_CENAf2e)9oALTER TABLE BD_CALC ADD FK_BD_CENA INTEGER;ADD FK_BD_CENA17.3.22.1BD_CALC ADD FK_BD_CENA&1 AgnSET TERM ^ ; CREATE OR ALTER trigger bd_2_ad2 for bd_2 active after delete position 2 AS declare variable fk1_6 integer; declare variable fkuser integer; declare variable price_nds integer; declare variable skl integer; declare variable allcnt decimal(7,3); begin delete from bd_21 where fk_bd_2=old.FIELD_KEY; delete from bd_23 where fk_bd_2=old.FIELD_KEY; if (/*(old.cod_rash=6) and*/ (old.fk_bd_1_6 is not null)) then BEGIN --select sklad, prih_nds_flag from bd_firm where field_key=old.fk_recipient into :skl, :price_nds; -- if (skl=1) then begin select sum(bd_11.cnt-bd_11.stock) from bd_11 where bd_11.fk_bd_1=old.fk_bd_1_6 into :allcnt; if (coalesce(allcnt,0)=0) then begin delete from bd_1 where bd_1.field_key=old.fk_bd_1_6; end else exception e_err_del_1_6; -- end end end^ SET TERM ; ^delete from bd_23 where fk_bd_2=old.FIELD_KEY17.3.22.1bd_2_ad2здних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2 from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2 do begin if ((stock>0)and(cnt_21<=stock)) then begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2 from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2 do begin if ((stock>0)and(cnt_21<=stock)) then begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^вернули автокомпенсацию для приходов с производства17.3.25.1TR_BD_1_CHECK_7  4"7   %uSET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE2 ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_prih, --поступления всего кроме возвратов sum(case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_cr, --от производителя sum(case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_from_sup, --от оптовиков --прочие поступления sum(case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM))and (not((select cod_prih from bd_11 b11 where field_key=bd_11.fk_bd_11_6_main) in (7,9,1,8))) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_1_6, --перемещения кроме своего склада sum(case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRW@6 }O+sSET TERM ^ ; ALTER TRIGGER TR_BD_1_CHECK_7 ACTIVE AFTER UPDATE POSITION 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; declare variable track11_7 type of column bd_11.track_11; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на остатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, bd_11.stock, bd_11.cena_pr_with_nds from bd_11 left join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_11.fk_bd_1=new.field_key and bd_11.stock>0 -- and ((bd_11.cod_prih<>8)or(exists(select field_key from bd_pr_product_track where fk_pr=bd_pr.field_key))) into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поUM)or(bd_1.FK_SUPPLIER=1)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6 FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :todate and bd_1.valid_flag=1 and skl.field_key<>sup.field_key --кроме излишков and (not(bd_1.cod_prih in (7,9,1,8))) --излишки и бонусы и товарообмен, приходы с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM UNION SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10) as cnt_all_rash, --весь расход SUM(CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(case when (bd_2.cod_rash=4) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)and bd_2.cod_rash=5) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_2_6 --перемещения FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and sup.ALC_DECLARE_SKL_FLAG=1)) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and rec.ALC_DECLARE_SKL_FLAG=1)) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate and (not(bd_1.cod_prih in (7,9,1,8))) --излишки и бонусы и товарообмен, приходы с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM) as p group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6 do begin suspend; end END^ SET TERM ; ^17.3.30.1SP_ALC_MOVE2Y fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc, number_correct desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (7,9,1,8)) --излишки, бонусы, товарообмен, приход с пр-ва group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6 from sp_alc_move2(:fromdate,:todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6 do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and ((fk_creator=:FK_CREATOR)or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; if ((cnt_end<0)and(CNT_RASH_rozn>0)) then --если итог<0 корректируем остаток на конец за счет розничных продаж begin if (abs(cnt_end)>CNT_RASH_rozn) then CNT_RASH_rozn=0; else CNT_RASH_rozn=CNT_RASH_rozn+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if ((cnt_end<0)and(CNT_RASH_any>0)) then --если после коррекции розничных продаж итог<0 корректируем остаток на конец за счет прочих расходов begin if (abs(cnt_end)>CNT_RASH_any) then CNT_RASH_any=0; else CNT_RASH_any=CNT_RASH_any+cnt_end; CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end end else begin ---считаем приблизительные расходы - решено не использовать CNT_PRIH_6=0; CNT_RASH_6=0; --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; -- if ((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)>0.1*CNT_PRIH_VSEGO) then CNT_RASH_rozn=((CNT_PRIH_VSEGO-CNT_RASH_VSEGO)-0.1*CNT_PRIH_VSEGO); CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_ANY+CNT_RASH_5+CNT_RASH_6; cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO>0)or(CNT_PRIH_VSEGO>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end -- execute procedure sp_alc_correct_6(:FK_DECLARE); END^ SET TERM ; ^17.3.30.1SP_CREATE_NEW_ALC SS8 u /vSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4), HIDE_IZLISH smallint = 1) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', :hide_izlish); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce (BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firm sup on sup.field_key=bd_1.FK_SUPPLIER and sup.DECLAR_FLAG=1 and coalesce(sup.sklad,0)=0 where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (7,9,1,8)) --излишки, бонусы, товарообмен, приход с пр-ва group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT,X ~}eN< ik?zSET TERM ^ ; ALTER PROCEDURE SP_AVTOPR ( FK_BD_TOVAR Integer, FK_BD_TTK_AVTOPR Integer, CNT_OST Decimal(15,3), CNT_22 Decimal(15,3), FK_BD_FIRM Integer, FK_USER Integer, LANG Varchar(2), FK_BD_2 Integer, DATE_RASH Date, SUMMA_OST Decimal(18,2), CENA_WITH_NDS Decimal(8,2) ) RETURNS ( FK_BD_11 Integer, CNT_11 Decimal(15,3), MAN_FLAG Integer, SUMMA_MAN Decimal(15,2) ) AS declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; dec^;  ;AySET TERM ^ ; ALTER TRIGGER TR_BD_2_DOLG ACTIVE BEFORE UPDATE OR DELETE POSITION 5 AS declare variable fk_1 integer; declare variable summa_1 decimal(15,2); declare variable fk_21 integer; declare variable summa_21 decimal(15,2); declare variable dolg_doc decimal(15,2); declare variable summa_bufer decimal(15,2); declare variable fk_ks11 integer; declare variable fk_ks1 integer; declare variable fk_ks_kodi_predoplata varchar(3); BEGIN if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin --проведение расхода new.SUMMA=abs(coalesce((select sum(cast(summa as decimal(15,3))) from bd_22 where fk_bd_2=new.FIELD_KEY),0)); if (not(new.COD_RASH in (1,4,6,9))) then --обычный расход - увеличиваем сумму долга по расходу --(5,7)? begin if (new.COD_RASH in (5,7)) then new.DOLGFROMDATE=new.DATE_RASH; else new.DOLGFROMDATE=new.DATE_RASH+coalesce(new.DAY_CONS_RASH,0); if (new.FK_BD_1_6 is null) then begin new.SUMMA_DOLG=new.SUMMA_DOLG+new.SUMMA; end else begin --это перемещение, тогда просто берем долг из прихода new.SUMMA_DOLG=coalesce((select summa_dolg from bd_1 where field_key=new.FK_BD_1_6),0); end --реализация: увеличиваем долг по приходам, у которых код=3, надо вытащить внутренние перемещения, --[18.09.2015] реализация приравнена к консигнации, товарообмен не трогаем if (new.COD_RASH<>6) then --кроме расходов по внутреннему перемещению, при их проведении долг на приход не начисляем begin /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_11.CENA_PR_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=3 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg+:summa_1 where fk_bd_1_6=:fk_1; end for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_21.CENA_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=1 \}: # AxINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('fk_ks_kodi_predoplata', '0', 'Код оплаты Предоплата');Настройка кода предоплата у оплаты17.3.31.1INSERT INTO GLOBAL_OPTIONS9wAAwALTER TABLE BD_ORDER_OUT_11 ADD PRIM11 VARCHAR(200);BD_ORDER_OUT_11 ADD PRIM1117.3.30.1BD_ORDER_OUT_11 ADD PRIM11] group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg+:summa_1 where fk_bd_1_6=:fk_1; end $$IBEC$$*/ end end else --для расходов с кодами: товарообмен, списание, внутр., пр-во begin new.SUMMA_DOLG=0; -- возврат поставщику - уменьшаем сумму долга по приходам --[18.09.2015] уже не уменьшаем /*$$IBEC$$ new.DOLGFROMDATE=null; new.summa=0; --ищем приходы от того же поставщика, которому делаем возврат, минуя все внутренние перемещения for select fk_bd_1, coalesce(sum(bd_21.summa),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier=new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 group by 1 into :fk_1, :summa_1 do update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin new.SUMMA_DOLG=coalesce(new.SUMMA_dolg,0)+coalesce(summa_21,0); new.DOLGFROMDATE=new.DATE_RASH+coalesce(new.DAY_CONS_RASH,0); update bd_21 set invalid_vozvrat_flag=1 where field_key=:fk_21; end $$IBEC$$*/ end --после проведения пытаемся разнести расход по существующим оплатам, если по нему есть долг --ОТМЕНЕНО! 27.08.2015 --вернули 31.03.17 для кода расхода Предоплата fk_ks_kodi_predoplata=(select paramvalue from GLOBAL_OPTIONS where trim(paramname)='fk_ks_kodi_predoplata'); if ((new.SUMMA_DOLG>0)and(new.COD_RASH=8)) then begin --если расход уже частично разнесен, пытаемся разнести по той же оплате dolg_doc=new.SUMMA_DOLG; for select ks_11.FIELD_KEY, ks_1.SUMMA_DOLG from ks_11 join ks_1 on ks_1.FIELD_KEY=ks_11.FK_KS_1 where ks_11.FK_BD_2=new.FIELD_KEY and ks_1.SUMMA_DOLG>0 and ks_1.FK_KS_KODI=iif(:fk_ks_kodi_predoplata='',null,:fk_ks_kodi_predoplata) order by date_create, field_key into :fk_ks11, :summa_bufer do begin if (summa_bufer>dolg_doc) then summa_bufer=dolg_doc; dolg_doc=dolg_doc-summa_bufer; update ks_11 set summa=summa+:summa_bufer where field_key=:fk_ks11; new.SUMMA_DOLG=new.SUMMA_DOLG-summa_bufer; end end --после этого разносим по другим оплатам, если остался долг if ((new.SUMMA_DOLG>0)and(new.COD_RASH=8)) then begin -- if (new.fk_selful2 is null) then ? зачем это условие? dolg_doc=new.SUMMA_DOLG; for select ks_1.FIELD_KEY, ks_1.SUMMA_DOLG from ks_1 where ks_1.SUMMA_DOLG>0 and --определяемся с типом оплаты ks_1.FK_KS_KODI=iif(:fk_ks_kodi_predoplata='',null,:fk_ks_kodi_predoplata) and ( --обычный расход (/*coalesce(new.COD_RASH,0)<>7 and*/ (new.FK_SELFUL2 is null) and ks_1.FK_SELFUL=new.FK_SELFUL and ks_1.FK_BD_FIRM=new.FK_RECIPIENT and ks_1.PRIH=1) -- or --возврат от получателя -- (coalesce(new.COD_RASH,0)=7 and (new.FK_SELFUL2 is null) and ks_1.FK_SELFUL=new.FK_SELFUL and ks_1.FK_BD_FIRM=new.FK_RECIPIENT and ks_1.prih=0) or --расход на свое юр.лицо (/*coalesce(new.COD_RASH,0)<>7 and*/ (new.FK_SELFUL2 is not null) and ks_1.FK_SELFUL=new.FK_SELFUL2 and ks_1.FK_SELFUL2=new.FK_SELFUL and ks_1.PRIH=2) ) order by date_create, field_key into :fk_ks1, :summa_bufer do begin if (summa_bufer>dolg_doc) then summa_bufer=dolg_doc; dolg_doc=dolg_doc-summa_bufer; if (summa_bufer>0) then INSERT INTO KS_11 (FK_KS_1, FK_BD_2, SUMMA, IS_ZV, TS_CREATE) VALUES (:fk_ks1,new.FIELD_KEY, :summa_bufer, 0, current_timestamp); new.SUMMA_DOLG=new.SUMMA_DOLG-summa_bufer; end end end --проведения расхода --РАСПРОВЕДЕНИЕ РАСХОДА if (((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0))) then begin new.SUMMA_DOLG=0; --[06.11.15] if (not(new.COD_RASH in (9,1))) then --обычный расход - уменьшаем сумму долга по расходу --(5,7)? begin if (new.FK_BD_1_6 is null) then new.SUMMA_DOLG=0; --new.SUMMA_DOLG-coalesce((select sum(summa) from bd_22 where fk_bd_2=new.FIELD_KEY),0); [06.11.15] else new.SUMMA_DOLG=0; --coalesce((select summa_dolg from bd_1 where field_key=new.FK_BD_1_6),0); [06.11.15] new.SUMMA=0; if (new.COD_RASH<>6) then --кроме расходов по внутреннему перемещению, при их проведении долг на приход не начисляем begin --[18.09.2015] убрано /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.CNT*bd_11.CENA_PR_WITH_NDS),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=3 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg-:summa_1 where fk_bd_1_6=:fk_1; end for select fk_bd_1, coalesce(sum(bd_21.SUMMA),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6(bd_21.field_key)) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.cod_prih=1 group by 1 into :fk_1, :summa_1 do begin update bd_1 set summa_dolg=summa_dolg-:summa_1 where field_key=:fk_1; update bd_2 set summa_dolg=summa_dolg-:summa_1 where fk_bd_1_6=:fk_1; end $$IBEC$$*/ end end else begin -- возврат поставщику - увеличиваем сумму долга по приходам --[18.09.2015] уже не меняем --ищем приходы от того же поставщика, которому делаем возврат, минуя все внутренние перемещения /*$$IBEC$$ for select fk_bd_1, coalesce(sum(bd_21.summa),0) from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier=new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 group by 1 into :fk_1, :summa_1 do update bd_1 set summa_dolg=summa_dolg+:summa_1 where field_key=:fk_1; for select bd_21.FIELD_KEY, bd_21.summa from bd_21 join bd_11 on bd_11.field_key=(select fk_bd_11 from sp_get_parent_fk11_not6_(bd_21.field_key) where fk_supplier<>new.FK_RECIPIENT) where bd_21.fk_bd_2=new.FIELD_KEY and bd_11.COD_PRIH<>3 into :fk_21, :summa_21 do begin new.SUMMA_DOLG=coalesce(new.SUMMA_dolg,0)-coalesce(summa_21,0); end $$IBEC$$*/ end end END^ SET TERM ; ^Добавлено разнесение по оплатам для предоплаты17.3.31.1ALTER TRIGGER TR_BD_2_DOLG_lare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; declare variable USE_ROUND_NORMA integer; declare variable is_sbor integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min, coalesce(bd_calc.use_round_norma_min,0), coalesce(IS_SBOR,0) from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check, :use_round_norma, :is_sbor ; if (is_sbor=0) then exit; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1`) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END ^ SET TERM ; ^Авпроизводство, исправлен косяк с производимым количеством17.4.8.1ALTER PROCEDURE SP_AVTOPRb0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести авcтопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_ddate; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt k'7|SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_g= EC{SET TERM ^ ; ALTER PROCEDURE SP_BD2_PROV ( FK_BD2 Integer, LANG Varchar(2), CREATE_7 Integer, FK_USER Integer, IGNORE_NO_IZLISH_FLAG Integer DEFAULT 0 ) AS declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; /* coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) */ declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, aLAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; BEGIN ins=0; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^prim11 return17.4.8.1SP_GET_SPR_FOR_ZAKPOLена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.0000)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.0000) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^prim11 return17.4.8.1SP_GET_CURRSTATE_FOR_ZAKPOL Z? E'C}SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME type of column BD_TOVAR.NAME, CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME type of column BD_TOVAR.FULLNAME, INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и hidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.0000)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.0000) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN prim11=null; cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^исправлено взятие комментария из заказа17.4.13.1SP_GET_CURRSTATE_FOR_ZAKPOL vA  !7SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.Ol+@ i!C~SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME type of column BD_TOVAR.NAME, CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME type of column BD_TOVAR.FULLNAME, INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskjLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; BEGIN ins=0; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^исправлено взятие комментария из заказа17.4.13.1SP_GET_SPR_FOR_ZAKPOL B K-SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer) as declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; suspend; end fk_ttk_tmp=null; end end end^ SET TERM ; ^зацикленость ттк17.4.18.1SP_GET_CALC_TREEрасхода select fk_bd_firm, fk_recipient, bd_order_out_1.cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, bd_order_out_1.nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :fk_recipient, :cod_r, :fk_recipient_pfirm, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_dogovor, :date_delivery; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); for select bd_tovar.fk_supplier_main from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz group by 1 order by bd_tovar.fk_supplier_main into :fk_supplier_main do begin fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_supplier_main), :date_delivery, current_date, :fk_recipient, :fk_face, :cod_r, :d_cod_r, :fk_user, null, 0, null, null, null, :fk_supplier_main, null, 0, :fk_recipient_pfirm, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_dogovor); cnt_so=0; id_rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz and bd_tovar.fk_supplier_main=:fk_supplier_main into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :id_rez, :nds, :inplace do begin if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (id_rez is not null) then update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; else fk_11_rezerv=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); id_rez=null; end --suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); end update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; end^ SET TERM ; ^дата расходной накладной - дата доставки из заявки17.4.18.1SP_CREATE_RASH_TOV_SUPPLIER ;E +/ALTER TABLE BD_CALC_COMPONENT ADD PROCENT_SEB DECIMAL(7,3) DEFAULT 0 ;ADD PROCENT_SEB17.4.19.1BD_CALC_COMPONENTCD Yupdate or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('kassa_stock_with_checks', 0, 'Учитывать не переведенные в расход чеки при расчете остатков на кассе') matching (PARAMNAME);'Учитывать не переведенные в расход чеки при расчете остатков на кассе17.4.18.1GLOBAL_OPTIONS kassa_stock_with_checksrC SECSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_RASH_TOV_SUPPLIER ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer = 0, WITHCNT smallint = 0) as declare variable FK_O11 integer; declare variable FK_USER integer; declare variable ID_SKLAD integer; declare variable FK_RECIPIENT integer; declare variable FK_RECIPIENT_PFIRM integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_SELFUL integer; declare variable MARGIN decimal(12,3); declare variable DISCOUNT decimal(12,3); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_DOGOVOR integer; declare variable DATE_DELIVERY date; declare variable COD_R integer; declare variable NAME_IFS varchar(100); declare variable FK_SUPPLIER_MAIN integer; declare variable D_COD_R integer; declare variable FK_BD_TOVAR integer; declare variable OST_RASH decimal(12,3); declare variable CENA type of column BD_ORDER_OUT_11.CENA_PR_WITH_NDS; declare variable FK_11_REZERV integer; declare variable FK_REZ integer; declare variable ID_REZ integer; declare variable NDS integer; declare variable INPLACE decimal(7,3); declare variable CNT_SO decimal(12,3); declare variable FK_2 integer; begin /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=0; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --для заголовока n }F 5 1CREATE OR ALTER procedure O_OBOROTKA1 ( DATE_START date, DATE_END date, FK_SKLAD_POINTER blob sub_type 0 segment size 200, FK_GRT integer) returns ( FK_TOVAR integer, NAME_TOVAR varchar(50), EDIZM varchar(4), CNT_STOCK_1 decimal(15,3), SUM_STOCK_1 decimal(15,2), CNT_PRIH decimal(15,3), SUM_PRIH decimal(15,2), CNT_RASH decimal(15,3), SUM_RASH decimal(15,2), CNT_STOCK_2 decimal(15,3), SUM_STOCK_2 decimal(15,2)) as declare variable LB integer; declare variable RB integer; begin -- цикл РїРѕ всем РЅРµ архивным товарам РёР· выбранной РіСЂСѓРїРїС‹ select lb,rb from bd_grt_tovar where field_key=:fk_grt into :lb,:rb; for select field_key,name,ed_izm_name from bd_tovar where ( bd_tovar.grp_lb >= :lb) AND (bd_tovar.grp_rb <= :rb) into :fk_tovar,:name_tovar, :edizm do begin cnt_stock_1=0; sum_stock_1=0; cnt_prih=0; sum_prih=0; cnt_rash=0; sum_rash=0; cnt_stock_2=0; sum_stock_2=0; -- :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' это фильтр РїРѕ складу. -- находим остатки 1 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<:date_start and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_1, :sum_stock_1; if (cnt_stock_1=0) then sum_stock_1=0; -- находим РїСЂРёС…РѕРґ select sum(bd_11.cnt),sum(bd_11.summa_with_nds) from bd_11 join bd_firm on (bd_11.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end into :cnt_prih,:sum_prih; -- находим расход select sum(bd_21.cnt),sum(bd_21.summa) from bd_21 join bd_firm on (bd_21.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_21.fk_bd_tovar=:fk_tovar and bd_21.date_rash between :date_start and :date_end into :cnt_rash,:sum_rash; -- находим остатки 2 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<(:date_end+1) and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_2, :sum_stock_2; if (cnt_stock_2=0) then sum_stock_2=0; if ((cnt_stock_1<>0) or (sum_stock_1<>0) or (cnt_prih<>0) or (sum_prih<>0) or (cnt_rash<>0) or (sum_rash<>0) or (cnt_stock_2<>0) or (sum_stock_2<>0)) then suspend; end end17.4.19.1oborotka po tovaru  w H I 7SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); BEGIN ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_srG %?SET TERM ^ ; CREATE OR ALTER trigger tr_bd_2_date_nakl for bd_2 active before insert or update position 4 AS BEGIN /* if (not(old.DATE_RASH is distinct from new.DATE_RASH) --дата расхода изменилась and(old.DATE_rash is distinct from new.DATE_NAKL ) --дата накладной равна старой дате расхода and(old.DATE_NAKL is distinct from new.DATE_NAKL)) then --дата накладной не менялась new.DATE_NAKL=new.DATE_RASH; --тогда выравниваем дату накладной по дате расхода */ if ((inserting and (new.date_nakl is null))or((new.DATE_NAKL=old.DATE_NAKL)and(new.DATE_rash is distinct from old.DATE_RASH)and(new.date_nakl is null))) then new.DATE_NAKL=new.DATE_RASH; if ( (inserting) or (new.nomer_NAKL is null) ) then begin new.nomer_nakl=(select n_rash_nakl+1 from bd_selful where bd_selful.field_key=new.fk_selful); if (new.nomer_NAKL is null) then new.nomer_NAKL=new.nomer_RASH; update bd_selful set n_rash_nakl=n_rash_nakl+1 where field_key=new.fk_selful and n_rash_nakl is not null; end END^ SET TERM ; ^триггер мешал поставить дату накладной отличной от даты расхода при вставке17.4.19.1trigger tr_bd_2_date_naklpr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(cena_nds,0)*(1+margin/100.0000)*(1-discount/100.0000); cena_not_nds=coalesce(cena_not_nds,0)*(1+margin/100.0000)*(1-discount/100.0000); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=:cena_nds*(1+margin/100.0000)*(1-discount/100.0000); cena_not_nds=:cena_not_nds*(1+margin/100.0000)*(1-discount/100.0000); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=:cena_nds*(1+margin/100.0000)*(1-discount/100.0000); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^17.4.20.1SP_GET_SPR_FOR_ZAKPOL00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.0000) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN prim11=null; cnt=0; cena_nds=coalesce(cena_nds,0)*(1+margin/100.0000)*(1-discount/100.0000); cena_not_nds=coalesce(cena_not_nds,0)*(1+margin/100.0000)*(1-discount/100.0000); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN cena_nds=:cena_nds*(1+margin/100.0000)*(1-discount/100.0000); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^17.4.20.1SP_GET_CURRSTATE_FOR_ZAKPOL 0I   CSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME type of column BD_TOVAR.NAME, CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME type of column BD_TOVAR.FULLNAME, INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00sD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN prim11=null; cnt=0; select roundedcena from round_rcena(null, coalesce(:cena_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_nds; select roundedcena from round_rcena(null, coalesce(:cena_not_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select roundedcena from round_rcena(null, coalesce(:cena_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^17.4.21.1SP_GET_CURRSTATE_FOR_ZAKPOL bb/K  7SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); BEGIN ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovawWJ W CSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME type of column BD_TOVAR.NAME, CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME type of column BD_TOVAR.FULLNAME, INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.0000)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.0000) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELur.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; select roundedcena from round_rcena(null, coalesce(:cena_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_nds; select roundedcena from round_rcena(null, coalesce(:cena_not_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; select roundedcena from round_rcena(null, coalesce(:cena_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_nds; select roundedcena from round_rcena(null, coalesce(:cena_not_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; select roundedcena from round_rcena(null, coalesce(:cena_nds,0)*(1+:margin/100.0000)*(1-:discount/100.0000)) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^17.4.21.1SP_GET_SPR_FOR_ZAKPOLodate and bd_1.valid_flag=1 -- and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by 1,2,3 --bd_tovar.FK_CREATOR, bd_tovar.ALC_VID_KOD, bd_1.FK_BD_FIRM union SELECT bd_2.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества 0 as cnt_all_prih, 0 as cnt_from_cr, 0 as cnt_from_sup, 0 as cnt_1_6, 0 as cnt_7, --расходные sum(IIF((not(bd_1.cod_prih in (1,9,8)))or(bd_2.cod_rash=8),bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10,0)) as cnt_all_rash, --весь расход SUM(IIF(not(bd_1.cod_prih in (1,9,8)),CASE WHEN ((FK_RECIPIENT=2) OR (BD_2.COD_RASH=9)) THEN BD_21.cnt*COALESCE(bd_tovar.alc_volume,1)/10 ELSE 0 END,0)) AS CNT_ROZN, --РОЗНИЧНЫЕ ПРОДАЖИ+расходы кег на пр-во sum(IIF(not(bd_1.cod_prih in (1,9,8)),case when ( ((fk_recipient=bd_2.fk_bd_firm)or(fk_recipient=1) or (bd_2.cod_rash in (4))) and bd_2.cod_rash<>9 ) --убрали код 9 с учетом того, что расход на пр-во может выпасть в первой половине условия 16.06.16 then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_4, --прочий расход (списания) sum(case when ((fk_recipient not in (1,2))and(coalesce(rec.sklad,0)=0)and bd_2.cod_rash=5) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end) as cnt_5, --возвраты поставщику sum(IIF(bd_21.fk_bd_11_6 is not null,case when ((fk_recipient<>bd_2.fk_bd_firm)and(coalesce(rec.sklad,0)=1)) then bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_2_6 --перемещения ,sum(IIF(not(bd_1.cod_prih in (1,9,8)),case when (bd_2.cod_rash in (7)) then -bd_21.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_prih_vozv --возврат от покупателя FROM BD_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY join bd_11 on bd_11.field_key=bd_21.FK_BD_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join BD_FIRM rec on rec.FIELD_KEY=bd_2.FK_RECIPIENT and (coalesce(rec.sklad,0)=0 or (rec.sklad=1 and rec.fk_selful=:fk_selful and ((rec.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or (rec.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_2.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_21.FK_BD_TOVAR and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar where bd_2.date_rash between :fromdate and :todate --and not(bd_1.cod_prih in (1,9,8)) --товарообмен и бонусы, прих. с пр-ва and coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.FK_CREATOR) is distinct from null --если производитель нигде не указан - не декларируем group by coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_2.FK_BD_FIRM ) AS P group by 1,2,3 order by 1,2,3 into :FK_BD_FIRM , :FK_CREATOR , :kod_vid_prod , :cnt_all_prih , :cnt_from_cr , :cnt_from_sup , :cnt_1_6 , :cnt_7 , :cnt_all_rash , :cnt_rozn , :cnt_4 , :cnt_5 , :cnt_2_6, :cnt_prih_vozv do begin suspend; end END^ SET TERM ; ^17.4.21.1SP_ALC_MOVE_TRUE L = -SET TERM ^ ; CREATE OR ALTER procedure SP_ALC_MOVE_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer) returns ( FK_BD_FIRM integer, FK_CREATOR integer, KOD_VID_PROD varchar(3), CNT_ALL_PRIH decimal(15,5), CNT_FROM_CR decimal(15,5), CNT_FROM_SUP decimal(15,5), CNT_1_6 decimal(15,5), CNT_7 decimal(15,5), CNT_ALL_RASH decimal(15,5), CNT_ROZN decimal(15,5), CNT_4 decimal(15,5), CNT_5 decimal(15,5), CNT_2_6 decimal(15,5), CNT_PRIH_VOZV decimal(15,5)) as --DECLARE VARIABLE variable_name < datatype>; BEGIN for select FK_BD_FIRM, FK_CREATOR, alc_vid_kod, sum(cnt_all_prih), sum(cnt_from_cr), sum(cnt_from_sup), sum(cnt_1_6), sum(cnt_7), sum(cnt_all_rash), sum(cnt_rozn), sum(cnt_4), sum(cnt_5), sum(cnt_2_6), sum(cnt_prih_vozv) from ( --объединяем запросы по приходам и по расходам SELECT bd_1.FK_BD_FIRM,coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR) as fk_creator, BD_ALC_VID_PROD.KOD as alc_vid_kod, --приходные количества sum(IIF(not(bd_1.cod_prih in (1,9,8)),cnt*coalesce(BD_TOVAR.ALC_VOLUME,1)/10,0)) as cnt_all_prih, --поступления всего кроме возвратов sum(IIF(not(bd_1.cod_prih in (1,9,8)),case when ((cre.cr_inn=sup.INN)and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_from_cr, --от производителя sum(IIF(not(bd_1.cod_prih in (1,9,8)),case when ((coalesce(cre.cr_inn,'')<>coalesce(sup.INN,''))and(coalesce(sup.sklad,0)=0)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_from_sup, --от оптовиков --прочие поступления sum(IIF(bd_11.fk_bd_21_6 is not null,case when ((sup.sklad=1)and(bd_1.FK_SUPPLIER<>bd_1.FK_BD_FIRM)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_1_6, --перемещения кроме своего склада sum(IIF(not(bd_1.cod_prih in (1,9,8)),case when ((bd_1.FK_SUPPLIER=bd_1.FK_BD_FIRM)or(bd_1.FK_SUPPLIER=1)or(bd_1.cod_prih=7)) then bd_11.CNT*coalesce(BD_TOVAR.ALC_VOLUME,1)/10 else 0 end,0)) as cnt_7, --излишки 0 as cnt_all_rash, 0 as cnt_rozn, 0 as cnt_4, 0 as cnt_5, 0 as cnt_2_6, 0 as cnt_prih_vozv FROM BD_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_FIRM sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER and ((/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (sup.sklad=1 and sup.fk_selful=:fk_selful and ((sup.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(sup.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)))) join bd_firm skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.FIELD_KEY=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar left join BD_ALC_CREATOR cre on cre.cr_kod=coalesce(bd_11.FK_CREATOR_11,BD_TOVAR.fk_creator) where bd_1.date_nakl between :fromdate and :tx{ sup on sup.field_key=bd_1.FK_SUPPLIER where bd_1.VALID_FLAG=1 and bd_1.DATE_NAKL between :fromdate and :todate and not(bd_1.cod_prih in (9,1,8)) --бонусы, товарообмен и приход с пр-ва скрываем,излишки - нет bd_cod_prih and ( (/*sup.DECLAR_FLAG=1 and*/ coalesce(sup.sklad,0)=0) or (bd_1.cod_prih=7) ) group by 1,2,3,4,5, 7 into :fk_bd_1, :fk_bd_firm, :fk_creator, :kod_vid_prod, :fk_supplier, :cnt, :fk_bd_pfirm do begin tmp_kpp=''; select coalesce ( (select kpp from bd_pfirm where field_key=:fk_bd_pfirm) ,'') from rdb$database into :tmp_kpp; if (:tmp_kpp='') then select coalesce ( (select kpp from bd_firm where field_key=:fk_supplier) ,'') from rdb$database into :tmp_kpp; INSERT INTO BD_ALC_DOC2 (FK_ALC_DECLARE, FK_BD_FIRM, FK_CREATOR, kod_vid_prod, FK_SUPPLIER, CNT, fk_bd_1, kpp, fk_psupp) VALUES (:fk_declare, :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :FK_SUPPLIER, :CNT, :fk_bd_1, :tmp_kpp, :fk_bd_pfirm); end --получаем все остатки на конец предыдущего периода, пишем их в bd_alc_move2 --чтобы получить остатки, просто берем все записи из декларации с мксимальной датой окончания периода, меньшей даты начала этой декларации -- и извлекаем оттуда остатки на конец периода exists_old_declare=0; for select first 1 field_key from BD_ALC_DECLARE where fk_selful=:fk_selful and date_end<:fromdate and vid_declar=:vid_declar order by date_end desc, number_correct desc into :old_declare do begin for select fk_bd_firm, fk_creator, kod_vid_prod, cnt_end from BD_ALC_MOV2 where BD_ALC_MOV2.FK_ALC_DECLARE=:old_declare and cnt_end>0 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); exists_old_declare=1; end if (exists_old_declare=0) then begin --остатки на 01.01.2012, только для первой декларации for select bd_1.fk_bd_firm, bd_tovar.FK_CREATOR, prod.kod, sum(bd_tovar.ALC_VOLUME*0.1*(bd_11.cnt- coalesce((select sum(cnt) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=bd_11.field_key and bd_2.DATE_RASH<'1.01.2012'),0))) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_tovar on bd_tovar.field_key=bd_11.FK_BD_TOVAR join BD_ALC_VID_PROD prod on PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and prod.VID_DECLAR=:VID_DECLAR join BD_FIRM skl on skl.FIELD_KEY=bd_1.FK_BD_FIRM and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) and skl.FK_SELFUL=:fk_selful join bd_firm sup on sup.FIELD_KEY=bd_1.FK_SUPPLIER /*and sup.DECLAR_FLAG=1*/ where bd_1.date_prih<'1.01.2012' and bd_1.valid_flag=1 and not(bd_1.cod_prih in (9,1,8)) --бонусы, товарообмен и приход с пр-ва скрываем,излишки - нет group by 1,2,3 into :fk_bd_firm, :fk_creator, :kod_vid_prod, :cnt do begin -- if (:cnt>0) then INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, cnt_end, FK_ALC_DECLARE) VALUES (:FK_BD_FIRM,:FK_CREATOR,:kod_vid_prod, :cnt, :cnt, :fk_declare); end end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; --ищем все движения по виду продукции, приходы и расходы for select FK_BD_FIRM , FK_CREATOR , kod_vid_prod , cnt_all_prih , cnt_from_cr , cnt_from_sup , cnt_1_6 , cnt_7 , cnt_all_rash , cnt_rozn , cnt_4 , cnt_5 , cnt_2_6, cnt_prih_vozv from sp_alc_move_TRUE(:fromdate, :todate, :fk_selful, :vid_declar) into :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :cnt_test_prih, :CNT_prih_CR, :cnt_prih_sup, :cnt_prih_6, :CNT_PRIH_ANY, :cnt_test_rash, :cnt_rash_rozn, :cnt_rash_any, :cnt_rash_5, :cnt_rash_6, :cnt_prih_vozvrat do begin --находим есть ли запись по виду продукции/производителю/подразделению/по этой декларации fk_move2=null; select field_key, cnt_begin from BD_ALC_MOV2 where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and (fk_creator=:FK_CREATOR --or(:FK_CREATOR is null and fk_creator is null)) and kod_vid_prod=:kod_vid_prod and :fk_creator is distinct from null) --если производитель не указан - не декларируем into :fk_move2, :cnt_begin; if (nocalc_by_rash=0) then --считаем точные расходы, nocalc_by_rash теперь всегда 0 begin --рассчитываем итоговые суммы, проверяем расход cnt_zakup_itogo=CNT_prih_CR+CNT_prih_sup+CNT_ZAKUP_IMPORT; CNT_PRIH_VSEGO=CNT_ZAKUP_ITOGO+CNT_PRIH_VOZVRAT+CNT_PRIH_6+CNT_PRIH_ANY; -- +CNT_PRIH_ANY излишки CNT_RASH_VSEGO=CNT_RASH_rozn+CNT_RASH_5+CNT_RASH_6+CNT_RASH_ANY; if (cnt_begin+cnt_prih_vsego-cnt_rash_vsego<0) then begin CNT_PRIH_ANY=CNT_PRIH_ANY+abs(cnt_begin+cnt_prih_vsego-cnt_rash_vsego); cnt_prih_vsego=cnt_prih_vsego+abs(cnt_begin+cnt_prih_vsego-cnt_rash_vsego); cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end else begin cnt_end=cnt_begin+cnt_prih_vsego-cnt_rash_vsego; end --здесь были корректировки на случай cnt_end<0 - в режиме честной декларации убраны end if (fk_move2 is null) then begin --если есть, добавляем туда данные по приходам, расходам и вычисляем конечный остаток --если нет, вставляем запись с приходами-расходами, вычисляем конечный остаток if ((CNT_RASH_VSEGO<>0)or(CNT_PRIH_VSEGO<>0)or(cnt_end<>0)) then begin --пустые строки не вставляем INSERT INTO BD_ALC_MOV2 (FK_BD_FIRM, FK_CREATOR, kod_vid_prod, CNT_BEGIN, CNT_ZAKUP_CR, CNT_ZAKUP_OPT, CNT_ZAKUP_IMPORT, CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT, CNT_PRIH_ANY, CNT_PRIH_6, CNT_PRIH_VSEGO, CNT_RASH_0, CNT_RASH_ANY, CNT_RASH_5, CNT_RASH_6, CNT_RASH_VSEGO, CNT_END, FK_ALC_DECLARE) VALUES ( :FK_BD_FIRM, :FK_CREATOR, :kod_vid_prod, :CNT_BEGIN, :CNT_prih_CR, :CNT_prih_sup, :CNT_ZAKUP_IMPORT, :CNT_ZAKUP_ITOGO, :CNT_PRIH_VOZVRAT, :CNT_PRIH_ANY, :CNT_PRIH_6, :CNT_PRIH_VSEGO, :CNT_RASH_rozn, :CNT_RASH_ANY, :CNT_RASH_5, :CNT_RASH_6, :CNT_RASH_VSEGO, :CNT_END, :FK_DECLARE); end end else begin update bd_alc_mov2 set CNT_ZAKUP_CR=:cnt_prih_cr, CNT_ZAKUP_OPT=:cnt_prih_sup, CNT_ZAKUP_IMPORT=0, CNT_ZAKUP_ITOGO=:CNT_ZAKUP_ITOGO, CNT_PRIH_VOZVRAT=:CNT_PRIH_VOZVRAT, CNT_PRIH_ANY=:CNT_PRIH_ANY, CNT_PRIH_6=:CNT_PRIH_6, CNT_PRIH_VSEGO=:CNT_PRIH_VSEGO, CNT_RASH_0=:CNT_RASH_rozn, CNT_RASH_ANY=:CNT_RASH_ANY, CNT_RASH_5=:CNT_RASH_5, CNT_RASH_6=:CNT_RASH_6, CNT_RASH_VSEGO=:CNT_RASH_VSEGO, CNT_END=:CNT_END where FK_ALC_DECLARE=:FK_DECLARE and fk_bd_firm=:FK_BD_FIRM and fk_creator=:FK_CREATOR and kod_vid_prod=:kod_vid_prod; end CNT_BEGIN=0; CNT_prih_CR=0; CNT_prih_sup=0; CNT_ZAKUP_IMPORT=0;CNT_ZAKUP_ITOGO=0;CNT_PRIH_VOZVRAT=0;CNT_PRIH_ANY=0;CNT_PRIH_6=0;CNT_PRIH_VSEGO=0;CNT_RASH_rozn=0; CNT_RASH_ANY=0;CNT_RASH_5=0;CNT_RASH_6=0;CNT_RASH_VSEGO=0;CNT_END=0; end -- execute procedure SP_ALC_CORRECT_6(:FK_DECLARE); END^ SET TERM ; ^17.4.21.1SP_CREATE_NEW_ALC_TRUE FM = 9SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_NEW_ALC_TRUE ( FROMDATE date, TODATE date, FK_SELFUL integer, VID_DECLAR integer, PERIOD_TXT varchar(50), KOD_PERIOD integer, PERIOD_1 varchar(2), PERIOD_2 varchar(4)) as declare variable FK_DECLARE integer; declare variable FK_BD_FIRM integer; declare variable FK_CREATOR integer; declare variable KOD_VID_PROD varchar(3); declare variable FK_SUPPLIER integer; declare variable FK_BD_1 integer; declare variable CNT decimal(15,5); declare variable OLD_DECLARE integer; declare variable FK_MOVE2 integer; declare variable CNT_BEGIN decimal(15,5); declare variable CNT_PRIH_CR decimal(15,5); declare variable CNT_PRIH_SUP decimal(15,5); declare variable CNT_ZAKUP_IMPORT decimal(15,5); declare variable CNT_ZAKUP_ITOGO decimal(15,5); declare variable CNT_PRIH_VOZVRAT decimal(15,5); declare variable CNT_PRIH_ANY decimal(15,5); declare variable CNT_PRIH_6 decimal(15,5); declare variable CNT_PRIH_VSEGO decimal(15,5); declare variable CNT_RASH_ROZN decimal(15,5); declare variable CNT_RASH_ANY decimal(15,5); declare variable CNT_RASH_5 decimal(15,5); declare variable CNT_RASH_6 decimal(15,5); declare variable CNT_RASH_VSEGO decimal(15,5); declare variable CNT_END decimal(15,5); declare variable CNT_TEST_PRIH decimal(15,5); declare variable CNT_TEST_RASH decimal(15,5); declare variable EXISTS_OLD_DECLARE integer; declare variable NOCALC_BY_RASH integer; declare variable FK_BD_PFIRM integer; declare variable TMP_KPP type of column BD_FIRM.KPP; BEGIN -- nocalc_by_rash=coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where g.PARAMNAME='nocalc_by_rash'),0); --устарело nocalc_by_rash=0; --делаем запись в журнале деклараций fk_declare=gen_id(GEN_BD_ALC_DECLARE_ID,1); INSERT INTO BD_ALC_DECLARE (FIELD_KEY, DATE_START, DATE_END, FK_SELFUL, NOMER_CREATE, vid_declar, period_txt, close_flag, period_kod , period_1, period_2, prim, hide_izlish) VALUES (:fk_declare,:fromdate, :todate, :FK_SELFUL, (select coalesce((max(nomer_create)+1),1) from BD_ALC_DECLARE), :vid_declar, :period_txt,0, :kod_period , :period_1, :period_2, '', 0); --получаем данные по приходным накладным в разрезе по виду продукции, пишем их в BD_alc_DOC2 for select bd_1.field_key, bd_1.fk_bd_firm, coalesce(bd_11.FK_CREATOR_11,bd_tovar.FK_CREATOR), BD_ALC_VID_PROD.KOD, bd_1.FK_SUPPLIER, sum((bd_11.CNT*coalesce (BD_TOVAR.ALC_VOLUME,1))/10) , bd_1.fk_bd_pfirm from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.FIELD_KEY join BD_TOVAR on bd_tovar.field_key=bd_11.FK_BD_TOVAR --and BD_TOVAR.ALC_VID_KOD is not null join BD_ALC_VID_PROD on BD_ALC_VID_PROD.field_key=coalesce(bd_11.FK_BD_ALC_VID_PROD_11,BD_TOVAR.FK_BD_ALC_VID_PROD) and BD_ALC_VID_PROD.VID_DECLAR=:vid_declar join bd_firm skl on skl.field_key=bd_1.FK_BD_FIRM and skl.FK_SELFUL=:fk_selful and ((skl.ALC_DECLARE_SKL_FLAG=1 and :VID_DECLAR=11)or(skl.ALC_DECLARE_SKL_FLAG_12=1 and :VID_DECLAR=12)) join bd_firmzFIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN prim11=null; cnt=0; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_not_nds; -- cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); -- cena_not_nds = coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; --cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^округление17.4.24.1SP_GET_CURRSTATE_FOR_ZAKPOL #N G5CSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME type of column BD_TOVAR.NAME, CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME type of column BD_TOVAR.FULLNAME, INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.00) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.}_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^округление17.4.24.1SP_GET_SPR_FOR_ZAKPOL  }bP w-SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ intwO {57SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNT decimal(7,2); BEGIN ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FKeger, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3)) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod; cena_seb=:cena_pr_prod; cena_seb_ed=cena_pr_prod; end else begin cena_pr=:cena_pr_prod; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr_prod*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; suspend; end fk_ttk_tmp=null; end end end^ SET TERM ; ^ттк17.4.27.1SP_GET_CALC_TREE qqbR {-SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PRQ m##SET TERM ^ ; CREATE OR ALTER procedure O_OBOROTKA1 ( DATE_START date, DATE_END date, FK_SKLAD_POINTER blob sub_type 0 segment size 200, FK_GRT integer) returns ( FK_TOVAR integer, NAME_TOVAR varchar(200), EDIZM varchar(20), CNT_STOCK_1 decimal(15,3), SUM_STOCK_1 decimal(15,2), CNT_PRIH decimal(15,3), SUM_PRIH decimal(15,2), CNT_RASH decimal(15,3), SUM_RASH decimal(15,2), CNT_STOCK_2 decimal(15,3), SUM_STOCK_2 decimal(15,2)) as declare variable LB integer; declare variable RB integer; begin -- цикл РїРѕ РЅСЃРµРj РЅРµ архинныРj тонараРj РёР· ныбранной РіСЂСѓРїРїС‹ select lb,rb from bd_grt_tovar where field_key=:fk_grt into :lb,:rb; for select field_key,name,ed_izm_name from bd_tovar where ( bd_tovar.grp_lb >= :lb) AND (bd_tovar.grp_rb <= :rb) into :fk_tovar,:name_tovar, :edizm do begin cnt_stock_1=0; sum_stock_1=0; cnt_prih=0; sum_prih=0; cnt_rash=0; sum_rash=0; cnt_stock_2=0; sum_stock_2=0; -- :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' это фильтр РїРѕ складу. -- находиРj остатки 1 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<:date_start and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_1, :sum_stock_1; if (cnt_stock_1=0) then sum_stock_1=0; -- находиРj РїСЂРёС…РѕРґ select sum(bd_11.cnt),sum(bd_11.summa_with_nds) from bd_11 join bd_firm on (bd_11.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end into :cnt_prih,:sum_prih; -- находиРj расход select sum(bd_21.cnt),sum(bd_21.summa) from bd_21 join bd_firm on (bd_21.fk_bd_firm=bd_firm.field_key) where :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and bd_21.fk_bd_tovar=:fk_tovar and bd_21.date_rash between :date_start and :date_end into :cnt_rash,:sum_rash; -- находиРj остатки 2 select sum(bd_stock_1.cnt) sumcnt, sum(bd_stock_1.summa_pr_with_nds) sumsum FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<(:date_end+1) and :fk_sklad_pointer CONTAINING '['||bd_firm.field_key||']' and fk_bd_tovar=:fk_tovar into :cnt_stock_2, :sum_stock_2; if (cnt_stock_2=0) then sum_stock_2=0; if ((cnt_stock_1<>0) or (sum_stock_1<>0) or (cnt_prih<>0) or (sum_prih<>0) or (cnt_rash<>0) or (sum_rash<>0) or (cnt_stock_2<>0) or (sum_stock_2<>0)) then suspend; end end^ SET TERM ; ^O_OBOROTKA117.4.27.1O_OBOROTKA1 decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3)) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod; cena_seb=:cena_pr_prod; cena_seb_ed=cena_pr_prod; end else begin cena_pr=:cena_pr_prod; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr_prod*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; suspend; end fk_ttk_tmp=null; end end end^ SET TERM ; ^убраны разборные ттк в списке компонентов дерева ттк сборных ттк17.4.27.2SP_GET_CALC_TREEumma_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=:cena_prod; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=:cena_prod*:procent_seb/100.00; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^разборное производство17.5.2.1SP_CREATE_BY_PR_TTKRAZBOR upubT  +SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3);|S Oc?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; s declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^17.5.2.1SP_CREATE_BY_PR_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на остатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, bd_11.stock, bd_11.cena_pr_with_nds from bd_11 left join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_11.fk_bd_1=new.field_key and bd_11.stock>0 -- and ((bd_11.cod_prih<>8)or(exists(select field_key from bd_pr_product_track where fk_pr=bd_pr.field_key))) into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поздних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^Дробление bd_21 при автокомпенсации излишков17.5.2.1 TR_BD_1_CHECK_7   IY ]k?SET TERM ^ ; ALTER PROCEDURE SP_AVTOPR ( FK_BD_TOVAR Integer, FK_BD_TTK_AVTOPR Integer, CNT_OST Decimal(15,3), CNT_22 Decimal(15,3), FK_BD_FIRM Integer, FK_USER Integer, LANG Varchar(2), FK_BD_2 Integer, DATE_RASH Date, SUMMA_OST Decimal(18,2), CENA_WITH_NDS Decimal(8,2) ) RETURNS ( FK_BD_11 Integer, CNT_11 Decimal(15,3), MAN_FLAG Integer, SUMMA_MAN Decimal(15,2) ) AS declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer;`X W31INSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (17, 'Подтверждение отмены проведения ТТН', 'ConfirmRepealWB');add ConfirmRepealWB17.5.3.1BD_EGAIS_DOC_TYPESRW ;31INSERT INTO BD_EGAIS_DOC_TYPES (FIELD_KEY, RUS_NAME, ENG_NAME) VALUES (16, 'Запрос отмены проведения ТТН', 'RequestRepealWB');add RequestRepealWB17.5.3.1BD_EGAIS_DOC_TYPESgV ?ALTER SEQUENCE GEN_BD_EGAIS_DOC_TYPES_ID RESTART WITH 17;17.5.3.1GEN_BD_EGAIS_DOC_TYPES_IDYU Q+-SET TERM ^ ; ALTER TRIGGER TR_BD_1_CHECK_7 ACTIVE AFTER UPDATE POSITION 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; declare variable track11_7 type of column bd_11.track_11; declare variable fk_bd_22 integer; declare variable cena_with_nds type of column bd_21.CENA_WITH_NDS; declare variable cena_without_nds type of column bd_21.CENA_WITHOUT_NDS; declare variable fk_tovar_nabor_master integer; declare variable cnt_in_inplace type of column bd_21.CNT_IN_INPLACE; declare variable summa_man type of column bd_21.summa; declare variable man_flag type of column bd_21.SUM_INPUT_MAN_FLAG; declare variable akc_flag type of column bd_21.AKC_FLAG; declare variable sp_akc_flag type of column bd_21.SP_AKC_FLAG; declare variable fk_bd_mod integer; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASH type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; declare variable USE_ROUND_NORMA integer; declare variable is_sbor integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min, coalesce(bd_calc.use_round_norma_min,0), coalesce(IS_SBOR,0) from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check, :use_round_norma, :is_sbor ; if (is_sbor=0) then exit; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if ((select coalesce(avtoPR_flag,0) from bd_firm where field_key=:FK_BD_FIRM_AVTOPR)=0) then exit; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END ^ SET TERM ; ^Отменяем авто-пр-во при выключенном флаге на промежут складе17.5.10.1ALTER PROCEDURE SP_AVTOPR); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0) from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести авопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END ^ SET TERM ; ^сначала ссылка на приход, только затем проведение17.5.11.1SP_CREATE_BY_PRтатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, bd_11.stock, bd_11.cena_pr_with_nds from bd_11 left join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_11.fk_bd_1=new.field_key and bd_11.stock>0 --добавлено 10.5.2017 - исключены приходы по автопроизводству and (bd_pr.FK_BD_2_BASIS is null) --((bd_11.cod_prih<>8)or(exists(select field_key from bd_pr_product_track where fk_pr=bd_pr.field_key))) into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поздних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^Автокомпенсация излишков: исключены приходы по автопр-ву17.5.11.1TR_BD_1_CHECK_7  dX|^ EALTER TABLE BD_TOVAR ALTER COLUMN IN_PRICE_FLAG SET DEFAULT 1 ; IN_PRICE_FLAG SET DEFAULT 117.5.16.1BD_TOVAR] )7SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY, PRIM11 varchar(200)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNT decimal(7,2); BEGIN ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol  \ _+SET TERM ^ ; ALTER TRIGGER TR_BD_1_CHECK_7 ACTIVE AFTER UPDATE POSITION 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; declare variable track11_7 type of column bd_11.track_11; declare variable fk_bd_22 integer; declare variable cena_with_nds type of column bd_21.CENA_WITH_NDS; declare variable cena_without_nds type of column bd_21.CENA_WITHOUT_NDS; declare variable fk_tovar_nabor_master integer; declare variable cnt_in_inplace type of column bd_21.CNT_IN_INPLACE; declare variable summa_man type of column bd_21.summa; declare variable man_flag type of column bd_21.SUM_INPUT_MAN_FLAG; declare variable akc_flag type of column bd_21.AKC_FLAG; declare variable sp_akc_flag type of column bd_21.SP_AKC_FLAG; declare variable fk_bd_mod integer; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на о and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^prim1117.5.11.1SP_GET_SPR_FOR_ZAKPOL M_ '?-SET TERM ^ ; CREATE OR ALTER procedure SP_CENNIK_11_ALL ( ID_TRANSACTION integer) returns ( FULLNAME varchar(60), LAND varchar(20), MADE varchar(50), INPLACE decimal(7,3), DAY_SAVE integer, ED_NAME varchar(30), ARTICUL varchar(20), SCAN varchar(30), DATE_SAVE date, PRICE decimal(8,2), NAME varchar(30), STOCK decimal(7,3), REZERV decimal(7,3), NOMER_PRIH integer, DATE_PRIH date, COD_PRIH integer, DAY_CONS_PRIH integer, SUP_NAME varchar(30), AKC type of BOOLFIELD, DISCOUNT decimal(4,2), COMPOSITION blob sub_type 1 segment size 80, PLU integer, TOVAR_BRAND varchar(100), TOVAR_VID varchar(100)) as declare variable ID_TOVAR integer; BEGIN for select main.field_key, main.fullname, main.land, main.made, main.inplace, main.day_save, bd_ed_izm.name, main.articul, tmp_cennik.price, main.name, bd_11.DATE_SAVE, bd_11.STOCK, bd_11.REZERV, bd_1.NOMER_PRIH, bd_1.DATE_PRIH, bd_1.COD_PRIH, bd_1.DAY_CONS_PRIH, bd_post.name, main.akc, main.discount_unq, main.composition, main.number_on_scale, tov_typ.name, tov_brand.name from bd_11 join bd_tovar main on bd_11.fk_bd_tovar=main.field_key join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join tmp_cennik on tmp_cennik.fk_bd_tovar=main.FIELD_KEY join BD_FIRM bd_post on bd_post.FIELD_KEY=bd_1.FK_SUPPLIER join bd_ed_izm on bd_ed_izm.FIELD_KEY=main.FK_BD_ED_IZM left join bd_tovar_type tov_typ on tov_typ.field_key=main.fk_tovar_type left join bd_tovar_brand tov_brand on tov_brand.field_key=main.fk_tovar_brand where tmp_cennik.id_transaction=:id_transaction order by 2, 15 desc into :id_tovar, :fullname, :land, :made , :inplace, :day_save , :ed_name , :articul, :price , :name, :date_save, :stock, :rezerv, :nomer_prih, :date_prih, :cod_prih, :day_cons_prih, :sup_name, :akc, :discount, :composition, :plu, :tovar_vid, :tovar_brand do BEGIN suspend; END delete from tmp_cennik where id_transaction=:id_transaction; END^ SET TERM ; ^add TOVAR_BRAND TOVAR_VID17.5.16.1SP_CENNIK_11_ALL zzZbm)ALTER TABLE BD_CH2 ADD TABLE_NAME VARCHAR(100);ADD TABLE_NAME17.5.18.1BD_CH2a qs5update or INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Замена получателя в расходе', 'con_chg_recipient', 16) matching (NAME_VAR);Замена получателя в расходе17.5.18.1BD_USERS_RIGHTS_NAME` 5?'SET TERM ^ ; CREATE OR ALTER procedure SP_CENNIK_ALL ( ID_TRANSACTION integer, ID_SKLAD integer, ID_AKC integer = null) returns ( FULLNAME char(200), LAND char(20), MADE varchar(200), INPLACE decimal(7,3), DAY_SAVE integer, ED_NAME varchar(30), ARTICUL varchar(20), SCAN varchar(30), DATE_SAVE date, PRICE decimal(8,2), NAME char(100), AKC type of BOOLFIELD, DISCOUNT decimal(4,2), COMPOSITION blob sub_type 1 segment size 80, PLU integer, FK_BD_TOVAR integer, OLDPRICE decimal(8,2), DOP_INFO blob sub_type 0 segment size 80, FLAG_NEW integer, PRIM_AKC varchar(500), PROCENT_DISC decimal(5,2), FK_BD_AKC integer, TOVAR_BRAND varchar(100), TOVAR_VID varchar(100)) as --declare variable fk_old_cena integer; BEGIN -- fk_old_cena=(select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('old_cena_for_cennik')); fk_bd_akc=0; --fk_cena=coalesce((select bd_Firm.FK_BD_CENA_BASIC from bd_firm where field_key=:id_sklad),0); for select main.field_key, main.fullname, main.land, main.made, main.inplace, main.day_save, main.ed_izm_name as ed_name, main.articul, tmp_cennik.price, main.name, current_date+coalesce(main.DAY_SAVE,0), main.akc, main.discount_unq, main.composition, main.NUMBER_ON_SCALE, main.dop_info, main.FLAG_NEW -- max(bd_11.DATE_SAVE) , tov_typ.name, tov_brand.name from bd_tovar main --join bd_ed_izm on bd_ed_izm.field_key=main.fk_bd_ed_izm -- join bd_11 on bd_11.fk_bd_tovar=main.field_key join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join tmp_cennik on tmp_cennik.fk_bd_tovar=main.FIELD_KEY left join bd_tovar_type tov_typ on tov_typ.field_key=main.fk_tovar_type left join bd_tovar_brand tov_brand on tov_brand.field_key=main.fk_tovar_brand where tmp_cennik.id_transaction=:id_transaction-- and bd_1.FK_BD_FIRM=:id_sklad and bd_11.date_save is not null -- group by 1,2,3,4,5,6,7,8,9,10 order by main.name into :fk_bd_tovar, :fullname, :land, :made , :inplace, :day_save , :ed_name , :articul, :price , :name, :date_save, :akc, :discount, :composition, :plu, :dop_info, :flag_new, :tovar_vid, :tovar_brand do BEGIN scan=null; /*for*/ select first 1 scancod from bd_scan where fk_bd_tovar=:fk_bd_tovar order by bd_scan.cennik_flag desc,bd_scan.main_flag desc, field_key into :scan; /*do*/ /*break; */ --if (fk_old_cena is null) then oldprice=coalesce((select cenan from getcurcena_pred1(:fk_bd_tovar,:id_sklad)),0); --else -- oldprice=(select cena from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_old_cena); if (id_akc is null) then for select d.procent_disc, a.prim, a.field_key from bd_akc a left join bd_tovar_discount d on (d.fk_bd_akc=a.field_key) where a.valid_flag=1 and ((a.date_end>=current_date)or(a.date_end is null)) and d.fk_bd_tovar=:fk_bd_tovar into :procent_disc, :prim_akc, :fk_bd_akc do suspend; else for select d.procent_disc, a.prim, a.field_key from bd_akc a left join bd_tovar_discount d on (d.fk_bd_akc=a.field_key) where a.valid_flag=1 and ((a.date_end>=current_date)or(a.date_end is null)) and d.fk_bd_tovar=:fk_bd_tovar and a.field_key=:id_akc into :procent_disc, :prim_akc, :fk_bd_akc do suspend; fk_bd_akc=0; -- procent_disc=null; -- prim_akc=null; suspend; END delete from tmp_cennik where id_transaction=:id_transaction; END^ SET TERM ; ^add TOVAR_BRAND TOVAR_VID17.5.16.1SP_CENNIK_ALL  gd   +CREATE TABLE BD_TOVAR_UPARAM ( P_NAME1 VARCHAR(20), P_NAME2 VARCHAR(20), P_NAME3 VARCHAR(20), P_NAME4 VARCHAR(20), P_NAME5 VARCHAR(20), P_NAME6 VARCHAR(20), P_NAME7 VARCHAR(20), P_NAME8 VARCHAR(20), P_NAME9 VARCHAR(20), P_NAME10 VARCHAR(20), FORMULA VARCHAR(70) ); GRANT ALL ON BD_TOVAR_UPARAM TO PUBLIC;BD_TOVAR_UPARAM названия польз параметров17.5.27.1BD_TOVAR_UPARAM9c oG5ALTER TABLE BD_TOVAR ADD UPARAM1 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM2 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM3 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM4 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM5 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM6 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM7 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM8 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM9 VARCHAR(50); ALTER TABLE BD_TOVAR ADD UPARAM10 VARCHAR(50);польз параметры17.5.27.1BD_TOVAR ADD UPARAM1_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa+doprash); --/iif(cnt_all>0,:cnt_all,1); select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=:cena_prod/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^алгоритм расчета цены продукта17.5.27.1SP_CREATE_BY_PR_TTKRAZBOR f  E+SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integ'e ?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fker; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^перекомпиляция17.5.27.1SP_CREATE_BY_PRnto :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('достпно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0))) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat,current_time, :izlishki, null, null, :fk_supplier, :fk_face, :fk_cod_prih, null, null, null, 0, 0, 1, null, :id_user, 1, :fk_smena); END for select bd_91.FK_BD_TOVAR, coalesce(count_real,0)-coalesce(count_11,0), cena, --излишки BD_TOVAR.NDS, gtd, articul, inplace from bd_91 join bd_tovar on bd_tovar.field_key=bd_91.FK_BD_TOVAR where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))>0 into :fk_bd_tovar, :cnt, :cena, :NDS_tovar, :gtd, :articul, :inplace do BEGIN --находим сроки годности из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:id_skl and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; --заполняем приход INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, ARTICUL,date_save, date_make, margin115) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds_tovar, --date_save ? :GTD, :cena, --в приходе какую ставим цену??? (100*:cena)/(100+:nds_tovar), :cena*:cnt, (100*:cena*:cnt)/(100+:nds_tovar), :cnt, 0, :INPLACE, :ARTICUL, :date_save, :date_make, iif(:in_115_cena=1,0,null)); END update bd_9 set fk_bd_1=:fk_1, fk_bd_2=:fk_2 where field_key=:id_rev; select coalesce(bd_firm.auto_close_period,0) from bd_firm where field_key=:id_skl into :auto_close_period; if (:auto_close_period=1) then update bd_firm set close_period_date=:dat, close_period_num=coalesce(close_period_num,0)+1 where field_key=:id_skl; -- execute procedure sp_22_by_21(:fk_2,0); END^ SET TERM ; ^ автоматически закрывать период при проведении ревизии17.5.27.1SP_CREATE_BY_REV nj iE%UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Закрытый период', 'close_period', (select field_key from BD_USERS_RIGHTS_NAME where name_var='whs')) MATCHING (NAME_VAR); UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Редактирование периода у склада (вручную)', 'close_period_edit_hand', (select field_key from BD_USERS_RIGHTS_NAME where name_var='close_period')) MATCHING (NAME_VAR); UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Установка периода (Акт ревизии)', 'close_period_set', (select field_key from BD_USERS_RIGHTS_NAME where name_var='close_period')) MATCHING (NAME_VAR); UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Работа в закрытом периоде', 'close_period_work', (select field_key from BD_USERS_RIGHTS_NAME where name_var='close_period')) MATCHING (NAME_VAR);Склад _ Закрытый период _ Работа в закрытом периоде17.5.27.1close_periodZi %Y-SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_REV ( ID_REV integer) returns ( FK_1 integer, FK_2 integer) as declare variable DAT date; declare variable TIM time; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CNT decimal(7,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS_TOVAR integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable OST_RASH decimal(7,3); declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable NEDOSTACHA varchar(200); declare variable IZLISHKI varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable FK_SUPPLIER integer; declare variable FK_RECIPIENT integer; declare variable FK_COD_PRIH integer; declare variable FK_COD_RASH integer; declare variable IN_PRIH_CENA integer; declare variable IN_115_CENA integer; declare variable AUTO_CLOSE_PERIOD integer; BEGIN /* создание прихода и расхода по ревизии */ in_115_cena=0; lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); nedostacha=(select TR_NAME from SP_TRANSLATE('Недостача',:lang)); izlishki=(select TR_NAME from SP_TRANSLATE('Излишки',:lang)); id_user=(select first 1 field_key from bd_users where upper(login)=upper(current_user)); select date_rev, time_rev, fk_bd_firm, FK_FACE, FK_BD_SMENA, coalesce(fk_supplier,1), coalesce(fk_recipient,1), coalesce(fk_cod_prih,7) , coalesce(fk_cod_rash,4), coalesce(IN_PRIH_PRICE,0) from BD_9 where field_key=:id_rev into :dat, :tim, :id_skl, :fk_face, :fk_smena, :fk_supplier, :fk_recipient, :fk_cod_prih, :fk_cod_rash, :in_prih_cena; if (in_prih_cena=0) then in_115_cena=1; if (exists (select bd_91.FK_BD_TOVAR --недостачи from bd_91 where fk_bd_9=:id_rev and (coalesce(count_real,0)-coalesce(count_11,0))<0)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena, in_bd115_cena) VALUES (:fk_2,:nedostacha,(selecth, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для озврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa_nds+doprash); --/iif(cnt_all>0,:cnt_all,1); select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=:cena_prod/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^(sum(bd_22.SUMMA)* :procent_seb/100.00 ) /:cnt17.5.29.2SP_CREATE_BY_PR_TTKRAZBOR ,m w--SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_V l i?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIARIANT smallint, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3)) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); cena_pr_prod=:cena_pr_prod*:norma_ttk; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod; cena_seb=:cena_pr_prod; cena_seb_ed=cena_pr_prod; end else begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; suspend; end fk_ttk_tmp=null; end end end^ SET TERM ; ^SP_GET_CALC_TREE17.5.30.1SP_GET_CALC_TREE z trMMKupdate BD_TOVAR set is_usluga=0;убрать все услуги17.6.7.1update BD_TOVAR set is_usluga=0*q s OALTER TABLE BD_EGAIS_DOC_RASH_TOVAR ADD PRICE DECIMAL(12,3); ALTER TABLE bd_egais_formb_regs add AREG_TTNNUMBER VARCHAR(64); ALTER TABLE bd_egais_formb_regs add AREG_TTNDATE DATE; ALTER TABLE bd_egais_formb_regs add AREG_EGAISNUMBER VARCHAR(64); ALTER TABLE bd_egais_formb_regs add AREG_EGAISDATE DATE; ALTER TABLE bd_egais_formb_regs add REPLY1 VARCHAR(50); ALTER TABLE bd_egais_formb_regs add REPLY2 VARCHAR(50);17.6.7.1BD_EGAIS_DOC_RASH_TOVAR ADD PRICE p M/SET TERM ^ ; CREATE OR ALTER trigger bd_2_biu0 for bd_2 active before insert or update position 0 AS declare variable old_valid_flag integer; begin if (inserting or updating) then begin if (inserting) then old_valid_flag=0; else old_valid_flag=coalesce(old.valid_flag,0); if ((old_valid_flag=1)and (new.valid_flag=1)) then begin if (exists(select bd_22.field_key from bd_22 left join bd_21 on bd_21.fk_bd_22=bd_22.field_key where bd_22.fk_bd_2=new.field_key and bd_21.field_key is null)) then new.error_validate=1; end if (new.valid_flag=0) then new.error_validate=0; end end^ SET TERM ; ^для теста записей не попадающих в бд2117.6.1.1trigger bd_2_biu0-o ;ALTER TABLE BD_2 ADD ERROR_VALIDATE BOOLFIELD DEFAULT 0 ;для теста записей не попадающих в бд2117.6.1.1BD_2 ADD ERROR_VALIDATEn  S!INSERT INTO BD_SMARTPRINT_REZHIM (FIELD_KEY, REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES (97, 'Расход', 'tfrmrashodmini', 2); INSERT INTO BD_SMARTPRINT_REZHIM (FIELD_KEY, REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES (98, 'Приход', 'tfrmprihodmini', 1);режим печати из ТСД17.5.31.1print_mini ddu #e-SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3), CURR_LEVEL integer) as t %EALTER TABLE BD_TOVAR ADD KASSA_EDIT_PRICE_PERCENT DECIMAL(3,2) DEFAULT 0 ;ADD KASSA_EDIT_PRICE_PERCENT17.6.16.1BD_TOVARbs g3# CREATE OR ALTER procedure O_OBOROTKA2 ( DATE_START date, DATE_END date, FK_SKLAD integer, FK_GRT integer) returns ( FK_TOVAR integer, NAME_TOVAR varchar(200), EDIZM varchar(20), CENA_RASH decimal(9,3), CNT_STOCK_1 decimal(15,3), CNT_PRIH decimal(15,3), CNT_5 decimal(15,3), CNT_RASH decimal(15,3), SUM_RASH decimal(15,2), CNT_STOCK_2 decimal(15,3), SUM_STOCK_2 decimal(15,2)) as declare variable LB integer; declare variable RB integer; begin select lb,rb from bd_grt_tovar where field_key=:fk_grt into :lb,:rb; --cikl po tovaram iz gruppi for select field_key,name,ed_izm_name from bd_tovar where ( bd_tovar.grp_lb >= :lb) AND (bd_tovar.grp_rb <= :rb) into :fk_tovar,:name_tovar, :edizm do begin cnt_stock_1=0; CENA_RASH=1; cnt_prih=0; cnt_5=0; cnt_rash=0; sum_rash=0; cnt_stock_2=0; sum_stock_2=0; SELECT sum(bd_stock_1.cnt) sumcnt FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<:date_start and bd_firm.field_key=:fk_sklad and fk_bd_tovar=:fk_tovar into :cnt_stock_1; select first 1 bd_cpr_now.cena from bd_cpr_now inner join bd_firm on bd_firm.fk_bd_cena_basic=bd_cpr_now.fk_bd_cena where bd_firm.field_key=:fk_tovar into :cena_rash; select sum(bd_11.cnt) from bd_11 join bd_firm on (bd_11.fk_bd_firm=bd_firm.field_key) where bd_firm.field_key=:fk_sklad and bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end into :cnt_prih; select sum(bd_21.cnt) from bd_21 join bd_firm on (bd_21.fk_bd_firm=bd_firm.field_key) where bd_firm.field_key=:fk_sklad and bd_21.fk_bd_tovar=:fk_tovar and bd_21.cod_rash<>5 and bd_21.date_rash between :date_start and :date_end into :cnt_rash; select sum(bd_21.cnt) from bd_21 join bd_firm on (bd_21.fk_bd_firm=bd_firm.field_key) where bd_firm.field_key=:fk_sklad and bd_21.fk_bd_tovar=:fk_tovar and bd_21.cod_rash=5 and bd_21.date_rash between :date_start and :date_end into :cnt_5; sum_rash=cnt_rash*cena_rash; select sum(bd_stock_1.cnt) sumcnt FROM BD_stock_1 join BD_FIrm on BD_FIRM.FIELD_KEY=bd_stock_1.FK_BD_FIRM where bd_stock_1.date_morning<(:date_end+1) and bd_firm.field_key=:fk_sklad and fk_bd_tovar=:fk_tovar into :cnt_stock_2; sum_stock_2=cnt_stock_2*cena_rash; if ((cnt_stock_1<>0) or (cnt_prih<>0) or (cnt_5<>0) or (cnt_rash<>0) or (sum_rash<>0) or (cnt_stock_2<>0) or (sum_stock_2<>0)) then suspend; end endдля отчета17.6.13.1o_oborotka2declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; curr_level=:out_level; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); cena_pr_prod=:cena_pr_prod*:norma_ttk; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod; cena_seb=:cena_pr_prod; cena_seb_ed=cena_pr_prod; end else begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; if ((curr_level=1)) then curr_level=:curr_level+1; -- curr_level=coalesce(:out_level,0)-:curr_level; suspend; if (:fk_ttk_comp is not null) then curr_level=:curr_level+1; end fk_ttk_tmp=null; end curr_level=coalesce(:in_level,0)+1; end end^ SET TERM ; ^новое поле для отчета, для правильной расстановки отступов17.6.20.1SP_GET_CALC_TREEd_tovar_mod, bd_11.stock, bd_11.cena_pr_with_nds from bd_11 left join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_11.fk_bd_1=new.field_key and bd_11.stock>0 --добавлено 10.5.2017 - исключены приходы по автопроизводству and (bd_pr.FK_BD_2_BASIS is null) --((bd_11.cod_prih<>8)or(exists(select field_key from bd_pr_product_track where fk_pr=bd_pr.field_key))) into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поздних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 left join bd_2 on bd_2.field_key=bd_1.fk_bd_2_7 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 and coalesce(bd_2.cod_rash,0)<>7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 left join bd_2 on bd_2.field_key=bd_1.fk_bd_2_7 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 and coalesce(bd_2.cod_rash,0)<>7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^При компенсации излишек не брать излишки созданые возвратами от получателей17.6.20.1trigger tr_bd_1_check_7 P.PW{i 3ALTER TABLE BD_SETT ADD shelf_life_2 integer;17.6.26.1ALTER TABLE BD_SETTWzi 3ALTER TABLE BD_SETT ADD shelf_life_1 integer;17.6.26.1ALTER TABLE BD_SETTy  EKSET TERM ^ ; ALTER PROCEDURE SP_CREATE_BY_PR ( ID_PR Integer, CREATE_7 Integer DEFAULT 0, BY_NDS Char(1) DEFAULT '' ) RETURNS ( FK_1 Integer, FK_2 Integer, RES Varchar(100) ) AS declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare vbx /K?SET TERM ^ ; ALTER PROCEDURE SP_AVTOPR ( FK_BD_TOVAR Integer, FK_BD_TTK_AVTOPR Integer, CNT_OST Decimal(15,3), CNT_22 Decimal(15,3), FK_BD_FIRM Integer, FK_USER Integer, LANG Varchar(2), FK_BD_2 Integer, DATE_RASH Date, SUMMA_OST Decimal(18,2), CENA_WITH_NDS Decimal(8,2) ) RETURNS ( FK_BD_11 Integer, CNT_11 Decimal(15,3), MAN_FLAG Integer, SUMMA_MAN Decimal(15,2) ) AS declare variable CNT_AVTOPR_OST decimal(15,3); declare variable CNT_PR_SPIS decimal(15,3); declare variable CNT_PR_PROD decimal(15,3); declare variable CNT_TMP_OST decimal(15,3); declare variable FK_BD_FIRM_AVTOPR integer; declare variable FK_BD_PR integer; declare variable NAME_TOV type of column BD_TOVAR.NAME; declare variable RES_PR varchar(100); declare variable FK_2 integer; declare variable COEF_AVTOPR decimal(12,3); declare variable FK_2_6 integer; declare variable NOMER_RASH integer; declare variable FK_BD_CENA integer; declare variable IN_PRIH_PRICE integer; declare variable NAME_CENA type of column BD_2.NAME_IFS; declare variable COD_RASHāWw o3ALTER TABLE BD_FIRM ADD avtopr_chain_allow_flag BOOLFIELD;флажок "Производить полуфабрикат в цепочке автопроизводства"17.6.23.1ALTER TABLE BD_FIRMqv u';SET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_check_7 for bd_1 active after update position 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; declare variable track11_7 type of column bd_11.track_11; declare variable fk_bd_22 integer; declare variable cena_with_nds type of column bd_21.CENA_WITH_NDS; declare variable cena_without_nds type of column bd_21.CENA_WITHOUT_NDS; declare variable fk_tovar_nabor_master integer; declare variable cnt_in_inplace type of column bd_21.CNT_IN_INPLACE; declare variable summa_man type of column bd_21.summa; declare variable man_flag type of column bd_21.SUM_INPUT_MAN_FLAG; declare variable akc_flag type of column bd_21.AKC_FLAG; declare variable sp_akc_flag type of column bd_21.SP_AKC_FLAG; declare variable fk_bd_mod integer; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на остатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.fk_b type of column BD_2.COD_RASH; declare variable CURR_STOCK decimal(15,3); declare variable FK_TOVAR_PROD integer; declare variable FK_TOVAR_COMP integer; declare variable NORMA_PROD type of column BD_CALC_PRODUCT.NORMA; declare variable NORMA_COMP type of column BD_CALC_COMPONENT.NORMA; declare variable CNT_PROD_MIN decimal(15,4); declare variable CNT_PROD_COMP decimal(15,4); declare variable FK_TOVAR_COMP_CHECK integer; declare variable CNT_PR_PROD_CHECK decimal(15,4); declare variable NORMA_PROD_CHECK decimal(15,4); declare variable CNT_OST_ALLOW decimal(15,4); declare variable AVTOPR_ON_COMP_EXISTS integer; declare variable USE_ROUND_NORMA integer; declare variable is_sbor integer; BEGIN select BD_TOVAR.FK_BD_FIRM_AVTOPR, name, coalesce(bd_tovar.avtopr_on_comp_exists,0) from BD_TOVAR where field_key=:fk_bd_tovar into :FK_BD_FIRM_AVTOPR, :name_tov, :avtopr_on_comp_exists; select FK_BD_FIRM_PROD, bd_calc.norma_min, coalesce(bd_calc.use_round_norma_min,0), coalesce(IS_SBOR,0) from bd_calc where field_key=:fk_bd_ttk_avtopr into :FK_BD_FIRM_AVTOPR, :norma_prod_check, :use_round_norma, :is_sbor ; if (is_sbor=0) then exit; -------------------------------------------------------------вариант, когда указан склад автопроизводства: акт производства с излишками на сырье, которого не хватает и перемещение if (FK_BD_FIRM_AVTOPR is null) then FK_BD_FIRM_AVTOPR=FK_bd_firm; if ((select coalesce(avtoPR_flag,0) from bd_firm where field_key=:FK_BD_FIRM_AVTOPR)=0) then exit; if (((select coalesce(bd_firm.AVTOPR_CHAIN_ALLOW_FLAG,0) from bd_firm where field_key=:FK_BD_FIRM_AVTOPR)=0)and(FK_BD_FIRM_AVTOPR<>FK_bd_firm)) then exit; if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin if (avtopr_on_comp_exists=1) then begin -- проверить остатки для получения доступного количества производств select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:FK_BD_FIRM_AVTOPR and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); /* FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; */ if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end --создаем перемещение fk_2_6=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(nomer_rash)+1,1) from bd_2 where fk_bd_firm=:fk_bd_firm); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, FK_BD_PFIRM, FK_BD_FIRM, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, MARGIN, DISCOUNT, FK_SELFUL, FK_SELFUL2, NAME_IFS, NOEDITRASHCENA) VALUES (:fk_2_6, :nomer_rash, :nomer_rash, :date_rash, :date_rash, :FK_bd_firm, 6, 0, :FK_USER, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm_avtopr), :FK_BD_FIRM_avtopr, (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_bd_firm), null, 1, 0, 0, null, null, (select tr_name from SP_TRANSLATE('В прих.ценах',:lang)), 1); insert into bd_22 (fk_bd_2, fk_bd_tovar, cnt) values (:fk_2_6, :fk_bd_tovar, :cnt_ost); --условия перемещения fk_bd_cena=null; in_prih_price=1; name_cena=null; cod_rash=6; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA, c.name, d.cod_rash from BD_DOGOVOR d join BD_GRT_FIRM_WEB w on w.fk_bd_grt_firm=d.fk_bd_grt_firm and w.fk_bd_firm=:fk_bd_firm_avtopr left join bd_cena c on c.field_key=d.FK_BD_CENA_RASH where d.fk_recipient=:fk_bd_firm and d.valid_flag=1 into :fk_bd_cena, :in_prih_price, :name_cena, :cod_rash; if (in_prih_price=1) then begin name_cena=(select sp.tr_name from SP_TRANSLATE('В прих.ценах',:lang) sp); end else begin name_cena=substring((select tr_name from SP_TRANSLATE('По цене ',:lang))||name_cena from 1 for 100); end update bd_2 set bd_2.FK_CENA_RASH=:fk_bd_cena, IN_PRIH_CENA=:in_prih_price, name_ifs=:name_cena, cod_rash=:cod_rash where field_key=:fk_2_6; execute procedure sp_bd_2_recalc_price(:fk_2_6); --условия перемещения конец end else -- FK_BD_FIRM_AVTOPR=FK_bd_firm begin if (avtopr_on_comp_exists=1) then begin select first 1 fk_bd_tovar, trunc(min(coalesce((select sum(stock) from bd_11 where bd_11.fk_bd_firm=:fk_bd_firm and bd_11.date_prih<=:date_rash and bd_11.fk_bd_tovar=bd_calc_component.fk_bd_tovar and bd_11.valid_flag=1 and bd_11.stock>0 and bd_11.priority>0),0)/bd_calc_component.norma),0) from bd_calc_component where fk_calc=:fk_bd_ttk_avtopr group by 1 order by 2 into :fk_tovar_comp_check, :cnt_pr_prod_check; cnt_ost_allow=:cnt_pr_prod_check*:norma_prod_check+(select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0); if (cnt_ost>cnt_ost_allow) then cnt_ost=cnt_ost_allow; if (cnt_ost=0) then begin suspend; exit; end end end if (FK_BD_FIRM_AVTOPR<>FK_bd_firm) then begin select coalesce(sum(bd_11.stock),0) from bd_11 where fk_bd_firm=:fk_bd_firm_avtopr and bd_11.fk_bd_tovar=:fk_bd_tovar and bd_11.stock>0 and bd_11.VALID_FLAG=1 and bd_11.DATE_PRIH<=:date_rash and bd_11.priority>0 into :curr_stock; end else begin curr_stock=0; end if (curr_stockFK_bd_firm) then begin --проводим перемещение, разрешая излишки EXECUTE PROCEDURE SP_BD2_PROV(:FK_2_6, :LANG, 1, :FK_USER); update bd_1 set valid_flag=1 where field_key=(select fk_bd_1_6 from bd_2 where bd_2.field_key=:fk_2_6); --возвращаем партии из вновь созданного прихода (по перемещению) for select bd_11.field_key, bd_11.cnt from bd_11 join bd_2 on bd_2.fk_bd_1_6=bd_11.fk_bd_1 where bd_2.field_key=:fk_2_6 into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end else begin --иначе берем приход по производству for select bd_11.field_key, bd_11.cnt from bd_11 join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_pr.field_key=:fk_bd_pr into :fk_bd_11, :cnt_11 do begin man_flag=1; summa_man=cast(:cnt_ost*cena_with_nds as decimal(15,3)); suspend; end end END ^ SET TERM ; ^Производить полуфабрикат в цепочке автопроизводства - если не стоит, то не выполнять автопроизводство для другого склада17.6.23.1ALTER PROCEDURE SP_AVTOPRariable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^перекомпиляция17.6.23.1ALTER PROCEDURE SP_CREATE_BY_PR  F x  F GsKINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Установка/снятие метки ШАБЛОН', 'con_settemp', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='consumption'));права на назначение шаблона17.6.29.1INSERT INTO BD_USERS_RIGHTS_NAM\a%-ALTER TABLE BD_2 ADD temp_flag BOOLFIELD;ШАБЛОН17.6.29.1ALTER TABLE BD_2{cW7ALTER TABLE BD_22 ADD cnt_inplace Integer;Количество упаковок17.6.27.1ALTER TABLE BD_22 ADD E ?INSERT INTO BD_QUICK_MENU (FIELD_KEY, NAME, TAG) VALUES ('5', 'Для ТСД simple', '11');17.6.26.1INSERT INTO BD_QUICK_MENU]u 3ALTER TABLE BD_SETT ADD shelf_life_color_3 integer;17.6.26.1ALTER TABLE BD_SETT]~u 3ALTER TABLE BD_SETT ADD shelf_life_color_2 integer;17.6.26.1ALTER TABLE BD_SETT]}u 3ALTER TABLE BD_SETT ADD shelf_life_color_1 integer;17.6.26.1ALTER TABLE BD_SETTW|i 3ALTER TABLE BD_SETT ADD shelf_life_3 integer;17.6.26.1ALTER TABLE BD_SETT.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Накладная №'||nomer_prih||' ('||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=summa_real+razn; END fk_doc=id; suspend; END --обороты за период name_oper='Обороты за период'; debet=summa_real; if (debet=0) then debet=null; kredit=summa_opl; if (kredit=0) then kredit=null; suspend; --считаем итоговое сальдо name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||dat_do_s||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||dat_do_s||' задолженность в пользу '||org||' '||RAZN||' руб.'; end ELSE txt_itogo='на '||dat_do_s||' задолженность в пользу '||org_client||' '||RAZN||' руб.'; id=null; suspend; END17.7.3.1акт сверки по дате накладной k O uCREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl; if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast('Накладная №'||nomer_rash||' ('||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(bd_21.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2ger; declare variable FK_BD_DOGOVOR integer; declare variable FK_BD_2NEW integer; declare variable FK_BD_TOVAR integer; declare variable CENA_WITH_NDS decimal(8,2); declare variable CENA_WITHOUT_NDS decimal(8,2); declare variable CNT decimal(8,3); declare variable NDS decimal(3,2); declare variable DATE_SAVE date; declare variable GTD varchar(26); declare variable FK_USER integer; declare variable FIRMNAME varchar(30); declare variable FK_BD_TOVAR_MOD integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable SUM_INPUT_MAN_FLAG integer; declare variable SUMMA type of column BD_22.SUMMA; declare variable CNT_IN_INPLACE type of column BD_22.CNT_IN_INPLACE; declare variable PRIM type of column BD_2.comment; declare variable DATE_RASH date; begin select field_key from bd_users where upper(login)=upper(current_user) into :fk_user; select name from bd_firm where field_key=(select fk_bd_firm from bd_2 where field_key=:fk_bd_2) into :firmname; if (fk_firm is null) then begin select bd_2.nomer_rash, bd_2.date_nakl, bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_bd_pfirm, bd_2.fk_bd_firm, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT" from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_bd_pfirm, :fk_firm, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim; end else begin select bd_2.nomer_rash, bd_2.date_nakl ,bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT", bd_2.date_rash from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim, :date_rash; end fk_bd_2new=gen_id(GEN_BD_2_ID,1); if (:date_rash is null) then begin date_rash=current_date; end insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1, FK_BD_dogovor) VALUES ( :fk_bd_2new,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), null, :date_rash, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_user, coalesce(:prim,'РљРѕРїРёСЏ расхода '||:nomer_rash||' '||:firmname), 0, :fk_bd_pfirm, null, null, :fk_firm, null, 0, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, null, null, null,:fk_bd_dogovor); for select a.FK_BD_TOVAR, a.FK_BD_TOVAR_MOD, a.CENA_WITH_NDS, a.CENA_WITHOUT_NDS, a.NDS, a.CNT, a.FK_TOVAR_NABOR_MASTER, a.SUM_INPUT_MAN_FLAG, a.SUMMA, a.CNT_IN_INPLACE from bd_22 a where fk_bd_2=:fk_bd_2 order by field_key into :fk_bd_tovar, :fk_bd_tovaR_MOD, :CENA_WITH_NDS, :CENA_without_nds, :nds, :cnt, :fk_tovar_nabor_master, :sum_input_man_flag, :summa, :cnt_in_inplace do begin INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, FK_TOVAR_NABOR_MASTER, SUM_INPUT_MAN_FLAG, SUMMA, CNT_IN_INPLACE) VALUES (:fk_bd_2new, :FK_BD_TOVAR, :FK_BD_TOVAR_MOD, :CENA_WITH_NDS, :CENA_WITHOUT_NDS, :NDS, :CNT, :FK_TOVAR_NABOR_MASTER, :SUM_INPUT_MAN_FLAG, :SUMMA, :CNT_IN_INPLACE); end endна чужой склад - со старой17.7.3.1копируем расход на свой склад с новой датой uu k /SET TERM ^ ; create or alter procedure SP_ANALIZ_PR_COMP ( FK_21 integer) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2)) as declare variable FK_11 integer; declare variable COD_PRIH integer; declare variable FK_1 integer; declare variable FK_2 integer; declare variable FK_21_2 integer; declare variable FK_11_6_MAIN integer; begin select bd_21.fk_bd_tovar, bd_21.cnt, bd_21.cena_with_nds, bd_21.summa, bd_21.fk_bd_11, bd_11.cod_prih, bd_11.fk_bd_1, bd_11.fk_bd_11_6_main from bd_21 left join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.field_key=:fk_21 into :fk_bd_tovar, :cnt, :price, :summa, :fk_11, :cod_prih, :fk_1, :fk_11_6_main; if (cod_prih=8) then begin select fk_bd_2 from bd_pr where fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa from sp_analiz_pr_comp(:fk_21_2) sp into :fk_bd_tovar, :cnt, :price, :summa do suspend; end end else suspend; end else if (fk_11_6_main is not null) then begin select fk_bd_1 from bd_11 where field_key=:fk_11_6_main into :fk_1; select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa from sp_analiz_pr_comp(:fk_21_2) sp into :fk_bd_tovar, :cnt, :price, :summa do suspend; end end else suspend; end else suspend; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_21 TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT SELECT ON BD_11 TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT SELECT ON BD_PR TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR_COMP; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO SYSDBA;17.7.5.1SP_ANALIZ_PR_COMPR  i+CREATE OR ALTER procedure SP_COPY_RASH ( FK_BD_2 integer, FK_FIRM integer) as declare variable DATE_NAKL date; declare variable NOMER_RASH varchar(10); declare variable FK_RECIPIENT integer; declare variable FK_FACE integer; declare variable COD_RASH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_PFIRM integer; declare variable FK_PFIRM_RECIPIENT integer; declare variable FK_CENA_RASH integer; declare variable IN_PRIH_CENA inte  " qm=ALTER TABLE BD_USER_PROC ADD avto_flag BOOLFIELD;автозапуск польз процедур17.7.8.1ALTER TABLE BD_USER_PROCo -aGSET TERM ^ ; ALTER TRIGGER TR_BD_1_CHECK_7 ACTIVE AFTER UPDATE POSITION 200 AS declare variable fk_11 integer; declare variable fk_tovar integer; declare variable fk_mod integer; declare variable stock type of column bd_11.STOCK; declare variable fk_11_7 integer; declare variable fk_bd_1_7 integer; declare variable fk_bd_21 integer; declare variable cnt_21 type of column bd_21.cnt; declare variable fk_bd_2 integer; declare variable cenapr type of column bd_11.CENA_PR_WITH_NDS; declare variable chk_izl_today smallint; declare variable track11_7 type of column bd_11.track_11; declare variable fk_bd_22 integer; declare variable cena_with_nds type of column bd_21.CENA_WITH_NDS; declare variable cena_without_nds type of column bd_21.CENA_WITHOUT_NDS; declare variable fk_tovar_nabor_master integer; declare variable cnt_in_inplace type of column bd_21.CNT_IN_INPLACE; declare variable summa_man type of column bd_21.summa; declare variable man_flag type of column bd_21.SUM_INPUT_MAN_FLAG; declare variable akc_flag type of column bd_21.AKC_FLAG; declare variable sp_akc_flag type of column bd_21.SP_AKC_FLAG; declare variable fk_bd_mod integer; BEGIN if ((not(coalesce(old.VALID_FLAG,0)=0 and coalesce(new.VALID_FLAG,0)=1))or(new.cod_prih=7)) then exit; if ((select coalesce(bd_firm.CHECK_IZL_FLAG,0) from bd_firm where field_key=new.fk_bd_firm)=0) then exit; if ((select coalesce(bd_firm.CHECK_DENY_IZL_SUPPLIER_FLAG,0) from bd_firm where field_key=new.fk_supplier)=1) then exit; --идем по всем позициям прихода, которые есть на остатках select coalesce(bd_firm.check_izl_only_today_flag, 0) from bd_firm where field_key=new.fk_bd_firm into :chk_izl_today; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.fk_bd_tovar_mod, bd_11.т} ?1update bd_egais_doc_types set eng_name='WayBill_v2' where eng_name='WayBill'; update bd_egais_doc_types set eng_name='FORM2REGINFO' where eng_name='FORMBREGINFO'; update bd_egais_doc_types set eng_name='WayBillAct_v2' where eng_name='WayBillAct';Типы документов егаис переименованы под версию 217.7.6.1bd_egais_doc_typesY { %SET TERM ^ ; create or alter procedure SP_ANALIZ_PR ( DATE_START date, DATE_END date, FK_TOVAR integer) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2)) as declare variable FK_1 integer; declare variable FK_11 integer; declare variable FK_2 integer; declare variable FK_21 integer; begin for select bd_11.field_key, bd_11.fk_bd_1 from bd_11 where bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end and bd_11.valid_flag=1 and bd_11.cod_prih=8 into :fk_11, :fk_1 do begin select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 into :fk_2; for select bd_21.field_key from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.fk_bd_2=:fk_2 into :fk_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa from sp_analiz_pr_comp(:fk_21) sp into :fk_bd_tovar, :cnt, :price, :summa do suspend; end end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_11 TO PROCEDURE SP_ANALIZ_PR; GRANT SELECT ON BD_PR TO PROCEDURE SP_ANALIZ_PR; GRANT SELECT ON BD_21 TO PROCEDURE SP_ANALIZ_PR; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR TO SYSDBA;17.7.5.1SP_ANALIZ_PRstock, bd_11.cena_pr_with_nds from bd_11 left join bd_pr on bd_pr.fk_bd_1=bd_11.fk_bd_1 where bd_11.fk_bd_1=new.field_key and bd_11.stock>0 --добавлено 10.5.2017 - исключены приходы по автопроизводству and (bd_pr.FK_BD_2_BASIS is null) --((bd_11.cod_prih<>8)or(exists(select field_key from bd_pr_product_track where fk_pr=bd_pr.field_key))) into :fk_11, :fk_tovar, :fk_mod, :stock, :cenapr do begin --для всех более поздних излишков на этом складе по этому товару/модификации, с которых что-то списано if (coalesce(:chk_izl_today,0)=0) then begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 left join bd_2 on bd_2.field_key=bd_1.fk_bd_2_7 where (bd_11.date_prih>=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 and coalesce(bd_2.cod_rash,0)<>7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 order by bd_21.cnt desc into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end else begin for select bd_11.field_key, bd_1.field_key, bd_11.track_11 from bd_11 join bd_1 on bd_1.FIELD_KEY=bd_11.FK_BD_1 left join bd_2 on bd_2.field_key=bd_1.fk_bd_2_7 where (bd_11.date_prih=new.date_prih) and bd_11.fk_bd_firm=new.fk_bd_firm and fk_bd_tovar=:fk_tovar and bd_11.fk_supplier=new.fk_bd_firm and bd_11.valid_flag=1 and cnt>stock and bd_1.cod_prih=7 and coalesce(bd_2.cod_rash,0)<>7 order by bd_1.date_prih into :fk_11_7 , :fk_bd_1_7, :track11_7 do begin update bd_11 set track_11=:track11_7 where field_key=:fk_11; --берем расходы по этому приходу for select bd_21.field_key, bd_21.cnt, bd_21.fk_bd_2, bd_21.fk_bd_22, bd_21.CENA_WITH_NDS, bd_21.CENA_WITHOUT_NDS, bd_21.FK_TOVAR_NABOR_MASTER, bd_21.CNT_IN_INPLACE, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, bd_21.AKC_FLAG, bd_21.SP_AKC_FLAG, bd_21.FK_BD_TOVAR_MOD from bd_21 where fk_bd_11=:fk_11_7 order by bd_21.cnt desc into :fk_bd_21, :cnt_21, :fk_bd_2, :fk_bd_22, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod do begin if (stock>0) then begin if (cnt_21<=stock) then --если новый приход полностью компенсирует количество в расход begin update bd_21 set fk_bd_11=:fk_11 where field_key=:fk_bd_21; update bd_22 set fk_bd_11=:fk_11 where fk_bd_2=:fk_bd_2 and fk_bd_11=:fk_11_7; stock=stock-cnt_21; end else begin --иначе (количество в расход больше остатка в новом приходе) дробим строку расхода на две части, новую привязываем к приходу, --в старой уменьшаем количество update bd_21 set cnt=(:cnt_21-:stock), summa=(:cnt_21-:stock)*cena_with_nds where field_key=:fk_bd_21; summa_man=summa_man-(cnt_21-stock)*cena_with_nds; insert into bd_21(fk_bd_2, fk_bd_11, fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd_2, :fk_11, :fk_bd_22, :stock, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag, :fk_bd_mod); stock=0; end end end --обновляем излишки update bd_11 set cnt=cnt-stock where field_key=:fk_11_7; update bd_11 set summa_with_nds=cnt*cena_pr_with_nds where field_key=:fk_11_7; update bd_11 set summa_without_nds=summa_with_nds/(100.00+nds)*100.00 where field_key=:fk_11_7; update bd_11 set summa_nds=summa_with_nds-summa_without_nds where field_key=:fk_11_7; delete from bd_11 where cnt=0 and field_key=:fk_11_7; delete from bd_1 where field_key=:fk_bd_1_7 and not exists(select field_key from bd_11 where fk_bd_1=bd_1.field_key); end end execute procedure sp_bd_21_upd_pc(:fk_11,:cenapr); delete from Z_SELRECS where frmhandle=-100; end END^ SET TERM ; ^Изменен порядок перебора строк расхода, возвраты - в конце17.7.6.2ALTER TRIGGER TR_BD_1_CHECK_7  e [7/SET TERM ^ ; CREATE OR ALTER procedure SP_ANALIZ_PR_COMP ( FK_21 integer, CNT_IN decimal(7,3) = null) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2), COD_PRIH integer, CNT_TMP decimal(7,3), CNT_11_8 decimal(7,3)) as declare variable FK_11 integer; declare variable FK_1 integer; declare variable FK_2 integer; declare variable FK_21_2 integer; declare variable FK_11_6_MAIN integer; declare variable CNT_11 decimal(7,3); declare variable CNT_21 decimal(7,3); declare variable FK_2_TEST integer; begin select bd_21.fk_bd_tovar, bd_21.cnt, bd_21.cena_with_nds, bd_21.summa, bd_21.fk_bd_11, bd_11.cod_prih, bd_11.fk_bd_1, bd_11.fk_bd_11_6_main, bd_21.fk_bd_2 from bd_21 left join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.field_key=:fk_21 into :fk_bd_tovar, :cnt, :price, :summa, :fk_11, :cod_prih, :fk_1, :fk_11_6_main, :fk_2_test; if (cnt_in is not null) then begin cnt_tmp=:cnt_in; /*if (cod_prih=8) then cnt_tmp=:cnt; */ end else cnt_tmp=:cnt; if (exists(select field_key from bd_pr where fk_bd_2=:fk_2_test)) then begin select sum(cnt) from bd_11 where fk_bd_1=(select fk_bd_1 from bd_pr where fk_bd_2=:fk_2_test) into :cnt_11_8; cnt=:cnt/:cnt_11_8*:cnt_tmp; end if (cod_prih=8) then begin select fk_bd_2 from bd_pr where fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa, sp.cnt_11_8 from sp_analiz_pr_comp(:fk_21_2, :cnt_tmp) sp into :fk_bd_tovar, :cnt, :price, :summa, :cnt_11_8 do suspend; end end else suspend; end else if (fk_11_6_main is not null) then begin select fk_bd_1 from bd_11 where field_key=:fk_11_6_main into :fk_1; select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key, bd_21.cnt from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2, :cnt_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa, sp.cnt_11_8 from sp_analiz_pr_comp(:fk_21_2, :cnt_tmp) sp into :fk_bd_tovar, :cnt, :price, :summa, :cnt_11_8 do suspend; end end else suspend; end else suspend; end^ SET TERM ; ^Расчет сырья для отчета исправления алгоритма17.7.11.1SP_ANALIZ_PR_COMP\ M/5UPDATE OR INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('ЕГАИС ТТН', 'tfrmegais_rash', 56) MATCHING (FORMCLASS_NAME);ЕГАИС ТТН17.7.10.1BD_SMARTPRINT_REZHIMn k1=ALTER TABLE BD_USER_PROC ADD priority Integer;приоритет17.7.8.1ALTER TABLE BD_USER_PROCr k9=ALTER TABLE BD_USER_PROC ADD location Integer;до или после17.7.8.1ALTER TABLE BD_USER_PROCt q7=ALTER TABLE BD_USER_PROC ADD type_events Integer;тип события17.7.8.1ALTER TABLE BD_USER_PROC  b CE5UPDATE OR INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('ЕГАИС ТТН', 'tfrmegais', 56) MATCHING (FORMCLASS_NAME);Печать из егаис17.7.14.1BD_SMARTPRINT_REZHIMy SALTER TABLE BD_EGAIS_DOC_TYPES ADD ENG_NAME_OLD VARCHAR(100); update BD_EGAIS_DOC_TYPES set ENG_NAME_OLD=ENG_NAME; update BD_EGAIS_DOC_TYPES set ENG_NAME_OLD='WayBill' where ENG_NAME='WayBill_v2'; update BD_EGAIS_DOC_TYPES set ENG_NAME_OLD='FORMBREGINFO' where ENG_NAME='FORM2REGINFO'; update BD_EGAIS_DOC_TYPES set ENG_NAME_OLD='WayBillAct' where ENG_NAME='WayBillAct_v2';поле для старых названий документов17.7.12.1BD_EGAIS_DOC_TYPES ADD ENG_NAME_OLD c/ALTER TABLE BD_21 ADD cnt_inplace Integer;количество коробок для аналогии с bd_2217.7.12.1ALTER TABLE BD_21z E%SET TERM ^ ; CREATE OR ALTER procedure SP_ANALIZ_PR ( DATE_START date, DATE_END date, FK_TOVAR integer) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2)) as declare variable FK_1 integer; declare variable FK_11 integer; declare variable FK_2 integer; declare variable FK_21 integer; begin for select bd_11.field_key, bd_11.fk_bd_1 from bd_11 where bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end and bd_11.valid_flag=1 and bd_11.cod_prih=8 into :fk_11, :fk_1 do begin select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 into :fk_2; for select bd_21.field_key from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.fk_bd_2=:fk_2 into :fk_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.cnt*sp.price --sp.summa from sp_analiz_pr_comp(:fk_21) sp into :fk_bd_tovar, :cnt, :price, :summa do suspend; end end end^ SET TERM ; ^перекомпиляция17.7.11.1SP_ANALIZ_PR PP,  /SET TERM ^ ; create or alter procedure SP_ANALIZ_PR_COMP ( FK_21 integer, CNT_IN decimal(7,3) = null) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2), COD_PRIH integer, CNT_TMP decimal(7,3), CNT_11_8 decimal(7,3)) as declare variable FK_11 integer; declare variable FK_1 integer; declare variable FK_2 integer; declare variable FK_21_2 integer; declare variable FK_11_6_MAIN integer; declare variable CNT_11 decimal(7,3); declare variable CNT_21 decimal(7,3); declare variable FK_2_TEST integer; begin select bd_21.fk_bd_tovar, bd_21.cnt, bd_21.cena_with_nds, bd_21.summa, bd_21.fk_bd_11, bd_11.cod_prih, bd_11.fk_bd_1, bd_11.fk_bd_11_6_main, bd_21.fk_bd_2 from bd_21 left join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.field_key=:fk_21 into :fk_bd_tovar, :cnt, :price, :summa, :fk_11, :cod_prih, :fk_1, :fk_11_6_main, :fk_2_test; if (cnt_in is not null) then begin cnt_tmp=:cnt_in; /*if (cod_prih=8) then cnt_tmp=:cnt; */ end else cnt_tmp=:cnt; if ((exists(select field_key from bd_pr where fk_bd_2=:fk_2_test))and(cnt_in is not null)) then begin select sum(cnt) from bd_11 where fk_bd_1=(select fk_bd_1 from bd_pr where fk_bd_2=:fk_2_test) into :cnt_11_8; if (coalesce(:cnt_11_8, 0)>0) then cnt=:cnt/:cnt_11_8*:cnt_tmp; end if (cod_prih=8) then begin select fk_bd_2 from bd_pr where fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa, sp.cnt_11_8 from sp_analiz_pr_comp(:fk_21_2, :cnt_tmp) sp into :fk_bd_tovar, :cnt, :price, :summa, :cnt_11_8 do suspend; end end else suspend; end else if (fk_11_6_main is not null) then begin select fk_bd_1 from bd_11 where field_key=:fk_11_6_main into :fk_1; select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key, bd_21.cnt from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2, :cnt_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa, sp.cnt_11_8 from sp_analiz_pr_comp(:fk_21_2, :cnt_tmp) sp into :fk_bd_tovar, :cnt, :price, :summa, :cnt_11_8 do suspend; end end else begin suspend; end end else suspend; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_21 TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT SELECT ON BD_11 TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT SELECT ON BD_PR TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR_COMP; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR_COMP; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO SYSDBA;17.7.17.1SP_ANALIZ_PR_COMP  l  %SET TERM ^ ; create or alter procedure SP_ANALIZ_PR ( DATE_START date, DATE_END date, FK_TOVAR integer) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2)) as declare variable FK_1 integer; declare variable FK_11 integer; declare variable FK_2 integer; declare variable FK_21 integer; begin for select bd_11.field_key, bd_11.fk_bd_1 from bd_11 where bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end and bd_11.valid_flag=1 and bd_11.cod_prih=8 into :fk_11, :fk_1 do begin select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 into :fk_2; for select bd_21.field_key from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.fk_bd_2=:fk_2 into :fk_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.cnt*sp.price --sp.summa from sp_analiz_pr_comp(:fk_21) sp into :fk_bd_tovar, :cnt, :price, :summa do suspend; end end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_11 TO PROCEDURE SP_ANALIZ_PR; GRANT SELECT ON BD_PR TO PROCEDURE SP_ANALIZ_PR; GRANT SELECT ON BD_21 TO PROCEDURE SP_ANALIZ_PR; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR_COMP TO PROCEDURE SP_ANALIZ_PR; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_ANALIZ_PR TO SYSDBA;17.7.17.1SP_ANALIZ_PR ^  %SET TERM ^ ; CREATE OR ALTER procedure SP_ANALIZ_PR ( DATE_START date, DATE_END date, FK_TOVAR integer) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2)) as declare variable FK_1 integer; declare variable FK_11 integer; declare variable FK_2 integer; declare variable FK_21 integer; begin for select bd_11.field_key, bd_11.fk_bd_1 from bd_11 where bd_11.fk_bd_tovar=:fk_tovar and bd_11.date_prih between :date_start and :date_end and bd_11.valid_flag=1 and bd_11.cod_prih=8 into :fk_11, :fk_1 do begin select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 into :fk_2; for select bd_21.field_key from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.fk_bd_2=:fk_2 into :fk_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.cnt*sp.price --sp.summa from sp_analiz_pr_comp(:fk_21) sp into :fk_bd_tovar, :cnt, :price, :summa do suspend; end end end^ SET TERM ; ^17.7.17.2SP_ANALIZ_PR  S /SET TERM ^ ; CREATE OR ALTER procedure SP_ANALIZ_PR_COMP ( FK_21 integer, CNT_IN decimal(7,3) = null) returns ( FK_BD_TOVAR integer, CNT decimal(7,3), PRICE decimal(12,2), SUMMA decimal(12,2), COD_PRIH integer, CNT_TMP decimal(7,3), CNT_11_8 decimal(7,3)) as declare variable FK_11 integer; declare variable FK_1 integer; declare variable FK_2 integer; declare variable FK_21_2 integer; declare variable FK_11_6_MAIN integer; declare variable CNT_11 decimal(7,3); declare variable CNT_21 decimal(7,3); declare variable FK_2_TEST integer; begin select bd_21.fk_bd_tovar, bd_21.cnt, bd_21.cena_with_nds, bd_21.summa, bd_21.fk_bd_11, bd_11.cod_prih, bd_11.fk_bd_1, bd_11.fk_bd_11_6_main, bd_21.fk_bd_2 from bd_21 left join bd_11 on bd_11.field_key=bd_21.fk_bd_11 where bd_21.field_key=:fk_21 into :fk_bd_tovar, :cnt, :price, :summa, :fk_11, :cod_prih, :fk_1, :fk_11_6_main, :fk_2_test; if (cnt_in is not null) then begin cnt_tmp=:cnt_in; /*if (cod_prih=8) then cnt_tmp=:cnt; */ end else cnt_tmp=:cnt; if ((exists(select field_key from bd_pr where fk_bd_2=:fk_2_test and pr_is_sbor=1))and(cnt_in is not null)) then begin select sum(cnt) from bd_11 where fk_bd_1=(select fk_bd_1 from bd_pr where fk_bd_2=:fk_2_test and pr_is_sbor=1) into :cnt_11_8; if (coalesce(:cnt_11_8, 0)>0) then cnt=:cnt/:cnt_11_8*:cnt_tmp; end if (cod_prih=8) then begin select fk_bd_2 from bd_pr where fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa, sp.cnt_11_8 from sp_analiz_pr_comp(:fk_21_2, :cnt_tmp) sp into :fk_bd_tovar, :cnt, :price, :summa, :cnt_11_8 do suspend; end end else suspend; end else if (fk_11_6_main is not null) then begin select fk_bd_1 from bd_11 where field_key=:fk_11_6_main into :fk_1; select bd_pr.fk_bd_2 from bd_pr where bd_pr.fk_bd_1=:fk_1 and pr_is_sbor=1 into :fk_2; if (fk_2 is not null) then begin for select bd_21.field_key, bd_21.cnt from bd_21 where bd_21.fk_bd_2=:fk_2 into :fk_21_2, :cnt_21 do begin for select sp.fk_bd_tovar, sp.cnt, sp.price, sp.summa, sp.cnt_11_8 from sp_analiz_pr_comp(:fk_21_2, :cnt_tmp) sp into :fk_bd_tovar, :cnt, :price, :summa, :cnt_11_8 do suspend; end end else begin suspend; end end else suspend; end^ SET TERM ; ^17.7.17.2SP_ANALIZ_PR_COMP *w*I -9#SET TERM ^ ; CREATE OR ALTER trigger bd_ch21_ai0 for bd_ch21 active after insert position 0 AS declare variable new_rev_form type of column global_options.paramvalue; declare variable date_ch date; declare variable fk_firm integer; declare variable fk_9 integer; declare variable date_rev date; declare variable ts_ch_close timestamp; begin select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('new_revision_form') into :new_rev_form; if ((trim(new_rev_form)='1')and(coalesce(new.canceled,0)=0)) then begin select bd_ch2.date_close, bd_ch2.fk_bd_firm, cast(bd_ch2.date_close+bd_ch2.time_close as timestamp) from bd_ch2 where field_key = new.fk_bd_ch2 into :date_ch, :fk_firm, :ts_ch_close; fk_9=null; select first 1 field_key, date_rev from bd_9 where fk_bd_firm=:fk_firm and :date_ch between bd_9.date_from and bd_9.date_rev and (fk_bd_1 is null and fk_bd_2 is null) into :fk_9, :date_rev; if (fk_9 is not null) then begin update bd_91 set bd_91.count_real=IIF((coalesce(bd_91.ts_upd_count_real,current_timestamp-1000)<=:ts_ch_close),iif(coalesce(bd_91.count_real,0)-new.cnt>=0,coalesce(bd_91.count_real,0)- new.cnt,0),bd_91.count_real), bd_91.ch_period=iif(:date_ch<>:date_rev,coalesce(bd_91.ch_period,0)+new.cnt,coalesce(bd_91.ch_period,0)), bd_91.ch_day=iif(:date_ch=:date_rev,coalesce(bd_91.ch_day,0)+new.cnt,coalesce(bd_91.ch_day,0)), bd_91.ch_sum=coalesce(bd_91.ch_sum,0)+coalesce(new.cena, 0)* new.cnt where bd_91.fk_bd_9=:fk_9 and bd_91.fk_bd_tovar=new.fk_bd_tovar; end end end^ SET TERM ; ^При скачке чеков, не учитывать отмененые позиции, который обрабатывает ревизию ИГ17.7.18.1bd_ch21_ai0}mALTER TABLE BD_CH21 ADD CANCELED BOOLFIELD DEFAULT 0 ;признак отмененой позиции17.7.18.1BD_CH21cena, :fk_bd_kassa, :in_115_cena; if (fk_bd_kassa is not null) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt=1000 and cast(bd_ch2.date_open||' '||bd_ch2.time_open as timestamp)>:last_ts_ch order by bd_ch2.date_open, bd_ch2.time_open into :last_num_sh do discount=:discount+1; if (last_num_sh is not null) then begin if (discount>10) then discount=10; update bd_disc_card set bd_ch2_nomer_sh=:last_num_sh, discount=:discount where idcard=:idcard; end suspend; end discount=0; num_sh=null; end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT,UPDATE ON BD_DISC_CARD TO PROCEDURE SET_DISCOUNT_PERCENT; GRANT SELECT ON BD_CH2 TO PROCEDURE SET_DISCOUNT_PERCENT; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SET_DISCOUNT_PERCENT TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SET_DISCOUNT_PERCENT TO SYSDBA;Процедура установки скидки для диск.карт на которые были чеки с суммой более или равно 100017.7.29.1SET_DISCOUNT_PERCENT is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11 do begin if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к нй строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt=grt90.lb and bd_tovar.grp_rb<=grt90.rb) or(bd_tovar.grp_lb>=grt100.lb and bd_tovar.grp_rb<=grt100.rb) or(bd_tovar.grp_lb>=grt101.lb and bd_tovar.grp_rb<=grt101.rb)) group by 1,2,3 order by 1,3 into :main_grt_name, :fk_grt, :grt_name, :sum_stock1, :sum_stock2 do begin select sum(iif(bd_21.cod_rash in (0,2,3) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,bd_21.summa,0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,abs(bd_21.summa),0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm=195,bd_21.summa,0)) summa_spisanie_all from bd_21 join bd_tovar on bd_21.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_21.fk_bd_11_6 is null and bd_21.date_rash between :date_start and :date_end into :sum_all; select sum(bd_11.summa_with_nds) from bd_11 join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_11.fk_bd_21_6 is null and bd_11.date_prih between :date_start and :date_end and bd_11.cod_prih in (0,1,2,3,4) into :sum_prih; select sum(bd_11.summa_with_nds) from bd_11 join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_11.fk_bd_21_6 is not null and bd_11.date_prih between :date_start and :date_end into :sum_prih_6; select sum(bd_21.summa) from bd_21 join bd_tovar on bd_21.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_21.fk_bd_11_6 is not null and bd_21.date_rash between :date_start and :date_end into :sum_rash_6; sum_dvig=coalesce(:sum_stock1,0)+coalesce(:sum_prih,0)-coalesce(:sum_stock2,0)-coalesce(:sum_rash_6,0)+coalesce(:sum_prih_6,0); sum_dohod=coalesce(:sum_all,0)-coalesce(:sum_dvig,0); perc_dohod=iif(:sum_dohod_total<>0,:sum_dohod*100.00/:sum_dohod_total,0); oborot=iif(:sum_dvig<>0,:sum_dohod/:sum_dvig,0); suspend; end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_TOVAR TO PROCEDURE REP_KRIMMEAT; GRANT SELECT ON BD_GRT_TOVAR TO PROCEDURE REP_KRIMMEAT; GRANT SELECT ON BD_STOCK TO PROCEDURE REP_KRIMMEAT; GRANT SELECT ON BD_21 TO PROCEDURE REP_KRIMMEAT; GRANT SELECT ON BD_11 TO PROCEDURE REP_KRIMMEAT; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE REP_KRIMMEAT TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE REP_KRIMMEAT TO SYSDBA;отчет свод по группам17.8.10.1REP_KRIMMEAT  3[%SET TERM ^ ; create or alter procedure REP_KRIMMEAT ( DATE_START date, DATE_END date) returns ( MAIN_GRT_NAME varchar(100), GRT_NAME varchar(100), SUM_STOCK1 decimal(12,3), SUM_STOCK2 decimal(12,3), SUM_PRIH decimal(12,3), SUM_PRIH_6 decimal(12,3), SUM_RASH_6 decimal(12,3), SUM_ALL decimal(12,3), SUM_DVIG decimal(12,3), SUM_DOHOD_TOTAL decimal(12,3), SUM_DOHOD decimal(12,3), PERC_DOHOD decimal(12,3), OBOROT decimal(12,3), FK_GRT integer) as declare variable LB integer; declare variable RB integer; begin select sum(stk1.stock*bd_tovar.last_cena_pr) sum_stock1, sum(stk2.stock*bd_tovar.last_cena_pr) sum_stock2 from bd_tovar join bd_grt_tovar on bd_grt_tovar.field_key=bd_tovar.fk_grt join bd_grt_tovar grt90 on grt90.field_key=90 join bd_grt_tovar grt100 on grt100.field_key=100 join bd_grt_tovar grt101 on grt101.field_key=101 left join bd_stock stk1 on stk1.fk_bd_tovar=bd_tovar.field_key and stk1.date_morning=:date_start left join bd_stock stk2 on stk2.fk_bd_tovar=bd_tovar.field_key and stk2.date_morning=:date_end where ((bd_tovar.grp_lb>=grt90.lb and bd_tovar.grp_rb<=grt90.rb) or(bd_tovar.grp_lb>=grt100.lb and bd_tovar.grp_rb<=grt100.rb) or(bd_tovar.grp_lb>=grt101.lb and bd_tovar.grp_rb<=grt101.rb)) into :sum_stock1, :sum_stock2; select sum(iif(bd_21.cod_rash in (0,2,3) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,bd_21.summa,0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,abs(bd_21.summa),0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm=195,bd_21.summa,0)) from bd_21 where bd_21.fk_bd_11_6 is null and bd_21.date_rash between :date_start and :date_end into :sum_all; select sum(bd_11.summa_with_nds) from bd_11 where bd_11.fk_bd_21_6 is null and bd_11.date_prih between :date_start and :date_end and bd_11.cod_prih in (0,1,2,3,4) into :sumDATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; -- отменненые позиции ставим обработанными for select field_key from bd_ch2 where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and (date_close<=:withtoday) and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0) into :fk_ch2_tmp do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0; if (not exists(select field_key from bd_ch21 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.accept_flag,0)=0)) then update bd_ch2 set accept_flag=1 where field_key=:fk_ch2_tmp; end for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa,0)<>0)or(coalesce(summa_disc,0)=coalesce(summa_all,0))) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^не учитывать отмененые позиции при переводе чеков в расход17.8.15.1SP_CH_TO_RASH_22_OP nO+ % #MGSET TERM ^ ; CREATE TRIGGER TR_RESERV_CASH FOR BD_ORDER_OUT_1 ACTIVE AFTER UPDATE POSITION 0 AS BEGIN update BD_11_RESERV r set r.LASTDATE=new.DATE_DELIVERY, r.fk_poluchatel=new.FK_RECIPIENT where r.TYPE_DOC=4 and r.fk_doc=new.FIELD_KEY; END^ SET TERM ; ^апдейт кеша получателя и даты при изменении в заявке17.8.17.1CREATE TRIGGER TR_RESERV_CASH $ g=ALTER TABLE BD_11_RESERV ADD fk_doc Integer;Ссылка на документ-основание резерва17.8.17.1ALTER TABLE BD_11_RESERV}#uC=ALTER TABLE BD_11_RESERV ADD fk_poluchatel Integer;кеш получатель17.8.17.1ALTER TABLE BD_11_RESERV"e]=ALTER TABLE BD_11_RESERV ADD lastdate Date;Дата действия резерва17.8.17.1ALTER TABLE BD_11_RESERV!cCALTER TABLE BD_ORDER_OUT_11 ADD cnt_reserv Decimal(7,3);Общий резерв по позиции17.8.17.1ALTER TABLE BD_ORDER_OUT_11 ae3SET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; declare variable FK_CH2_TMP integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday= end fk=GEN_ID(GEN_BD_ORDER_OUT_1_ID,1); select coalesce(max(nomer_shet+1),1) from BD_ORDER_OUT_1 join BD_FIRM on bd_firm.field_key=bd_order_out_1.fk_bd_firm where bd_firm.fk_selful=(select fk_selful from bd_firm where field_key=:fk_post) into :nomer_shet; INSERT INTO BD_ORDER_OUT_1 (FIELD_KEY, NOMER_SHET, FK_BD_FIRM, DATE_ORDER, TIME_ORDER, DATE_DELIVERY, NABOR_FLAG, FK_RECIPIENT, FK_BD_ORDER_IN_1, in_prih_price, cod_rash, day_cons_rash, fk_selful, fk_pfirm_recipient, BD_ORDER_OUT_1.MARGIN, BD_ORDER_OUT_1.DISCOUNT, BD_ORDER_OUT_1.FK_BD_CENA, prim) VALUES (:fk, :nomer_shet, :fk_post, current_date, current_time, :date_del, 0, :fk_zak, :id_zakaz, :in_prih_price, :cod_rash, :day_cons_rash, -- (select fk_selful from bd_firm where field_key=:fk_zak), (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_zak), :margin, :discount, :fk_bd_cena, :prim); --было ошибочное копирование юрлица из заказа в заявку (select fk_selful from bd_firm where field_key=:fk_post), (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_zak), :margin, :discount, :fk_bd_cena, :prim); for SELECT fk_bd_tovar, cnt, bd_order_in_11.cnt_11, BD_ORDER_IN_11.CENA_PR_WITH_NDS, BD_ORDER_IN_11.SUMMA_WITH_NDS, fk_bd_11, bd_order_in_11.inplace from BD_ORDER_IN_11 where fk_bd_order_in_1=:id_zakaz INTO :fk_tovar, :kolvo, :kolvo11, :cena_nds, :sum_nds, :fk_11, :inplace do BEGIN if ((coalesce(fk_11,0)=0)or(kolvo110 and bd_11.PRIORITY>0 and valid_flag=1 order by date_prih, fk_bd_1 into :fk_bd_11, :stock do begin if (cnt_ost>0) then begin if (stock>cnt_ost) then begin INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,fk_poluchatel) VALUES (:fk_bd_11, :fk_o_11,:cnt_ost, 4, :fk, :fk_zak); cnt_ost=0; end else begin cnt_ost=cnt_ost-stock; INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,fk_poluchatel) VALUES (:fk_bd_11, :fk_o_11,:stock, 4, :fk, :fk_zak); end end end if (cnt_ost>0) then --Не все распределилось по приходам begin --сохраняем запись select trim(name) from bd_tovar where field_key=:fk_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках на базе с учетом резервов',:lang))||': '||(:kolvo-:cnt_ost)||', '||(select TR_NAME from SP_TRANSLATE(' в заказе',:lang))||': '||kolvo||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||cnt_ost; INSERT INTO BD_order_in_RESULTSEND (FK_BD_order_in_1, TXT_MSG, FK_BD_TOVAR, CNT_order_in, CNT_11, CNT_MINUS) VALUES (:ID_ZAKAZ,:result_txt,:FK_TOVAR,:kolvo,(:kolvo+:cnt_ost),:cnt_ost); end end END update bd_order_in_1 set SEND_FLAG=1, received_flag=1 where field_key=:id_zakaz; END END ^ SET TERM ; ^В резерве по заказу поставщика - заполнение типа документа и документа17.8.17.1ALTER PROCEDURE SP_SEND_ZAKPOST 7' o!USET TERM ^ ; create PROCEDURE sp_set_reserv_by_oo ( fk_order_out integer) RETURNS ( fk_tovar integer, name_tovar type of column bd_tovar.name, cnt_zakaz decimal(15,3), cnt_stock decimal(15,3), cnt_minus decimal(15,3) ) AS DECLARE VARIABLE fk_rec integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE rez_allow integer; DECLARE VARIABLE z_rez_flag integer; DECLARE VARIABLE lastdate date; DECLARE VARIABLE fk_oo11 integer; DECLARE VARIABLE fk_11 integer& 9KSET TERM ^ ; ALTER PROCEDURE SP_SEND_ZAKPOST ( ID_ZAKAZ Integer, LANG Varchar(2) DEFAULT 'RU' ) AS declare variable FK integer; declare variable FK_ZAK integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable FK_POST integer; declare variable DATE_ZAK date; declare variable DATE_DEL date; declare variable TIME_ZAK time; declare variable FK_TOVAR integer; declare variable KOLVO decimal(7,3); declare variable CENA_NDS decimal(8,2); declare variable SUM_NDS decimal(8,2); declare variable FK_11 integer; declare variable KOLVO11 decimal(7,3); declare variable NOMER_SPEC NOMER_SPEC; declare variable DATE_SPEC date; declare variable FK_SELFUL integer; declare variable FK_PFIRM integer; declare variable NOMER_SHET integer; declare variable CNT_OST decimal(7,3); declare variable STOCK decimal(7,3); declare variable FK_O_11 integer; declare variable FK_BD_11 integer; declare variable COD_RASH integer; declare variable IN_PRIH_PRICE integer; declare variable COD_PRIH integer; declare variable DAY_CONS_PRIH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_CENA integer; declare variable MARGIN type of column BD_DOGOVOR.MARGIN; declare variable DISCOUNT type of column BD_DOGOVOR.DISCOUNT; declare variable FK_DOGOVOR integer; declare variable RESULT_TXT varchar(1000); declare variable PRIM type of column BD_ORDER_OUT_1.PRIM; declare variable ZAYAVKA_RESERV type of column BD_FIRM.ZAYAVKA_RESERV_FLAG; BEGIN delete from BD_order_in_RESULTSEND where fk_bd_order_in_1=:ID_ZAKAZ; for select BD_ORDER_IN_1.FK_BD_FIRM, BD_ORDER_IN_1.FK_SUPPLIER, BD_ORDER_IN_1.DATE_ORDER, BD_ORDER_IN_1.DATE_DELIVERY, BD_ORDER_IN_1.TIME_ORDER, bd_order_in_1.fk_pfirm_supplier, BD_ORDER_IN_1.COD_PRIH, BD_ORDER_IN_1.DAY_CONS_PRIH, substring(BD_ORDER_IN_1.PRIM from 1 for 200) , BD_FIRM.zayavka_reserv_flag from BD_ORDER_IN_1 join bd_firm on bd_firm.field_key=BD_ORDER_IN_1.FK_SUPPLIER where BD_ORDER_IN_1.field_key=:id_zakaz into :fk_zak, :fk_post, :date_zak, :date_del, :time_zak, :fk_pfirm, :cod_prih, :day_cons_prih, :prim , :zayavka_reserv do BEGIN --переводим код прихода в код расхода --cod_rash=(select bd_cod_rash.FIELD_KEY from BD_COD_RASH where BD_COD_RASH.COD_PRIH_6=:cod_prih); --ищем условия расхода по договорам fk_dogovor=null; cod_rash=null; day_cons_rash=null; margin=null; discount=null; fk_bd_cena=null; in_prih_price=null; select first 1 d.field_key, d.COD_RASH, day_cons_rash, d.DISCOUNT, d.MARGIN, d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:fk_zak and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:fk_post) and d.valid_flag=1 into :fk_dogovor, :cod_rash, :day_cons_rash, :discount, :margin ,:fk_bd_cena, :in_prih_price; if (fk_dogovor is null) then --договора нет, тогда берем из заказа в приходных ценах begin cod_rash=(select bd_cod_rash.FIELD_KEY from BD_COD_RASH where BD_COD_RASH.COD_PRIH_6=:cod_prih); day_cons_rash=day_cons_prih; in_prih_price=1; margin=0; discount=0; ; DECLARE VARIABLE cnt_ost decimal(15,3); DECLARE VARIABLE curr_cnt_rezerv decimal(15,3); DECLARE VARIABLE fk_bd_11 integer; DECLARE VARIABLE fk_res integer; DECLARE VARIABLE cnt_res decimal(15,3); BEGIN --проверки на необходимость резервирования --if (exists(select first 1 field_key from BD_11_RESERV r where r.TYPE_DOC=4 and r.FK_DOC=:fk_order_out)) then exit; select oo.FK_RECIPIENT, oo.DATE_DELIVERY, coalesce(p.REZERV_ALLOW_FLAG,0), coalesce(f.ZAYAVKA_RESERV_FLAG,0), oo.FK_BD_FIRM from BD_ORDER_OUT_1 oo join bd_firm p on p.FIELD_KEY=oo.FK_RECIPIENT join bd_firm f on f.FIELD_KEY=oo.FK_BD_FIRM where oo.FIELD_KEY=:fk_order_out into :fk_rec, :lastdate, :rez_allow, :z_rez_flag, :fk_bd_firm; if (rez_allow=0) then exit; if (z_rez_flag=0) then exit; --резервируем for SELECT field_key, fk_bd_tovar, cnt, fk_bd_11, coalesce(cnt_reserv,0) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=:fk_order_out INTO :fk_oo11, :fk_tovar, :cnt_zakaz, :fk_11, :curr_cnt_rezerv do BEGIN if (curr_cnt_rezerv0 and bd_11.PRIORITY>0 and valid_flag=1 order by date_prih, fk_bd_1 into :fk_bd_11, :cnt_stock do begin if (cnt_ost>0) then begin if (cnt_stock>cnt_ost) then begin INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,lastdate) VALUES (:fk_bd_11, :fk_oo11,:cnt_ost, 4, :fk_order_out, :lastdate); cnt_ost=0; end else begin cnt_ost=cnt_ost-cnt_stock; INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,lastdate) VALUES (:fk_bd_11, :fk_oo11,:cnt_stock, 4, :fk_order_out, :lastdate); end if (fk_11 is not null) then update BD_ORDER_OUT_11 set fk_bd_11_rezerv=:fk_11 where field_key=:fk_oo11; end end if (cnt_ost>0) then --Не все распределилось по приходам begin --сохраняем запись cnt_stock=coalesce(cnt_stock,0); select trim(name) from bd_tovar where field_key=:fk_tovar into :name_tovar; cnt_minus=cnt_ost; suspend; end end else begin --количество в заказе меньше, чем зарезервировано cnt_ost=curr_cnt_rezerv-cnt_zakaz; for select field_key, cnt from BD_11_RESERV r where r.fk_bd_order_out_11=:fk_oo11 into :fk_res, :cnt_res do begin if (cnt_ost>0) then begin if (cnt_res>cnt_ost) then begin update BD_11_RESERV set cnt=cnt-:cnt_ost where field_key=:fk_res; cnt_ost=0; end else begin delete from BD_11_RESERV where field_key=:fk_res; cnt_ost=cnt_ost-cnt_res; end end end end END END^ SET TERM ; ^Установка резервов по заявке покупателя17.8.17.1create PROCEDURE sp_set_reserv_by_oo , ,6) )WcSET TERM ^ ; ALTER PROCEDURE SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ Integer, ID_SKLAD Integer, ID_POL Integer, ID_PPOL Integer, IN_PRIH_PRICE Integer, ID_CENA Integer, ID_DOG Integer DEFAULT null ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Float, CENA_NDS Float, CENA_NOT_NDS Float, SUMMA_NDS Float, SUMMA_NOT_NDS Float, STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, SELF_STOCK Decimal(7,3), AKC Integer, ED_IZM_NAME Char(30), OLDKEY Integer, PRIM11 Varchar(200) ) AS declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); declare variable curr_reserv decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.00) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN prim11=null; cnt=0; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(( ay;SET TERM ^ ; ALTER TRIGGER TR_REZERV INACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS DECLARE VARIABLE new_cnt DECIMAL(7,3); DECLARE VARIABLE old_cnt DECIMAL(7,3); BEGIN new_cnt=new.CNT; old_cnt=old.CNT; update bd_11 set rezerv=coalesce(rezerv,0)-:old_cnt where field_key=old.FK_BD_11_REZERV; update bd_11 set rezerv=coalesce(rezerv,0)+:new_cnt where field_key=new.FK_BD_11_REZERV; END^ SET TERM ; ^Деактивация старого триггера17.8.17.1ALTER TRIGGER TR_REZERV1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_not_nds; -- cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); -- cena_not_nds = coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); --находим количество из приходной накладной curr_reserv=coalesce((select cnt_reserv from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_11_REZERV=:fk_bd_11 and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz),0); stock=stock+curr_reserv; for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если резерв по позиции заказа уже имеется, плюсуем его к остатку --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; --cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END ^ SET TERM ; ^ при выводе остатка учитываем текущий резерв по позиции17.8.17.1ALTER PROCEDURE SP_GET_CURRSTATE_FOR_ZAKPOL 9 Z9-  O!UPDATE OR INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Ручная правка резервов', 'zakpol_rez_edit', (SELECT first 1 a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='zakazrecipient')) MATCHING (NAME_VAR); права на ручную правку резервов по заявке покупателя17.8.17.1праваz, 7oCSET TERM ^ ; ALTER PROCEDURE SP_BD2_PROV ( FK_BD2 Integer, LANG Varchar(2), CREATE_7 Integer, FK_USER Integer, IGNORE_NO_IZLISH_FLAG Integer DEFAULT 0 ) AS declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; /* coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) */ declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3);+ /GSET TERM ^ ; ALTER TRIGGER TR_BD_11_RESERV ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS declare variable fk_11 integer; declare variable fk_oo11 integer; BEGIN if (inserting or updating) then fk_11=new.FK_BD_11; if (deleting) then fk_11=old.FK_BD_11; update bd_11 set bd_11.REZERV=coalesce(bd_11.REZERV,0)-coalesce(old.CNT,0)+coalesce(new.CNT,0) where field_key=:fk_11; if (inserting or updating) then fk_oo11=new.FK_BD_ORDER_OUT_11; if (deleting) then fk_oo11=old.FK_BD_ORDER_OUT_11; if (old.cnt is distinct from new.cnt) then update bd_order_out_11 oo set oo.CNT_RESERV=coalesce(CNT_RESERV,0)-coalesce(old.CNT,0)+coalesce(new.CNT,0) where field_key=:fk_oo11; END^ SET TERM ; ^ Обновляем резерв в позиции заявке при изменении в таблице резервов17.8.17.1ALTER TRIGGER TR_BD_11_RESERV* uyCSET TERM ^ ; ALTER TRIGGER TR_REZERV_UPD ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN if (old.FK_BD_OUT_1 is distinct from new.FK_BD_OUT_1) then begin update BD_11_RESERV r set r.FK_DOC=new.FK_BD_OUT_1, r.FK_POLUCHATEL=(select fk_recipient from BD_ORDER_OUT_1 where field_key=new.FK_BD_OUT_1) where r.FK_BD_ORDER_OUT_11=new.FIELD_KEY; end END^ SET TERM ; ^ Обновление получателя и документа при смене документа у позиции17.8.17.1ALTER TRIGGER TR_REZERV_UPD declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); declare variable cnt_reserv_11 decimal(8,3); declare variable cnt_reserv_rec decimal(8,3); declare variable fk_rec integer; declare variable fk_res integer; declare variable cnt_reserv_cancel decimal(8,3); declare variable cnt_res decimal(8,3); declare variable cnt_reserv_pr decimal(8,3); BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11;  cnt_11_stock=cnt_11_stock-cnt_reserv_11; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем резервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cntnew.FIELD_KEY),0); if (new.cnt>stock_11+cnt_old_reserv) then exception E_RESERV_11; end END^ SET TERM ; ^контроль резерва на превышение17.8.17.1create TRIGGER TR_BD_11_RESERV_STOCK2.   ECREATE EXCEPTION e_reserv_11 'Нельзя зарезервировать больше, чем есть на остатках';17.8.17.1CREATE EXCEPTION e_reserv_11etxt,tablename,fk_table) values (:fkaudit,'FIRM',null,(select name from bd_firm where field_key=new.fk_bd_firm),'Склад','BD_2',new.field_key); end if (new.nomer_rash is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'NOMER_RASH',null,new.nomer_rash,'BD_2',new.field_key,'Номер расхода'); if (new.date_rash is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'DATE_RASH',null,new.date_rash,'BD_2',new.field_key,'Дата расхода'); if (new.nomer_nakl is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'NOMER_NAKL',null,new.nomer_nakl,'BD_2',new.field_key,'Номер накладной'); if (new.date_nakl is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'DATE_NAKL',null,new.date_nakl,'BD_2',new.field_key,'Дата накладной'); if (new.fk_recipient is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_RECIPIENT',null,new.fk_recipient,'BD_2',new.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'RECIPIENT',null,(select name from bd_firm where field_key=new.fk_recipient),'Получатель','BD_2',new.field_key); end if (new.fk_face is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_FACE',null,new.fk_face,'BD_2',new.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'FACE',null,(select name from bd_face where field_key=new.fk_face),'Через кого','BD_2',new.field_key); end if (new.cod_rash is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'COD_RASH',null,new.cod_rash,'BD_2',new.field_key,'Код расхода'); if (new.summa is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'SUMMA',null,new.summa,'BD_2',new.field_key,'Сумма'); if (new.COMM_RASPROV is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'COMM_RASPROV',null,new.COMM_RASPROV,'BD_2',new.field_key,'Распроведено с примечанием'); end if (updating) then begin if (not((coalesce(old.FK_BD_FIRM,0)<>coalesce(new.FK_BD_FIRM,0))or(coalesce(old.NOMER_RASH,0)<>coalesce(new.NOMER_RASH,0)) or(coalesce(old.DATE_RASH,'1.1.1900')<>coalesce(new.DATE_RASH,'1.1.1900')) or(coalesce(old.NOMER_NAKL,'')<>coalesce(new.NOMER_NAKL,'')) or(coalesce(old.DATE_NAKL,'1.1.1900')<>coalesce(new.DATE_NAKL,'1.1.1900')) or(coalesce(old.FK_RECIPIENT,0)<>coalesce(new.FK_RECIPIENT,0)) or(coalesce(old.COD_RASH,0)<>coalesce(new.COD_RASH,0))or(coalesce(old.valid_flag,0)<>coalesce(new.valid_flag,0)))) then exit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_2',new.field_key,'U',current_user,current_date,current_time, new.FK_BD_FIRM) matching (tablename, fk_table, operation, login, date_change) returning (field_key) into :fkaudit; if ((new.fk_bd_firm is not null)and(new.fk_bd_firm<>old.fk_bd_firm)) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_BD_FIRM',old.fk_bd_firm,new.fk_bd_firm,'BD_2',new.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'FIRM',(select name from bd_firm where field_key=old.fk_bd_firm),(select name from bd_firm where field_key=new.fk_bd_firm),'Склад','BD_2',new.field_key); end if ((new.nomer_rash is not null)and(new.nomer_rash<>old.nomer_rash)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'NOMER_RASH',old.nomer_rash,new.nomer_rash,'BD_2',new.field_key,'Номер расхода'); if ((new.date_rash is not null)and(new.date_rash<>old.date_rash)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'DATE_RASH',old.date_rash,new.date_rash,'BD_2',new.field_key,'Дата расхода'); if ((new.nomer_nakl is not null)and(new.nomer_nakl<>old.nomer_nakl)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'NOMER_NAKL',old.nomer_nakl,new.nomer_nakl,'BD_2',new.field_key,'Номер накладной'); if ((new.date_nakl is not null)and(new.date_nakl<>old.date_nakl)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'DATE_NAKL',old.date_nakl,new.date_nakl,'BD_2',new.field_key,'Дата накладной'); if ((new.fk_recipient is not null)and(new.fk_recipient<>old.fk_recipient)) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_RECIPIENT',old.fk_recipient,new.fk_recipient,'BD_2',new.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'RECIPIENT',(select name from bd_firm where field_key=old.fk_recipient),(select name from bd_firm where field_key=new.fk_recipient),'Получатель','BD_2',new.field_key); end -- if ((new.fk_face is not null)and(new.fk_face<>old.fk_face)) then -- begin -- insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) -- values (:fkaudit,'FK_FACE',old.fk_face,new.fk_face,'BD_2',new.field_key); -- insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) -- values (:fkaudit,'FACE',(select name from bd_face where field_key=old.fk_face),(select name from bd_face where field_key=new.fk_face),'Через кого','BD_2',new.field_key); -- end if ((new.cod_rash is not null)and(new.cod_rash<>old.cod_rash)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'COD_RASH',old.cod_rash,new.cod_rash,'BD_2',new.field_key,'Код расхода'); -- if ((new.summa is not null)and(new.summa<>old.summa)) then -- insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) -- values (:fkaudit,'SUMMA',old.summa,new.summa,'BD_2',new.field_key,'Сумма'); if (new.VALID_FLAG is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table,fieldnametxt) values (:fkaudit,'VALID_FLAG',old.VALID_FLAG,new.VALID_FLAG,'BD_2',new.field_key,'Проведено'); if (new.COMM_RASPROV is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'COMM_RASPROV',old.COMM_RASPROV,new.COMM_RASPROV,'BD_2',new.field_key,'Распроведено с примечанием'); end if (deleting) then begin insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_2',old.field_key,'D',current_user,current_date,current_time, old.FK_BD_FIRM) returning (field_key) into :fkaudit; if (old.fk_bd_firm is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_BD_FIRM',old.fk_bd_firm,null,'BD_2',old.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'FIRM',(select name from bd_firm where field_key=old.fk_bd_firm),null,'Склад','BD_2',old.field_key); end if (old.nomer_rash is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'NOMER_RASH',old.nomer_rash,null,'BD_2',old.field_key,'Номер расхода'); if (old.date_rash is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'DATE_RASH',old.date_rash,null,'BD_2',old.field_key,'Дата расхода'); if (old.nomer_nakl is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'NOMER_NAKL',old.nomer_nakl,null,'BD_2',old.field_key,'Номер накладной'); if (old.date_nakl is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'DATE_NAKL',old.date_nakl,null,'BD_2',old.field_key,'Дата накладной'); if (old.fk_recipient is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_RECIPIENT',old.fk_recipient,null,'BD_2',old.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'RECIPIENT',(select name from bd_firm where field_key=old.fk_recipient),null,'Получатель','BD_2',old.field_key); end if (old.fk_face is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_FACE',old.fk_face,null,'BD_2',old.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt,tablename, fk_table) values (:fkaudit,'FACE',(select name from bd_face where field_key=old.fk_face),null,'Через кого','BD_2',old.field_key); end if (old.cod_rash is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'COD_RASH',old.cod_rash,null,'BD_2',old.field_key,'Код расхода'); if (old.summa is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table,fieldnametxt) values (:fkaudit,'SUMMA',old.summa,null,'BD_2',old.field_key,'Сумма'); end end^ SET TERM ; ^отключаем аудит на вставку по параметру глоб опшнс17.8.22.1ALTER TRIGGER BD_2_AUDIT1 ACTIV  J*3 ;CMSET TERM ^ ; ALTER TRIGGER BD_22_AUDIT ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 31000 AS declare variable fkaudit type of column bd_audit_11.field_key; declare variable fkfirm type of column bd_firm.field_key; begin if (inserting) then begin if (coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where PARAMNAME='no_audit'),0)=1) then exit; insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_22',new.field_key,'BD_2',new.fk_bd_2,'I',current_user,current_date,current_time, new.FK_BD_TOVAR) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_2',new.fk_bd_2,'U',current_user,current_date,current_time, new.fk_bd_firm) matching(tablename, fk_table, operation, login, date_change); if (new.fk_bd_tovar is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue) values (:fkaudit,'FK_BD_TOVAR',null,new.fk_bd_tovar); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'TOVAR',null,(select name from bd_tovar where field_key=new.fk_bd_tovar),'Товар'); end if (new.cena_with_nds is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,"2 'GKSET TERM ^ ; ALTER TRIGGER BD_2_AUDIT1 ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 31000 AS declare variable fkaudit type of column bd_audit_1.field_key; begin if (inserting) then begin insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_2',new.field_key,'I',current_user,current_date,current_time, new.FK_BD_FIRM) returning (field_key) into :fkaudit; if (coalesce((select g.PARAMVALUE from GLOBAL_OPTIONS g where PARAMNAME='no_audit'),0)=1) then exit; if (new.fk_bd_firm is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,tablename, fk_table) values (:fkaudit,'FK_BD_FIRM',null,new.fk_bd_firm,'BD_2',new.field_key); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnamfieldnametxt) values (:fkaudit,'CENA_WITH_NDS',null,new.cena_with_nds,'Цена'); if (new.cnt is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CNT',null,new.cnt,'Кол-во'); end if (updating) then begin if (((new.cena_with_nds is distinct from old.cena_with_nds))or((new.cnt is distinct from old.cnt))) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change,fk_main_field) values ('BD_22',new.field_key,'BD_2',new.fk_bd_2, 'U',current_user,current_date,current_time, new.FK_BD_TOVAR) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_2',new.fk_bd_2,'U',current_user,current_date,current_time, new.fk_bd_firm) matching(tablename, fk_table, operation, login, date_change); if ((new.fk_bd_tovar is distinct from old.fk_bd_tovar)) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue) values (:fkaudit,'FK_BD_TOVAR',old.fk_bd_tovar,new.fk_bd_tovar); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'TOVAR',(select name from bd_tovar where field_key=old.fk_bd_tovar),(select name from bd_tovar where field_key=new.fk_bd_tovar),'Товар'); end if ((new.cena_with_nds is distinct from old.cena_with_nds)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.cena_with_nds,new.cena_with_nds,'Цена'); if ((new.cnt is distinct from old.cnt)) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CNT',old.cnt,new.cnt,'Кол-во'); end end if (deleting) then begin insert into bd_audit_11 (tablename, fk_table, tablename_main, fk_main, operation, login, date_change, time_change, fk_main_field) values ('BD_22',old.field_key,'BD_2', old.fk_bd_2, 'D',current_user,current_date,current_time, old.FK_BD_TOVAR) returning (field_key) into :fkaudit; update or insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change, fk_main_field) values ('BD_2',old.fk_bd_2,'U',current_user,current_date,current_time, old.fk_bd_firm) matching(tablename, fk_table, operation, login, date_change); if (old.fk_bd_tovar is not null) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue) values (:fkaudit,'FK_BD_TOVAR',old.fk_bd_tovar,null); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'TOVAR',(select name from bd_tovar where field_key=old.fk_bd_tovar),null,'Товар'); end if (old.cena_with_nds is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.cena_with_nds,null,'Цена'); if (old.cena_with_nds is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CENA_WITH_NDS',old.cena_with_nds,null,'Цена'); if (old.cnt is not null) then insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt) values (:fkaudit,'CNT',old.cnt,null,'Кол-во'); end end ^ SET TERM ; ^отключ аудит на вставку по параметру глобал опшнс17.8.22.1ALTER TRIGGER BD_22_AUDIT ACTIVEre variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); declare variable cnt_reserv_11 decimal(8,3); declare variable cnt_reserv_rec decimal(8,3); declare variable fk_rec integer; declare variable fk_res integer; declare variable cnt_reserv_cancel decimal(8,3); declare variable cnt_res decimal(8,3); declare variable cnt_reserv_pr decimal(8,3); BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11;  cnt_11_stock=cnt_11_stock-cnt_reserv_11; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем резервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end if (cnt_21<>0) then insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt=grt90.lb and bd_tovar.grp_rb<=grt90.rb) or(bd_tovar.grp_lb>=grt100.lb and bd_tovar.grp_rb<=grt100.rb) or(bd_tovar.grp_lb>=grt101.lb and bd_tovar.grp_rb<=grt101.rb))*/ (exists(select bd_21.field_key from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_firm=bd_21.fk_bd_firm and bd_grt_firm_web.fk_bd_grt_firm=:fk_grp where bd_21.fk_bd_tovar=bd_tovar.field_key and bd_21.date_rash between :date_start and :date_end)) or (exists(select bd_11.field_key from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_firm=bd_11.fk_bd_firm and bd_grt_firm_web.fk_bd_grt_firm=:fk_grp where bd_11.fk_bd_tovar=bd_tovar.field_key and bd_11.date_prih between :date_start and :date_end)) group by 1,2 order by 2 into :fk_grt, :grt_name, :sum_stock1, :sum_stock2 do begin select sum(iif(bd_21.cod_rash in (0,2,3) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,bd_21.summa,0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,abs(bd_21.summa),0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm=195,bd_21.summa,0)) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_firm=bd_21.fk_bd_firm and bd_grt_firm_web.fk_bd_grt_firm=:fk_grp join bd_tovar on bd_21.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_21.fk_bd_11_6 is null and bd_21.date_rash between :date_start and :date_end into :sum_all; select sum(bd_11.summa_with_nds) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_firm=bd_11.fk_bd_firm and bd_grt_firm_web.fk_bd_grt_firm=:fk_grp join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_11.fk_bd_21_6 is null and bd_11.date_prih between :date_start and :date_end and bd_11.cod_prih in (0,1,2,3,4) into :sum_prih; select sum(bd_11.summa_with_nds) from bd_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_firm=bd_11.fk_bd_firm and bd_grt_firm_web.fk_bd_grt_firm=:fk_grp join bd_tovar on bd_11.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_11.fk_bd_21_6 is not null and bd_11.date_prih between :date_start and :date_end where bd_1.fk_supplier not in (select bd_grt_firm_web.fk_bd_firm from bd_grt_firm_web where fk_bd_grt_firm=:fk_grp) into :sum_prih_6; select sum(bd_21.summa) from bd_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_firm=bd_21.fk_bd_firm and bd_grt_firm_web.fk_bd_grt_firm=:fk_grp join bd_tovar on bd_21.fk_bd_tovar=bd_tovar.field_key and bd_tovar.fk_grt=:fk_grt and bd_21.fk_bd_11_6 is not null and bd_21.date_rash between :date_start and :date_end where bd_2.fk_recipient not in (select bd_grt_firm_web.fk_bd_firm from bd_grt_firm_web where fk_bd_grt_firm=:fk_grp) into :sum_rash_6; sum_dvig=coalesce(:sum_stock1,0)+coalesce(:sum_prih,0)-coalesce(:sum_stock2,0)-coalesce(:sum_rash_6,0)+coalesce(:sum_prih_6,0); sum_dohod=coalesce(:sum_all,0)-coalesce(:sum_dvig,0); perc_dohod=iif(:sum_dohod_total<>0,:sum_dohod*100.00/:sum_dohod_total,0); oborot=iif(:sum_dvig<>0,:sum_dohod/:sum_dvig,0); suspend; end end /* */ end^ SET TERM ; ^отчет свод по складам крым17.8.22.2REP_KRIMMEAT {8oG;ALTER TABLE BD_CH21 ADD dopgrtname Varchar(100);подгруппа блюда17.8.28.1ALTER TABLE BD_CH21 ADDt7i?;ALTER TABLE BD_CH21 ADD grtname Varchar(100);группа товара17.8.28.1ALTER TABLE BD_CH21 ADD~6mO;ALTER TABLE BD_CH21 ADD modif_txt Varchar(200);модификатор блюда17.8.28.1ALTER TABLE BD_CH21 ADDl5 ?m%SET TERM ^ ; CREATE OR ALTER procedure REP_KRIMMEAT ( DATE_START date, DATE_END date) returns ( GRT_NAME varchar(100), SUM_STOCK1 decimal(12,3), SUM_STOCK2 decimal(12,3), SUM_PRIH decimal(12,3), SUM_PRIH_6 decimal(12,3), SUM_RASH_6 decimal(12,3), SUM_ALL decimal(12,3), SUM_DVIG decimal(12,3), SUM_DOHOD_TOTAL decimal(12,3), SUM_DOHOD decimal(12,3), PERC_DOHOD decimal(12,3), OBOROT decimal(12,3), FK_GRT integer, GRP_NAME varchar(100)) as declare variable LB integer; declare variable RB integer; declare variable FK_GRP_GP integer; declare variable FK_GRP_KYRICA integer; declare variable FK_GRP_SVIN integer; declare variable FK_GRP integer; begin select field_key from bd_grt_firm where name='Свод группа ГП' into :fk_grp_gp; select field_key from bd_grt_firm where name='Свод группа курица' into :fk_grp_kyrica; select field_key from bd_grt_firm where name='Свод свинина говядина' into :fk_grp_svin; select sum(stk1.stock*bd_tovar.last_cena_pr) sum_stock1, sum(stk2.stock*bd_tovar.last_cena_pr) sum_stock2 from bd_tovar join bd_grt_tovar on bd_grt_tovar.field_key=bd_tovar.fk_grt join bd_grt_tovar grt90 on grt90.field_key=90 join bd_grt_tovar grt100 on grt100.field_key=100 join bd_grt_tovar grt101 on grt101.field_key=101 left join bd_stock stk1 on stk1.fk_bd_tovar=bd_tovar.field_key and stk1.date_morning=:date_start left join bd_stock stk2 on stk2.fk_bd_tovar=bd_tovar.field_key and stk2.date_morning=:date_end where ((bd_tovar.grp_lb>=grt90.lb and bd_tovar.grp_rb<=grt90.rb) or(bd_tovar.grp_lb>=grt100.lb and bd_tovar.grp_rb<=grt100.rb) or(bd_tovar.grp_lb>=grt101.lb and bd_tovar.grp_rb<=grt101.rb)) into :sum_stock1, :sum_stock2; select sum(iif(bd_21.cod_rash in (0,2,3) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,bd_21.summa,0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm<>195,abs(bd_21.summa),0)) - sum(iif(bd_21.cod_rash in (7) and bd_21.fk_bd_11_6 is null and bd_21.fk_bd_firm=195,bd_21.summa,0)) from bd_21 where bd_21.fk_bd_11_6 is null and bd_21.date_rash between :date_start and :date_end into :sum_all; select sum(bd_11.summa_with_nds) from bd_11 where bd_11.fk_bd_21_6 is null and bd_11.date_prih between :date_start and :date_end and bd_11.cod_prih in (0,1,2,3,4) into :sum_prih; select sum(bd_11.summa_with_nds) from bd_11 where bd_11.fk_bd_21_6 is not null and bd_11.date_prih between :date_start and :date_end into :sum_prih_6; select sum(bd_21.summa) from bd_21 where bd_21.fk_bd_11_6 is not null and bd_21.date_rash between :date_start and :date_end into :sum_rash_6; sum_dvig=coalesce(:sum_stock1,0)+coalesce(:sum_prih,0)-coalesce(:sum_stock2,0)-coalesce(:sum_rash_6,0)+coalesce(:sum_prih_6,0); sum_dohod_total=coalesce(:sum_all,0)-coalesce(:sum_dvig,0); for select bd_grt_firm.field_key, bd_grt_firm.name from bd_grt_firm where field_key in (:fk_grp_gp, :fk_grp_kyrica, :fk_grp_svin) order by 2 into :fk_grp, :grp_name do begin for select bd_grt_tovar.field_key, bd_grt_tovar.name grt_name, sum(stk1.stock*bd_tovar.last_cena_pr) sum_stock1, sum(stk2.stock*bd_tovar.last_cena_pr) sum_stock2 from bd_tovar join bd_grt_tovar on bd_grt_tovar.field_key=bd_tovar.fk_grt join bd_grt_tovar  &]= [ MSET TERM ^ ; CREATE TRIGGER BD_TOVAR_MODIF_BI FOR BD_TOVAR_MODIF ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_TOVAR_MODIF_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_TOVAR_MODIF_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_TOVAR_MODIF_ID, new.FIELD_KEY-tmp); END END^ SET TERM ; ^17.9.1.1CREATE TRIGGER BD_TOVAR_MODIF_BIu< S9SSET TERM ^ ; ALTER PROCEDURE SP_CH_TO_RASH_22_OP ( FK_FIRM Integer, WITHTODAY Date, ALLOWIZL Integer, LANG Varchar(2), ID_OPERATION Integer ) AS declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; declare variable FK_CH2_TMP integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoda {;  MCREATE INDEX IDX_BD_TOVAR_MODIF1 ON BD_TOVAR_MODIF (FK_BD_TOVAR);17.8.28.1CREATE INDEX IDX_BD_TOVAR_MODIF1:[qYCREATE GENERATOR GEN_BD_TOVAR_MODIF_ID;генератор по модификаторам17.8.28.1CREATE GENERATOR GEN_BD_TOVAR_MODIF_IDV9  WCCREATE TABLE bd_tovar_modif ( field_key integer not null primary key, fk_bd_tovar integer, name varchar(50) );модификаторы товара17.8.28.1CREATE TABLE bd_tovar_modify=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; -- отменненые позиции ставим обработанными for select field_key from bd_ch2 where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and (date_close<=:withtoday) and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0) into :fk_ch2_tmp do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0; if (not exists(select field_key from bd_ch21 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.accept_flag,0)=0)) then update bd_ch2 set accept_flag=1 where field_key=:fk_ch2_tmp; end for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa_all,0)<>0)or(coalesce(summa_disc,0)=coalesce(summa_all,0))) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END ^ SET TERM ; ^проверка по сумме чека на ноль - summa_all вместо summa17.8.28.1ALTER PROCEDURE SP_CH_TO_RASH_22_OP -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; -- отменненые позиции ставим обработанными for select field_key from bd_ch2 where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and (date_close<=:withtoday) and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0) into :fk_ch2_tmp do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0; if (not exists(select field_key from bd_ch21 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.accept_flag,0)=0)) then update bd_ch2 set accept_flag=1 where field_key=:fk_ch2_tmp; end for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa_all,0)<>0)/*or(coalesce(summa_disc,0)=coalesce(summa_all,0))*/) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, 2, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END ^ SET TERM ; ^аннулированные не переводим в расход (полная сумма=0)17.9.12.1ALTER PROCEDURE SP_CH_TO_RASH_22_OP mm> [MSSET TERM ^ ; ALTER PROCEDURE SP_CH_TO_RASH_22_OP ( FK_FIRM Integer, WITHTODAY Date, ALLOWIZL Integer, LANG Varchar(2), ID_OPERATION Integer ) AS declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; declare variable FK_CH2_TMP integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; if (withtoday is null) then withtoday=DATEADD(DAY, fq]E e AINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('show_usluga_flag', '0', 'Показать флажок "Услуга" в карточке товара');17.9.13.1INSERT INTO GLOBAL_OPTIONSFDO +update BD_TOVAR set modif_flag=017.9.13.1update BD_TOVAR]Ck =ALTER TABLE BD_TOVAR ADD modif_flag BOOLFIELD;17.9.13.1ALTER TABLE BD_TOVAR ADDB # MCREATE INDEX IDX_BD_TOVAR_MODIF2 ON BD_TOVAR_MODIF (FK_BD_TOVAR_MASTER);17.9.13.1CREATE INDEX IDX_BD_TOVAR_MODIF2lA  AALTER TABLE BD_TOVAR_MODIF ADD fk_bd_tovar_master Integer;17.9.13.1ALTER TABLE BD_TOVAR_MODIFl@gI#ALTER TABLE BD_11 ADD tss_prim Varchar(200);примечание в тсс17.9.12.2alter bd_11'? 9KCSET TERM ^ ; ALTER TRIGGER TR_BD2_DELETE ACTIVE AFTER DELETE POSITION 0 AS declare variable fk_ch2 integer; declare variable fk_bd_1 integer; declare variable ex_22 integer; BEGIN update bd_egais_reqs set fk_doc=null where fk_doc=old.field_key; delete from BD_PR_ZAKAZ_6 where fk_bd_2=old.FIELD_KEY; update BD_PR set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr set bd_pr.valid_flag=0 where fk_bd_1 is null and fk_bd_2 is null; update bd_9 set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update BD_RETROBONUS set fk_bd_2=null where fk_bd_2=old.FIELD_KEY; update bd_pr_zf_prod_prep set fk_bd_2=null, done=0 where fk_bd_2=old.field_key; delete from BD_WAY_LIST_11 where fk_bd_2 = old.FIELD_KEY; /* if (old.COD_RASH in ('0','3','7')) then begin if (exists(select first 1 1 from bd_22 where fk_bd_2=old.FIELD_KEY)) then ex_22=1; else ex_22=0; for select bd_ch2.FIELD_KEY from bd_ch2 where fk_bd_Firm=old.FK_BD_FIRM and date_close=old.DATE_RASH and fk_bd_2=old.FIELD_KEY into :fk_ch2 do begin update bd_ch2 set fk_bd_2=null, bd_ch2.ACCEPT_FLAG=0 where field_key=:fk_ch2; if (ex_22=1) then update bd_ch21 set bd_ch21.ACCEPT_FLAG=0 where fk_bd_ch2=:fk_ch2; end end */ --удаление излишков, созданных по расходу for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=old.FIELD_KEY into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; delete from bd_11 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt=0 and stock=0; delete from bd_1 where field_key=:fk_bd_1 and not exists(select field_key from bd_11 where fk_bd_1=:fk_bd_1); end END ^ SET TERM ; ^странный триггер17.9.12.1ALTER TRIGGER TR_BD2_DELETE  l pOI i) SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_RASH ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer, WITHCNT smallint = 1) returns ( FK_2 integer) as declare variable ID_SKLAD integer; declare variable ID_REC integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable COD_R integer; declare variable D_COD_R integer; declare variable FK_PFIRM_REC integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable CENA decimal(8,2); declare variable FK_BD_TOVAR integer; declare variable CNT decimal(7,3); declare variable REZ integer; declare variable CNT_OTGR decimal(7,3); declare variable FK_O11 integer; declare variable SUM_DOC decimal(8,2); declare variable SUM_OK decimal(8,2); declare variable SUMRAZNES decimal(8,2); declare variable FK_KS1 integer; declare variable CNT_SO decimal(8,3); declare variable FK_SELFUL integer; declare variable MARGIN decimal(3,2); declare variable DISCOUNT decimal(3,2); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable NDS integer; declare variable FK_11_REZERV integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_USER integer; declare variable NAME_IFS type of column BD_2.NAME_IFS; declare variable FK_REZ integer; declare variable FK_SNOOP_DOGG integer; declare variable STOCK_TOVAR decimal(12,3); declare variable FK_ZAMENA integer; declare variable CNT_ZAMENA decimal(12,3); declare variable KOEF decimal(12,3); dHy]G ALTER TABLE BD_KASSA_MENU_GRT ADD fk_bd_cena Integer;вид цены у группы меню17.9.15.1ALTER TABLE BD_KASSA_MENU_GRTxG ';ALTER TABLE BD_EGAIS_DOC_RASH_TOVAR ADD ALCVOLUME DECIMAL(12,3); ALTER TABLE BD_EGAIS_DOC_RASH_TOVAR ADD POSIT INTEGER;доп поля для кеш товаров из прих.накладных17.9.13.1BD_EGAIS_DOC_RASH_TOVARF -MSET TERM ^ ; create or alter PROCEDURE sp_bd_tovar_add ( name type of column bd_tovar.NAME, scan type of column BD_SCAN.SCANCOD, ed_izm type of column BD_ED_IZM.NAME, price type of column BD_CPR.CENA, fk_bd_firm integer ) RETURNS ( fk_tovar integer ) AS DECLARE VARIABLE fk_cena integer; DECLARE VARIABLE fk_edizm integer; BEGIN --единица измерения update or INSERT INTO BD_ED_IZM (NAME, ACCURACY) VALUES ('n/a',3) matching (name) returning (field_key) into :fk_edizm; INSERT INTO BD_TOVAR (FK_GRT, NAME, FULLNAME, FK_BD_ED_IZM, NDS) VALUES (0,:NAME,:name,:fk_edizm,coalesce((select nds from BD_GRT_TOVAR where field_key=0),18)) returning (field_key) into :fk_tovar; INSERT INTO BD_SCAN (FK_BD_TOVAR, SCANCOD, COL, MAIN_FLAG, CENNIK_FLAG, COMMIT_FLAG) VALUES (:FK_TOVAR,:SCAN,1,1,0,1); select bd_firm.FK_BD_CENA_BASIC from bd_firm where field_key=:fk_bd_firm into :fk_cena; INSERT INTO BD_CPR (FK_BD_TOVAR, FK_BD_CENA, CENA, LAST_DATE, LAST_TIME, OPERATOR, WORKPLACE, FK_BD_OPERATION, START_DATE, CENA_PR, END_DATE, START_TIME, FK_BD_11, OLDKEY) VALUES (:FK_TOVAR, :FK_CENA, :price, current_date, current_time, 0, 0, 0, current_date, 0, null, null, null, null); suspend; END^ SET TERM ; ^добавление нового товара из микрокассы17.9.13.1CREATE PROCEDURE sp_bd_tovar_addeclare variable INPLACE_Z decimal(12,3); declare variable NDS_Z decimal(12,3); declare variable CENA_Z decimal(12,3); declare variable DATE_DELIVERY date; declare variable PRIM varchar(200); BEGIN /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=1; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --заголовок расхода select fk_bd_firm, fk_recipient, cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery, bd_order_out_1.prim from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :id_rec, :cod_r, :FK_PFIRM_REC, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_snoop_dogg, :date_delivery, :prim; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_sklad), null, :date_delivery, :id_rec, :fk_face, :cod_r, :d_cod_r, :fk_user, :prim, 0, null, null, null, :id_sklad, null, 0, :FK_PFIRM_REC, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_snoop_dogg); --перебираем все строки заказа --сначала переводим в расход строки с резервом cnt_so=0; rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 left join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) where fk_bd_out_1=:id_zakaz --and fk_bd_11_rezerv is null into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :rez, :nds, :inplace do BEGIN --ost_rash - ищем, сколько уже отгружено по данной позиции cnt_otgr=0; if (withcnt=1) then select sum(cnt) from BD_22 where bd_22.fk_bd_order_out_11=:fk_o11 into :cnt_otgr; cnt_otgr=coalesce(cnt_otgr,0); ost_rash=ost_rash-cnt_otgr; --проверяем по остаткам если нехватает, проверим замены select sum(stock) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and stock>0 into :stock_tovar; if (coalesce(:stock_tovar,0)<:ost_rash) then begin for select sp.fk_tovar_zamena, sp.cnt_tovar_zamena, sp.koef, t.nds, t.inplace from sp_create_rash_checktov_zamena(:id_zakaz,:fk_o11,:ost_rash-coalesce(:stock_tovar,0)) sp join bd_tovar t on t.field_key=sp.fk_tovar_zamena into :fk_zamena, :cnt_zamena, :koef, :nds_z, :inplace_z do begin cena_z=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_zamena and fk_bd_cena=:fk_cena into :cena_z; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, null , :cena_z, :cena_z/(1+(coalesce(:nds_z,0)/100)), :cnt_zamena, :fk_o11, :fk_zamena, :inplace_z, :nds_z); cnt_so=cnt_so+cnt_zamena; ost_rash=:ost_rash-(:cnt_zamena*:koef); end end --актуализируем цены --только для расходных цен if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (rez is not null) then begin update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; end else begin fk_11_rezerv=null; end --заполняем расход -- 1. Rezerv or position from fk_bd_11 if ((withcnt=0)or(ost_rash>0)) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); cnt_so=cnt_so+ost_rash; ost_rash=0; end rez=null; END if ((withcnt=0)or(cnt_so>0)) THEN BEGIN -- update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz; if (prov_bd_2_flag=1) then begin execute procedure sp_bd2_prov(:fk_2,'RU',coalesce(:tsd_check,0),:fk_user); if ((select count(*) from bd_2_resultprov r where r.fk_bd_2=:fk_2)>0) then begin delete from bd_21 where fk_bd_2=:fk_2; update bd_2 set valid_flag=0 where field_key=:fk_2; end end -- execute procedure sp_22_by_21(:fk_2,0); update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); -- END ELSE delete from BD_2 where field_key=:fk_2; --делаем разнесение --находим сумму расхода select sum(summa) from bd_21 where fk_bd_2=:fk_2 into :sum_doc; for select fk_ks_1, sum(summa) from ks_11 where fk_ks_1 is not null and coalesce(fo_order_out,0)=:ID_ZAKAZ group by fk_ks_1 into :fk_ks1, :sumraznes do BEGIN --находим сколько можем разнести по этой оплате select main.summa-coalesce((select sum(ks_11.summa) from ks_11 where ks_11.fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null and coalesce(ks_11.fk_bd_2,0)<>:fk_2),0) from ks_1 main where main.field_key=:fk_ks1 group by main.summa into :sum_ok; --сравниваем суммы sumraznes=minvalue(sumraznes,sum_ok,sum_doc); if (sumraznes>0) THEN BEGIN --создаем разнесение в этой же оплате по этому же расходу INSERT INTO KS_11 (FIELD_KEY, FK_KS_1, FK_BD_2, SUMMA) VALUES (gen_id(GEN_KS_11_ID,1), :FK_KS1, :FK_2, :sumraznes); sum_doc=sum_doc-sumraznes; END END END^ SET TERM ; ^При экспорте из заявки в расход - не сохраняется комментарий17.9.21.1SP_CREATE_RASH_PRIH_CENA integer; declare variable FK_BD_DOGOVOR integer; declare variable FK_BD_2NEW integer; declare variable FK_BD_TOVAR integer; declare variable CENA_WITH_NDS decimal(8,2); declare variable CENA_WITHOUT_NDS decimal(8,2); declare variable CNT decimal(8,3); declare variable NDS decimal(3,2); declare variable DATE_SAVE date; declare variable GTD varchar(26); declare variable FK_USER integer; declare variable FIRMNAME varchar(30); declare variable FK_BD_TOVAR_MOD integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable SUM_INPUT_MAN_FLAG integer; declare variable SUMMA type of column BD_22.SUMMA; declare variable CNT_IN_INPLACE type of column BD_22.CNT_IN_INPLACE; declare variable PRIM type of column BD_2.comment; declare variable DATE_RASH date; begin select field_key from bd_users where upper(login)=upper(current_user) into :fk_user; select name from bd_firm where field_key=(select fk_bd_firm from bd_2 where field_key=:fk_bd_2) into :firmname; if (fk_firm is null) then begin select bd_2.nomer_rash, bd_2.date_nakl, bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_bd_pfirm, bd_2.fk_bd_firm, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT" from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_bd_pfirm, :fk_firm, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim; end else begin select bd_2.nomer_rash, bd_2.date_nakl ,bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT", bd_2.date_rash from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim, :date_rash; end fk_bd_2new=gen_id(GEN_BD_2_ID,1); if (:date_rash is null) then begin date_rash=current_date; end insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1, FK_BD_dogovor) VALUES ( :fk_bd_2new,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), null, :date_rash, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_user, coalesce(:prim,'Копия расхода '||:nomer_rash||' '||:firmname), 0, :fk_bd_pfirm, null, null, :fk_firm, null, 0, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, null, null, null,:fk_bd_dogovor); for select a.FK_BD_TOVAR, a.FK_BD_TOVAR_MOD, a.CENA_WITH_NDS, a.CENA_WITHOUT_NDS, a.NDS, a.CNT, a.FK_TOVAR_NABOR_MASTER, a.SUM_INPUT_MAN_FLAG, a.SUMMA, a.CNT_IN_INPLACE from bd_22 a where fk_bd_2=:fk_bd_2 order by field_key into :fk_bd_tovar, :fk_bd_tovaR_MOD, :CENA_WITH_NDS, :CENA_without_nds, :nds, :cnt, :fk_tovar_nabor_master, :sum_input_man_flag, :summa, :cnt_in_inplace do begin INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, FK_TOVAR_NABOR_MASTER, SUM_INPUT_MAN_FLAG, SUMMA, CNT_IN_INPLACE) VALUES (:fk_bd_2new, :FK_BD_TOVAR, :FK_BD_TOVAR_MOD, :CENA_WITH_NDS, :CENA_WITHOUT_NDS, :NDS, :CNT, :FK_TOVAR_NABOR_MASTER, :SUM_INPUT_MAN_FLAG, :SUMMA, :CNT_IN_INPLACE); end end^ SET TERM ; ^изменен коммент к расх.17.9.21.1SP_COPY_RASH J a% SET TERM ^ ; CREATE OR ALTER procedure SP_COPY_RASH ( FK_BD_2 integer, FK_FIRM integer) as declare variable DATE_NAKL date; declare variable NOMER_RASH varchar(10); declare variable FK_RECIPIENT integer; declare variable FK_FACE integer; declare variable COD_RASH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_PFIRM integer; declare variable FK_PFIRM_RECIPIENT integer; declare variable FK_CENA_RASH integer; declare variable INoin bd_dogovor d on d.fk_recipient=a.field_key where --a.GET_KS_post=1 and coalesce(sklad,0)=0 and d.field_key is not null and a.field_key=:fk_sklad -------3 order by 2 asc, 6 desc INTO :firm_key, :name, :nomer_partner, :fk_bd_dogovor, :summa, :typerec DO BEGIN docs_valid=0; docs_not_valid=0; if (:fk_bd_dogovor is null) then tmp_fk_bd_dogovor = -1; else tmp_fk_bd_dogovor=fk_bd_dogovor; if (typerec in (1,3)) then begin cnt=0; select first 1 field_key from bd_1 where fk_supplier=:firm_key and fk_selful=:fk_selful and fk_selful_from is null and bd_1.dolgfromdate <=:date_dolg and valid_flag=1 and coalesce(bd_1.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor into :cnt; if (coalesce(:cnt,0)>0) then docs_valid=1; if (docs_valid=0) then select first 1 field_key from bd_2 where fk_recipient=:firm_key and fk_selful=:fk_selful and fk_selful2 is null and bd_2.dolgfromdate <=:date_dolg and valid_flag=1 and coalesce(bd_2.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor into :cnt; if (coalesce(:cnt,0)>0) then docs_valid=1; if (docs_valid=0) then select first 1 field_key from ks_1 where (fk_bd_firm=:firm_key and valid_flag=1 and ks_1.date_create <=:date_dolg and coalesce(ks_1.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor) and ((ks_1.fk_selful=:fk_selful and prih=0) or (fk_selful=:fk_selful and prih=1)) into :cnt; if (coalesce(:cnt,0)>0) then docs_valid=1; cnt=0; select first 1 field_key from ks_1 where (fk_bd_firm=:firm_key and valid_flag<>1 and ks_1.date_create <=:date_dolg and coalesce(ks_1.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor) and ((ks_1.fk_selful=:fk_selful and prih=0) or (fk_selful=:fk_selful and prih=1)) into :cnt; if (coalesce(:cnt,0)>0) then docs_not_valid=1; end debit=0; KREDIT=0; debit2=0; kredit2=0; IF (TYPEREC=1) THEN begin select coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=:firm_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=:firm_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0) as summa from bd_firm a where a.GET_KS_post=1 and coalesce(sklad,0)=0 and field_key=:firm_key INTO :DEBIT; --1-1d select coalesce((select sum(summa_dolg) from bd_1 where fk_supplier=:firm_key and fk_selful=:fk_selful and fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor is null and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=:firm_key and fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0) as summa from bd_firm a where a.GET_KS_post=1 and coalesce(sklad,0)=0 and field_key=:firm_key into :KREDIT; --1-1k end IF (TYPEREC=3) THEN begin select coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=:firm_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor=:fk_bd_dogovor ),0)- coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=:firm_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor=:fk_bd_dogovor ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=:fk_bd_dogovor),0) as summa from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key and d.field_key=:fk_bd_dogovor and d.fk_recipient=:firm_key where a.GET_KS_post=1 and coalesce(sklad,0)=0 and a.field_key=:firm_key INTO :DEBIT; --3-3d select coalesce((select sum(summa_dolg) from bd_1 where fk_supplier=:firm_key and fk_selful=:fk_selful and fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor=:fk_bd_dogovor and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=:firm_key and fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5) and bd_2.fk_bd_dogovor=:fk_bd_dogovor ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=:fk_bd_dogovor),0) as summa from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key and d.field_key=:fk_bd_dogovor and d.fk_recipient=:firm_key where a.GET_KS_post=1 and coalesce(sklad,0)=0 and a.field_key=:firm_key INTO :kredit; --3-3k end if (debit<0) then kredit2=-debit; if (kredit<0) then debit2=-kredit; if (debit>0) then debit2=debit2+debit; if (kredit>0) then kredit2=kredit2+kredit; selnum=selnum+1; if (summa<>0) then suspend; end END^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_1 TO PROCEDURE SP_GET_DOLG_UL_KONTR; GRANT SELECT ON BD_2 TO PROCEDURE SP_GET_DOLG_UL_KONTR; GRANT SELECT ON KS_1 TO PROCEDURE SP_GET_DOLG_UL_KONTR; GRANT SELECT ON BD_FIRM TO PROCEDURE SP_GET_DOLG_UL_KONTR; GRANT SELECT ON BD_DOGOVOR TO PROCEDURE SP_GET_DOLG_UL_KONTR; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_GET_DOLG_UL_KONTR TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_DOLG_UL_KONTR TO SYSDBA;сальдо на дату17.9.22.1SP_GET_DOLG_UL_KONTR ]K ;A5 SET TERM ^ ; create or alter procedure SP_GET_DOLG_UL_KONTR ( FK_SELFUL integer, DATE_DOLG date, FK_SKLAD integer) returns ( FIRM_KEY integer, NAME varchar(100), NOMER_PARTNER varchar(100), FK_BD_DOGOVOR integer, SUMMA decimal(15,2), TYPEREC smallint, DEBIT decimal(15,2), KREDIT decimal(15,2), DEBIT2 decimal(15,2), KREDIT2 decimal(15,2), DOCS_VALID integer, DOCS_NOT_VALID integer, SELNUM integer) as declare variable TMP_FK_BD_DOGOVOR integer; declare variable CNT integer; BEGIN selnum=0; for select a.field_key, a.name, '' as nomer_partner, null as fk_bd_dogovor, (coalesce((select sum(summa_dolg) from bd_1 where fk_supplier=a.field_key and fk_selful=:fk_selful and fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor is null and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=a.field_key and fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5 ) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0))- (coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0)) as summa, 1 as typerec from bd_firm a where --a.GET_KS_post=1 and coalesce(sklad,0)=0 a.field_key=:fk_sklad ------1 UNION ------3 select a.field_key, a.name, d.nomer_partner, d.field_key as fk_bd_dogovor, (coalesce((select sum(summa_dolg) from bd_1 where fk_supplier=a.field_key and fk_selful=:fk_selful and fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor=d.field_key and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=a.field_key and fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5 ) and bd_2.fk_bd_dogovor=d.field_key ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=d.field_key),0))- (coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor=d.field_key ),0)- coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key and fk_selful=:fk_selful and fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor=d.field_key ),0)+ coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=d.field_key),0)) as summa, 3 as typerec from bd_firm a left jRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Накладная №'||nomer_prih||' ('||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=summa_real+razn; END fk_doc=id; suspend; END --обороты за период select sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=-:sum_opl2-:sum_opl1; --summa_real; if (debet=0) then debet=null; kredit=summa_opl; if (kredit=0) then kredit=null; suspend; --считаем итоговое сальдо razn=:sum_opl2; name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||dat_do_s||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||dat_do_s||' задолженность в пользу '||org||' '||RAZN||' руб.'; end ELSE txt_itogo='на '||dat_do_s||' задолженность в пользу '||org_client||' '||RAZN||' руб.'; id=null; suspend; END^ SET TERM ; ^ACT_SVERKI17.9.22.1SP_ACT_SVERKI ""RL U!' SET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); declare variable SUM_OPL1 decimal(15,2); declare variable SUM_OPL2 decimal(15,2); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select -sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=:sum_opl1; if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast('Накладная №'||nomer_rash||' ('||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(bd_21.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTREAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); declare variable SUM_OPL1 decimal(15,2); declare variable SUM_OPL2 decimal(15,2); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select -sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=:sum_opl1; if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast('Накладная №'||nomer_rash||' ('||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Накладная №'||nomer_prih||' ('||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=summa_real+razn; END fk_doc=id; suspend; END --обороты за период select sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=-:sum_opl2-:sum_opl1; --summa_real; if (debet=0) then debet=null; kredit=summa_opl; if (kredit=0) then kredit=null; suspend; --считаем итоговое сальдо razn=:sum_opl2; name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||dat_do_s||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||dat_do_s||' задолженность в пользу '||org||' '||RAZN||' руб.'; end ELSE txt_itogo='на '||dat_do_s||' задолженность в пользу '||org_client||' '||RAZN||' руб.'; id=null; suspend; END^ SET TERM ; ^17.9.22.2SP_ACT_SVERKI "O  'SET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date) as declare variable SUMM!FN WiCSET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_RASH_TOV_SUPPLIER ( ID_ZAKAZ integer, BY_CURRPRICE integer, PROV_BD_2_FLAG integer = 0, WITHCNT smallint = 0) as declare variable FK_O11 integer; declare variable FK_USER integer; declare variable ID_SKLAD integer; declare variable FK_RECIPIENT integer; declare variable FK_RECIPIENT_PFIRM integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_SELFUL integer; declare variable MARGIN decimal(12,3); declare variable DISCOUNT decimal(12,3); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_DOGOVOR integer; declare variable DATE_DELIVERY date; declare variable COD_R integer; declare variable NAME_IFS varchar(100); declare variable FK_SUPPLIER_MAIN integer; declare variable D_COD_R integer; declare variable FK_BD_TOVAR integer; declare variable OST_RASH decimal(12,3); declare variable CENA type of column BD_ORDER_OUT_11.CENA_PR_WITH_NDS; declare variable FK_11_REZERV integer; declare variable FK_REZ integer; declare variable ID_REZ integer; declare variable NDS integer; declare variable INPLACE decimal(7,3); declare variable CNT_SO decimal(12,3); declare variable FK_2 integer; declare variable PRIM varchar(200); begin /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=0; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --для заголовока расхода select fk_bd_firm, fk_recipie M a 'SET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date) as declare variable SUMMA_nt, bd_order_out_1.cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, bd_order_out_1.nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery, bd_order_out_1.prim from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :fk_recipient, :cod_r, :fk_recipient_pfirm, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_dogovor, :date_delivery, :prim; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); for select bd_tovar.fk_supplier_main from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz group by 1 order by bd_tovar.fk_supplier_main into :fk_supplier_main do begin fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_supplier_main), :date_delivery, current_date, :fk_recipient, :fk_face, :cod_r, :d_cod_r, :fk_user, :prim, 0, null, null, null, :fk_supplier_main, null, 0, :fk_recipient_pfirm, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_dogovor); cnt_so=0; id_rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace from BD_ORDER_OUT_11 join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) join bd_firm on bd_firm.field_key=bd_tovar.fk_supplier_main and bd_firm.sklad=1 where fk_bd_out_1=:id_zakaz and bd_tovar.fk_supplier_main=:fk_supplier_main into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :id_rez, :nds, :inplace do begin if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (id_rez is not null) then update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; else fk_11_rezerv=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); id_rez=null; end --suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); end update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; end^ SET TERM ; ^При экспорте из заявки в расход - не сохраняется комментарий17.9.26.1SP_CREATE_RASH_TOV_SUPPLIER"A_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); declare variable SUM_OPL1 decimal(15,2); declare variable SUM_OPL2 decimal(15,2); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select -sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=:sum_opl1; if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат №','Накладная №')||nomer_rash||' ('||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Накладная №'||nomer_prih||' ('||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Оплата ('||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||')' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=summa_real+razn; END fk_doc=id; suspend; END --обороты за период select sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=-:sum_opl2-:sum_opl1; --summa_real; if (debet=0) then debet=null; kredit=summa_opl; if (kredit=0) then kredit=null; suspend; --считаем итоговое сальдо razn=:sum_opl2; name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||dat_do_s||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||dat_do_s||' задолженность в пользу '||org||' '||RAZN||' руб.'; end ELSE txt_itogo='на '||dat_do_s||' задолженность в пользу '||org_client||' '||RAZN||' руб.'; id=null; suspend; END^ SET TERM ; ^Если накл. возврат писать возврат17.9.26.1SP_ACT_SVERKI$ (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALU%ES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa_nds+doprash); --/iif(cnt_all>0,:cnt_all,1); select bd_calc.norma_min from bd_calc where field_key=:fk_ttk into :norma_min; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=:cena_prod/:norma_min; --/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^17.9.29.1SP_CREATE_BY_PR_TTKRAZBOR mkmeQ   +SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); d'P - ?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); declare variable NORMA_MIN decimal(15,4); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2#(eclare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_B)D_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALU*ES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^17.9.29.1SP_CREATE_BY_PREVEL integer, PROCENT_SEB decimal(7,3), CURR_LEVEL integer) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; curr_level=:out_level; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); cena_pr_prod=:cena_pr_prod*:norma_ttk; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (norma_prod is not null) then begin norma=norma*norma_prod/:norma_ttk; netto=norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))); end norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod/:norma_ttk; cena_seb_ed=cena_pr_prod/:norma_ttk; end else begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; if ((curr_level=1)) then curr_level=:curr_level+1; -- curr_level=coalesce(:out_level,0)-:curr_level; suspend; if (:fk_ttk_comp is not null) then curr_level=:curr_level+1; end fk_ttk_tmp=null; end curr_level=coalesce(:in_level,0)+1; end end^ SET TERM ; ^17.9.29.1SP_GET_CALC_TREE  SR e -SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_L+.RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_/nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa_nds+doprash); --/iif(cnt_all>0,:cnt_all,1); select bd_calc.norma_min from bd_calc where field_key=:fk_ttk into :norma_min; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=coalesce((select first 1 (bd_22.cena_with_nds) from bd_22 where fk_bd_2=:fk_2),0); --cena_nds=:cena_prod/:norma_min; --/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^17.10.3.1SP_CREATE_BY_PR_TTKRAZBOR iS } ?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); declare variable NORMA_MIN decimal(15,4); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_-2eclare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_B3D_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALU4ES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^17.10.3.1SP_CREATE_BY_PR   h e Yos!9ALTER TABLE TMP_CENNIK ADD dop_txt Varchar(200);доп информация для этикеток17.10.27.1ALTER TABLE TMP_CENNIKX   ![create trigger bd_anons_tracks_bi for bd_anons_tracks active before insert position 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_anons_tracks_id,1); end17.10.27.1анонсированные трекиVWY/!update bd_tovar set oldkey_str=oldkey;oldkey_str=oldkey17.10.20.1bd_tovar[V i !7SET TERM ^ ; CREATE OR ALTER trigger tr_bd_tovar_oldkey_iu for bd_tovar active before insert position 0 AS BEGIN if (new.oldkey is null) then new.oldkey=1; if (exists(select first 1 oldkey from bd_tovar where oldkey=new.oldkey)) then new.oldkey=1; while (exists(select first 1 oldkey from bd_tovar where oldkey=new.oldkey)) do new.oldkey=new.oldkey+1; new.oldkey_str=new.oldkey; END^ SET TERM ; ^17.10.20.1tr_bd_tovar_oldkey_iu_Uo+!ALTER TABLE BD_TOVAR ADD OLDKEY_STR VARCHAR(30); ADD OLDKEY_STR17.10.20.1BD_TOVAReT   +SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); d1 22d\ ?;!ECREATE TABLE bd_22_palet_num ( field_key integer not null primary key, fk_bd_firm integer, fk_bd_22 integer, palet_num integer );номера палет17.10.27.1CREATE TABLE bd_22_palet_numo[e?!3ALTER TABLE BD_FIRM ADD paleta_num Integer;номер паллеты17.10.27.1ALTER TABLE BD_FIRMpZ _/!GSET TERM ^ ; ALTER PROCEDURE SP_CENNIK_ALL ( ID_TRANSACTION Integer, ID_SKLAD Integer, ID_AKC Integer DEFAULT null ) RETURNS ( FULLNAME Char(200), LAND Char(20), MADE Varchar(200), INPLACE Decimal(7,3), DAY_SAVE Integer, ED_NAME Varchar(30), ARTICUL Varchar(20), SCAN Varchar(30), DATE_SAVE Date, PRICE Decimal(8,2), NAME Char(100), AKC TYPE OF BOOLFIELD, DISCOUNT Decimal(4,2), COMPOSITION Blob sub_type 1, PLU Integer, FK_BD_TOVAR Integer, OLDPRICE Decimal(8,2), DOP_INFO Blob sub_type 0, FLAG_NEW Integer, PRIM_AKC Varchar(500), PROCENT_DISC Decimal(5,2), FK_BD_AKC Integer, TOVAR_BRAND Varchar(100), TOVAR_VID Varchar(100), DOP_TXT varchar(200) ) AS --declare variable fk_old_cena integer; BEGIN -- fk_old_cena=(select min(go.PARAMVALUE) from GLOBAL_OPTIONS go where upper(go.PARAMNAME)=upper('old_cena_for_cennik')); fk_bd_akc=0; --fk_cena=coalesce((select bd_Firm.FK_BD_CENA_BASIC from bd_firm where field_key=:id_sklad),0); for select main.field_key, main.fullname, main.land, main.made, main.inplace, main.day_save, main.ed_izm_name as ed_name, main.articul, tmp_cennik.price, main.name, current_date+coalesce(main.DAY_SAVE,0), main.akc, main.discount_unq, main.composition, main.NUMBER_ON_SCALE, main.dop_info, main.FLAG_NEW -- max(bd_11.DATE_SAVE) , tov_typ.name, tov_brand.name, tmp_cennik.DOP_txt from bd_tovar main --join bd_ed_izm on bd_ed_izm.field_key=main.fk_bd_ed_izm -- join bd_11 on bd_11.fk_bd_tovar=main.field_key join bd_1 on bd_1.field_key=bd_11.fk_bd_1 join tmp_cennik on tmp_cennik.fk_bd_tovar=main.FIELD_KEY left join bd_tovar_type tov_typ on tov_typ.field_key=main.fk_tovar_type left join bd_tovar_brand tov_brand on tov_brand.field_key=main.fk_tovar_brand where tmp_cennik.id_transaction=:id_transaction-- and bd_1.FK_BD_FIRM=:id_sklad and bd_11.date_save is not null -- group by 1,2,3,4,5,6,7,8,9,10 order by main.name into :fk_bd_tovar, :fullname, :land, :made , :inplace, :day_save , :ed_name , :articul, :price , :name, :date_save, :akc, :discount, :composition, :plu, :dop_info, :flag_new, :tovar_vid, :tovar_brand, :dop_txt do BEGIN scan=null; /*for*/ select first 1 scancod from bd_scan where fk_bd_tovar=:fk_bd_tovar order by bd_scan.cennik_flag desc,bd_scan.main_flag desc, field_key into :scan; /*do*/ /*break; */ --if (fk_old_cena is null) then oldprice=coalesce((select cenan from getcurcena_pred1(:fk_bd_tovar,:id_sklad)),0); --else -- oldprice=(select cena from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_old_cena); if (id_akc is null) then for select d.procent_disc, a.prim, a.field_key from bd_akc a left join bd_tovar_discount d on (d.fk_bd_akc=a.field_key) where a.valid_flag=1 and ((a.date_end>=current_date)or(a.date_end is null)) and d.fk_bd_tovar=:fk_bd_tovar into :procent_disc, :prim_akc, :fk_bd_akc do suspend; else for select d.procent_disc, a.prim, a.field_key from bd_akc a left join bd_tovar_discount d on (d.fk_bd_akc=a.field_key) where a.valid_flag=1 and ((a.date_end>=current_date)or(a.date_end is null)) and d.fk_bd_tovar=:fk_bd_tovar and a.field_key=:id_akc into :procent_disc, :prim_akc, :fk_bd_akc do suspend; fk_bd_akc=0; -- procent_disc=null; -- prim_akc=null; suspend; END delete from tmp_cennik where id_transaction=:id_transaction; END ^ SET TERM ; ^дополнительное поле с информацией в ценнике17.10.27.1ALTER PROCEDURE SP_CENNIK_ALL ' J]'2a +)$update or insert into global_options (paramname, paramvalue, info) values ('tovar_zip_images', '1', 'Сжимать фото товаров при загрузке') matching (paramname);параметр Сжимать фото товаров при загрузке17.11.7.1global_optionsL` ] !##SET TERM ^ ; CREATE OR ALTER procedure SP_BD2_PROV ( FK_BD2 integer, LANG varchar(2), CREATE_7 integer, FK_USER integer, IGNORE_NO_IZLISH_FLAG integer = 0, CHECKSTOCK7 integer = 0) as declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; /* coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) */ declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare8r_ #]!["SET TERM ^ ; create or alter PROCEDURE sp_get_bd_22_palet_num ( fk_bd_22 integer) RETURNS ( palet_num integer ) AS DECLARE VARIABLE fk_rec integer; BEGIN select palet_num from BD_22_PALET_NUM where fk_bd_22=:fk_bd_22 into :palet_num; if (palet_num is null) then begin select bd_2.FK_RECIPIENT, coalesce(bd_firm.PALETA_NUM,0)+1 from bd_2 join bd_22 on bd_22.fk_bd_2=bd_2.field_key join bd_firm on bd_firm.FIELD_KEY=bd_2.FK_RECIPIENT where bd_22.field_key=:fk_bd_22 into :fk_rec, :palet_num; INSERT INTO BD_22_PALET_NUM (FK_BD_FIRM, FK_BD_22, PALET_NUM) VALUES (:fk_rec, :FK_BD_22, :palet_num); update bd_firm set bd_firm.PALETA_NUM=:palet_num where field_key=:fk_rec; end suspend; END^ SET TERM ; ^получить номер палеты17.10.27.1CREATE PROCEDURE sp_get_bd_22_palet_numH^ + !O!CREATE TRIGGER BD_22_PALET_NUM_BI FOR BD_22_PALET_NUM ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_22_PALET_NUM_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_22_PALET_NUM_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_22_PALET_NUM_ID, new.FIELD_KEY-tmp); END END17.10.27.1CREATE TRIGGER BD_22_PALET_NUM_BIq]]1!M CREATE GENERATOR GEN_BD_22_PALET_NUM_ID;генератор17.10.27.1GENERATOR GEN_BD_22_PALET_NUM_ID9 variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); declare variable CNT_RESERV_11 decimal(8,3); declare variable CNT_RESERV_REC decimal(8,3); declare variable FK_REC integer; declare variable FK_RES integer; declare variable CNT_RESERV_CANCEL decimal(8,3); declare variable CNT_RES decimal(8,3); declare variable CNT_RESERV_PR decimal(8,3); BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11; cnt_11_stock=cnt_11_stock-cnt_reserv_11:; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем резервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end if (cnt_21<>0) then insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_;bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin ma0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)or(checkstock7=1)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0 and dolgfromdate<=current_date),0); sum_rash= coalesce((select sum(summa_dolg) from bd_2 where fk_recipient=:FK_FRM and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg>0 and dolgfromdate<=current_date),0); sum_opl=coalesce((select sum(case prih when 1 then summa_dolg when 2 then 0-summa_dolg else 0 end) from ks_1 join KS_SCHET on KS_SCHET.FIELD_KEY=ks_1.FK_KS_SCHET where fk_bd_firm=:FK_FRM and KS_SCHET.fk_selful=:fk_selful and summa_dolg>0),0); sum_dolg=-sum_prih+sum_rash-sum_opl; suspend; end END^ SET TERM ; ^долги кредиторов17.11.20.1SP_GET_DOLG_URLICO_FIRM_2_CASHzei[!)(update BD_FIRM set allow_kassa_kredit_flag=0;проставляем значения17.11.20.1update BD_FIRM6d +!3'ALTER TABLE BD_FIRM ADD allow_kassa_kredit_flag BOOLFIELD;разрешение работать в кредит у контрагента17.11.20.1ALTER TABLE BD_FIRMLc 5!;&SET TERM ^ ; CREATE OR ALTER procedure SP_EG_SET_NAKL_STATUSES as declare variable REGID type of column BD_EGAIS_DOCS.WBR_WBREGID; declare variable IDEN type of column BD_EGAIS_DOCS.IDENTITY; declare variable TMPID integer; BEGIN FOR select wbr_wbregid from bd_egais_docs where fk_bd_e_doc_types=4 and tc_doctype=1 and wait_status=0 and tc_opername = 'Confirm' and tc_operres = 'Accepted' order by field_key asc into :regid do begin for select field_key, identity from bd_egais_docs where fk_bd_e_doc_types=2 and e_status<>2 and ((e_status<>1) or (wait_status<>1) ) and wbr_wbregid=:regid into tmpid, iden do begin update bd_egais_docs set e_status=1, wait_status=1 where --fk_bd_e_doc_types=2 and e_status<>2 and wbr_wbregid=:regid and field_key=:tmpid; --returning identity into :iden update bd_egais_docs set e_status=1, wait_status=1 where fk_bd_e_doc_types=1 and e_status<>2 and identity=:iden; update bd_egais_docs set wait_status=1 where wbr_wbregid=:regid; end end END^ SET TERM ; ^исправляем зависания при синхронизации ЕГАИС17.11.20.1SP_EG_SET_NAKL_STATUSESb u!!% INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Приходные цены', 'csr_prih_cena', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where NAME_VAR='curstateskl'));просмотр приходных цен в тсс17.11.15.1права@hen 0 else 1 end,0), smena, fk_bd_2, coalesce(fk_bd_firm_kredit,2), sum(bd_ch2.SUMMA-coalesce(bd_ch2.SUMMA_KREDIT,0)) from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa_all,0)<>0)/*or(coalesce(summa_disc,0)=coalesce(summa_all,0))*/) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5,6 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch, :fk_rec, :summa_opl do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)or(old_fk_rec<>fk_rec)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, :fk_rec, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); --создание оплаты if ((SUMMA_OPL>0)and(fk_rec<>2)) then begin INSERT INTO KS_1 (FK_KS_KODI, FK_KS_SCHET, DATE_CREATE, TIME_CREATE, OPER_CREATE, SUMMA, COMM, FK_BD_FIRM, PRIH, VALID_FLAG, OPL_FLAG, NOMER_CREATE,fk_sklad) VALUES ( 2, coalesce((select bd_firm.FK_KS_SHET from bd_firm where field_key=:fk_firm),(select first 1 field_key from KS_SCHET order by field_key)), :date_close, current_time, :fk_user, :SUMMA_OPL, null, :FK_REC, 1, 1, 0, (select coalesce(max(NOMER_CREATE)+1,1) from ks_1), :fk_firm ) returning (field_key) into :fk_ks_1; INSERT INTO KS_11 (FK_KS_1, FK_BD_2, SUMMA) VALUES (:FK_KS_1, :fk_bd_2new, :SUMMA_OPL); end --------- end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; old_fk_rec=:fk_rec; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0)and(coalesce(bd_ch2.fk_bd_firm_kredit,2)=:fk_rec) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END ^ SET TERM ; ^отдельные чеки по кредиторам, оплаты по внесенной наличке17.11.20.1ALTER PROCEDURE SP_CH_TO_RASH_22_OP <<4i 'a!S,SET TERM ^ ; ALTER PROCEDURE SP_CH_TO_RASH_22_OP ( FK_FIRM Integer, WITHTODAY Date, ALLOWIZL Integer, LANG Varchar(2), ID_OPERATION Integer ) AS declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA varchar(10); declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; declare variable FK_CH2_TMP integer; declare variable FK_REC integer; declare variable OLD_FK_REC integer; declare variable summa_opl decimal(15,2); declare variable FK_KS_1 integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; old_fk_rec=2; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; -- отменненые позиции ставим обработанными for select field_key from bd_ch2 where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and (date_close<=:withtoday) and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0) into :fk_ch2_tmp do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0; if (not exists(select field_key from bd_ch21 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.accept_flag,0)=0)) then update bd_ch2 set accept_flag=1 where field_key=:fk_ch2_tmp; end for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) t? Z {n e]-1SET TERM ^ ; create or ALTER PROCEDURE SP_REP_MATERIALS ( FK_BD_GRT_FIRM Integer ) RETURNS ( NAME Char(100), CNT Decimal(8,3), NAME1 Char(100), STOCK Decimal(8,3), FK_TOVAR Integer, FK_11 Integer, NAME_ED_IZM Varchar(30), fk_bd_firm integer, name_firm type of column bd_firm.name ) AS declare variable fk_tovar_out integer; begin for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.stock, t.name, bd_11.fk_bd_firm, bd_firm.name from bd_11 join bd_grt_firm_web w on w.fk_bd_firm=bd_11.fk_bd_firm and w.fk_bd_grt_firm=:fk_bd_grt_firm join BD_TOVAR t on t.FIELD_KEY=bd_11.FK_BD_TOVAR join bd_firm on bd_firm.FIELD_KEY=bd_11.fk_bd_firm where bd_11.valid_flag=1 and bd_11.stock>0 into :fk_11, :fk_tovar, :stock, :name1, :fk_bd_firm, :name_firm do begin for SELECT p.FK_TOVAR_OUT, sum(p.CNT_OUT) FROM SP_GET_MATERIALS(:fk_bd_grt_firm, :FK_TOVAR, :stock, :fk_11) p group by 1 into :fk_tovar_out, :cnt do begin select name, ed_izm_name from bd_tovar where field_key=:fk_tovar_out into :name, :name_ed_izm; suspend; end end end^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_REP_MATERIALS TO SYSDBA;отчет по незавершенке17.12.6.1sp_rep_materialsm !I-0SET TERM ^ ; CREATE OR ALTER PROCEDURE SP_GET_MATERIALS ( FK_BD_GRT_FIRM Integer, FK_TOVAR_IN Integer, CNT_IN Decimal(8,3), FK_BD_11_IN Integer ) RETURNS ( FK_TOVAR_OUT Integer, CNT_OUT Decimal(8,3), FK_BD_11_OUT Integer ) AS DECLARE VARIABLE fk_bd_1_in integer; DECLARE VARIABLE cnt_11 decimal(8,3); DECLARE VARIABLE koef decimal(8,3); DECLARE VARIABLE fk_tovar_mat integer; DECLARE VARIABLE cnt_mat decimal(8,3); --ушло на пCvl ea/ SET TERM ^ ; CREATE OR ALTER PROCEDURE SP_GET_6 ( FK_BD_1_IN Integer, FK_BD_11_IN Integer ) RETURNS ( FK_BD_1_OUT Integer, FK_BD_11_OUT Integer ) AS DECLARE VARIABLE fk_2 integer; DECLARE VARIABLE fk_11 integer; DECLARE VARIABLE fk_1 integer; BEGIN fk_2=null; select bd_2.FIELD_KEY, bd_21.FK_BD_11 from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.FIELD_KEY where bd_2.FK_BD_1_6=:fk_bd_1_in and bd_21.FK_BD_11_6=:fk_bd_11_in into :fk_2, :fk_11; if (fk_2 is null) then begin fk_bd_1_out=fk_bd_1_in; fk_bd_11_out=fk_bd_11_in; suspend; --нашли, что искали, приход не на основании расхода end else begin --ищем приход, с которого списывает найденный расход select fk_bd_1 from bd_11 where bd_11.field_key=:fk_11 into :fk_1; for select fk_bd_1_out, fk_bd_11_out from sp_get_6(:fk_1,:fk_11) into :fk_bd_1_out, :fk_bd_11_out do suspend; end END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_GET_6 TO SYSDBA;перемещения для отчета17.12.6.1 SP_GET_6Zk /5G.SET TERM ^ ; CREATE OR ALTER trigger tr_bd_tovar_oldkey_iu for bd_tovar active before insert position 0 AS BEGIN if (new.oldkey is null) then new.oldkey=1; if (exists(select first 1 oldkey from bd_tovar where oldkey=new.oldkey)) then new.oldkey=1; while (exists(select first 1 oldkey from bd_tovar where oldkey=new.oldkey)) do new.oldkey=new.oldkey+1; if (new.oldkey_str is null) then new.oldkey_str=new.oldkey; END^ SET TERM ; ^было нельзя установить свой oldkey_str при вставке17.12.2.1trigger tr_bd_tovar_oldkey_iu"j e-!'-COMMENT ON COLUMN BD_TOVAR.FRPRINT_FLAG IS 'Признак алкогольной продукции'; ALTER TABLE BD_TOVAR ADD FRPRINT2_FLAG SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_TOVAR.FRPRINT2_FLAG IS 'Признак печати товара на 2 принтере на кассе';Признак печати товара на 2 принтере на кассе17.11.25.1FRPRINT2_FLAGоизводство продукта DECLARE VARIABLE fk_bd_11_mat integer; --приход материалов DECLARE VARIABLE fk_bd_11_cnt_mat decimal(8,3); DECLARE VARIABLE is_razbor integer; DECLARE VARIABLE cnt_spis decimal(8,3); DECLARE VARIABLE sum_11 decimal(15,2); DECLARE VARIABLE sum_spis decimal(15,2); BEGIN select fk_bd_1 from bd_11 where field_key=:fk_bd_11_in into :fk_bd_1_in; --находим основание прихода-перемещение --цепочка перемещений, ищем то, которое будет конечным (не иметь расхода-основания) select s.fk_bd_1_out, s.fk_bd_11_out from sp_get_6(:fk_bd_1_in, :fk_bd_11_in) s into :fk_bd_1_in, :fk_bd_11_in; select cnt, SUMMA_WITH_NDS from bd_11 where field_key=:fk_bd_11_in into :cnt_11, :sum_11; select sum(SUMMA_WITH_NDS) from bd_11 where fk_bd_1=:fk_bd_1_in into :sum_spis; if ((cnt_11=0)or(sum_spis=0)) then exit; --дедение на ноль --если в списании единственный товар, значит это разбор, и требуется дп коэф корректировки select iif(count(*)=1,1,0) from bd_pr join bd_21 on bd_21.fk_bd_2=bd_pr.fk_bd_2 join bd_11 on bd_11.FIELD_KEY=bd_21.FK_BD_11 where bd_pr.fk_bd_1=:fk_bd_1_in into :is_razbor; if (is_razbor=1) then begin koef= cnt_in/cnt_11*sum_11/sum_spis; end else begin koef = cnt_in/cnt_11; end --если искомая партия = исходное сырье if /*(exists(select 1 from bd_11 join BD_GRT_FIRM_WEB w on w.fk_bd_firm=bd_11.fk_bd_firm and w.fk_bd_grt_firm=:fk_bd_grt_firm where bd_11.fk_bd_tovar=:FK_TOVAR_IN and bd_11.valid_flag=1 and not( exists(select fk_bd_firm from bd_grt_firm_web w2 where w2.fk_bd_grt_firm=:fk_bd_grt_firm and fk_bd_firm=bd_11.fk_supplier)))) */ ( not(exists( select bd_21.fk_bd_11, bd_11.CNT, bd_21.FK_BD_TOVAR, bd_21.CNT from bd_pr join bd_21 on bd_21.fk_bd_2=bd_pr.fk_bd_2 join bd_11 on bd_11.FIELD_KEY=bd_21.FK_BD_11 where bd_pr.fk_bd_1=:fk_bd_1_in ))) then BEGIN fk_tovar_out=:fk_tovar_in; cnt_out=cnt_in; suspend; exit; END --находим основание прихода for select bd_21.fk_bd_11, bd_11.CNT, bd_21.FK_BD_TOVAR, bd_21.CNT from bd_pr join bd_21 on bd_21.fk_bd_2=bd_pr.fk_bd_2 join bd_11 on bd_11.FIELD_KEY=bd_21.FK_BD_11 where bd_pr.fk_bd_1=:fk_bd_1_in into :fk_bd_11_mat, :fk_bd_11_cnt_mat, :fk_tovar_mat, :cnt_mat do BEGIN --списание по акту производства --если найденный товар=исходное сырье, возвращаем его с количеством скорректированным коэффециентом /* if (exists(select 1 from bd_11 join BD_GRT_FIRM_WEB w on w.fk_bd_firm=bd_11.fk_bd_firm and w.fk_bd_grt_firm=:fk_bd_grt_firm where bd_11.fk_bd_tovar=:fk_tovar_mat and bd_11.valid_flag=1 and not( exists(select fk_bd_firm from bd_grt_firm_web w2 where w2.fk_bd_grt_firm=:fk_bd_grt_firm and fk_bd_firm=bd_11.fk_supplier)))) then BEGIN fk_tovar_out=:fk_tovar_mat; cnt_out=cnt_mat*koef; suspend; END ELSE BEGIN --нет, это всего лишь промежуточное сырье */ --нужна рекурсия for select fk_tovar_out, cnt_out, fk_bd_11_out from sp_get_materials(:fk_bd_grt_firm,:fk_tovar_mat, :cnt_mat*:koef, :fk_bd_11_mat) into :fk_tovar_out, :cnt_out, :fk_bd_11_out do begin suspend; end /* END */ END --конец основание прихода-акт производства END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_GET_MATERIALS TO SYSDBA;сырье для отчета17.12.6.1SP_GET_MATERIALS_dogovor is null ),0))-(coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor is null ),0)-coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=7) and bd_2.fk_bd_dogovor is null ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and ks_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=1 and ks_1.fk_bd_dogovor is null ),0) ) as summa, 1 as typerec from bd_firm a where a.GET_KS_post=1 and coalesce(sklad,0)=0 ----------------------------------------------------------- UNION select a.field_key, a.name, d.nomer_partner, d.field_key as fk_bd_dogovor, ( coalesce(( select sum(summa_dolg) from bd_1 where fk_supplier=a.field_key -- and fk_selful=:fk_selful and fk_selful_from is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and bd_1.fk_bd_dogovor=d.field_key and coalesce(bd_1.cod_prih,0)<>9 ),0)-coalesce(( select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=a.field_key -- and fk_selful=:fk_selful and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=5 ) and bd_2.fk_bd_dogovor=d.field_key ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and KS_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=0 and ks_1.fk_bd_dogovor=d.field_key ),0))-(coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor=d.field_key ),0)-coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=a.field_key -- and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=7) and bd_2.fk_bd_dogovor=d.field_key ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and ks_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=1 and ks_1.fk_bd_dogovor=d.field_key ),0)) as summa, 3 as typerec from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key where a.GET_KS_post=1 and coalesce(sklad,0)=0 ;неверно считались долги17.12.13.1 VIEW DOLGI_ALL_SELFUL  ^m6B{v[m+9update BD_TOVAR a set a.NO_BONUS_CALC=0проставляем нули в no_bonus_calc18.1.8.1update bd_tovaru q)8ALTER TABLE BD_TOVAR ADD no_bonus_calc BOOLFIELD;флажок у товара "не начислять бонусы"18.1.8.1alter bd_tovarTt; !Y7delete from bd_vesi_grp17.12.28.1удалить группы весовgs; !6delete from bd_vesi_arc17.12.28.1очистить архив весового товараIr uk!)5alter table bd_tovar add PRINUD_SROK_FLAG boolfield;обязательное проставление сроков годности при приходовании17.12.24.1alter bd_tovarYq 59!94SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_DATA_FOR_EDS ( FK_1 integer, FK_2 integer) returns ( COD_SKL char(50), INN_SKL char(50), NAME_SKL char(100), SNAME_SKL char(100), LABEL_SKL char(50), PHONE_SKL char(100), ADRSU_SKL char(100), ADRSG_SKL char(100), KPP_SKL char(100), OGRN_SKL char(100), OKPO_SKL char(100), OKOHX_SKL char(100), COD_POST_POL char(50), INN_POST_POL char(50), Fpwe!-3ALTER TABLE BD_BUDGET_J_STAT ADD LEVEL_OUT SMALLINT;LEVEL_OUT для печатной формы17.12.24.1BD_BUDGET_J_STAT o me!92SET AUTODDL ON; DROP VIEW DOLGI_ALL_SELFUL; /**************** DROPPING COMPLETE ***************/ CREATE VIEW DOLGI_ALL_SELFUL (FIELD_KEY, NAME, NOMER_PARTNER, FK_BD_DOGOVOR, SUMMA, TYPEREC) AS -- vse dolgi storonnih kontragentov po vsem urlicam. otricatelnoe chislo nam dolzhny. polozhitelboe - my dolzhni select a.field_key, a.name, '' as nomer_partner, null as fk_bd_dogovor, ( coalesce(( select sum(summa_dolg) from bd_1 where fk_supplier=a.field_key -- and fk_selful=:fk_selful and fk_selful_from is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and bd_1.fk_bd_dogovor is null and coalesce(bd_1.cod_prih,0)<>9 ),0)-coalesce(( select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=a.field_key -- and fk_selful=:fk_selful and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=5 ) and bd_2.fk_bd_dogovor is null ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key -- and KS_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=0 and ks_1.fk_bdDGNAME_POST_POL char(100), SNAME_POST_POL char(100), LABEL_POST_POL char(50), POST_POL_IS_S integer, NOMER_NAKL char(20), DATE_NAKL date, NOMER char(20), DATA date, NOMER_SF char(20), DATE_SF date, SUMMA_NAKL decimal(15,3), FACE char(50), PRIM_REAL char(100), COD_REAL char(5), DATE_REAL date, LASTDATE date, LASTTIME time, NDS_YES integer, MARK integer, COD_GRT char(20), NAME_GRT char(50), COD_SGRT char(20), NAME_SGRT char(50), COD_TOV char(20), NAME char(100), FULLNAME char(150), ED_IZM char(50), BARCODE char(30), ARTICLE char(50), PRIORITET integer, CNT decimal(7,3), CENA_PR decimal(15,3), CENA_RASH decimal(15,3), SUMMA_NDS decimal(18,4), SUMMA_PR decimal(18,4), OSTATOK decimal(10,3), CENA1 decimal(15,3), CENA2 decimal(15,3), CENA3 decimal(15,3), DATE_SAVE date, DAY_SAVE integer, DATE_MADE date, NDS decimal(5,2), INPLACE decimal(9,2), MINPARTY decimal(5,2), MADE char(100), NOM_DEKL char(30), LAND_DEKL char(100), OLDKEY char(20)) as begin if (fk_1 is not null) then begin select bd_firm.oldkey fk_bd_firm, bd_firm.inn, bd_firm.fullname, bd_firm.name, bd_firm.mark, bd_firm.phone, bd_firm.uaddr, bd_firm.gaddr, bd_firm.kpp, bd_firm.ogrn, bd_firm.okpo, bd_firm.okonh, bd_sup.oldkey fk_supplier, bd_sup.inn, bd_sup.fullname, bd_sup.name, bd_sup.mark, bd_sup.sklad, bd_1.nomer_nakl, bd_1.date_nakl, bd_1.nomer_prih, bd_1.date_prih, bd_1.nomer_sf, bd_1.date_sf, bd_face.name, bd_1.comm, bd_1.cod_prih, dateadd(day,bd_1.day_cons_prih,current_date), bd_1.date_prih, bd_1.time_prih, bd_1.price_nds_flag, bd_1.marker from bd_1 join bd_firm on (bd_firm.field_key=bd_1.fk_bd_firm) join bd_firm bd_sup on (bd_sup.field_key=bd_1.fk_supplier) left join bd_face on (bd_face.field_key=bd_1.fk_face) where (bd_1.field_key=:fk_1) into :cod_skl, :inn_skl, :name_skl, :sname_skl, :label_skl, :phone_skl, :adrsu_skl, :adrsg_skl, :kpp_skl, :ogrn_skl, :okpo_skl, :okohx_skl, :cod_post_pol, :inn_post_pol, :name_post_pol, :sname_post_pol, :label_post_pol, :post_pol_is_s, :nomer_nakl, :date_nakl, :nomer, :data, :nomer_sf, :date_sf, :face, :prim_real, :cod_real, :date_real, :lastdate, :lasttime, :nds_yes, :mark; select sum(bd_11.cena_pr_with_nds*bd_11.cnt) from bd_11 where bd_11.fk_bd_1=:fk_1 into :summa_nakl; for select bd_grt_tovar.field_key, bd_grt_tovar.name, bd_sgrt.field_key, bd_sgrt.name, bd_tovar.oldkey, bd_tovar.name, bd_tovar.fullname, bd_ed_izm.name, (select first 1 scancod from bd_scan where fk_bd_tovar=bd_11.fk_bd_tovar), bd_tovar.articul, bd_11.priority, bd_11.cnt, bd_11.cena_pr_with_nds, bd_11.summa_nds, (bd_11.cena_pr_with_nds*bd_11.cnt), bd_11.stock, (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=1), (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=2), (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=3), bd_11.date_save, dateadd(day,0-(bd_tovar.day_save),bd_11.date_save), bd_tovar.day_save, coalesce(bd_11.nds,bd_tovar.nds), coalesce(bd_11.inplace,bd_tovar.inplace), 1, coalesce(bd_tovar.made,bd_tovar.land),bd_tovar.oldkey from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) left join bd_grt_tovar bd_sgrt on (bd_sgrt.field_key=bd_tovar.fk_grt) left join bd_grt_tovar on (bd_grt_tovar.field_key=bd_sgrt.parent) left join bd_ed_izm on (bd_ed_izm.field_key=bd_tovar.fk_bd_ed_izm) where (bd_11.fk_bd_1=:fk_1) into :cod_grt, :name_grt, :cod_sgrt, :name_sgrt, :cod_tov, :name, :fullname, :ed_izm, :barcode, :article, :prioritet, :cnt, :cena_pr, :summa_nds, :summa_pr, :ostatok, :cena1, :cena2, :cena3, :date_save, :date_made, :day_save, :nds, :inplace, :minparty, :made, :oldkey do suspend; end if (fk_2 is not null) then begin select bd_firm.oldkey fk_bd_firm, bd_firm.inn, bd_firm.fullname, bd_firm.name, bd_firm.mark, bd_firm.phone, bd_firm.uaddr, bd_firm.gaddr, bd_firm.kpp, bd_firm.ogrn, bd_firm.okpo, bd_firm.okonh, bd_sup.oldkey fk_recipient, bd_sup.inn, bd_sup.fullname, bd_sup.name, bd_sup.mark, bd_sup.sklad, bd_2.nomer_nakl, bd_2.date_nakl, bd_2.nomer_rash, bd_2.date_rash, bd_2.nomer_sf, bd_2.date_sf, bd_face.name, bd_2.comment, bd_2.cod_rash, dateadd(day,bd_2.day_cons_rash,current_date), bd_2.date_rash, current_time, bd_firm.prih_nds_flag, bd_2.marker from bd_2 join bd_firm on (bd_firm.field_key=bd_2.fk_bd_firm) join bd_firm bd_sup on (bd_sup.field_key=bd_2.fk_recipient) left join bd_face on (bd_face.field_key=bd_2.fk_face) where (bd_2.field_key=:fk_2) into :cod_skl, :inn_skl, :name_skl, :sname_skl, :label_skl, :phone_skl, :adrsu_skl, :adrsg_skl, :kpp_skl, :ogrn_skl, :okpo_skl, :okohx_skl, :cod_post_pol, :inn_post_pol, :name_post_pol, :sname_post_pol, :label_post_pol, :post_pol_is_s, :nomer_nakl, :date_nakl, :nomer, :data, :nomer_sf, :date_sf, :face, :prim_real, :cod_real, :date_real, :lastdate, :lasttime, :nds_yes, :mark; select sum(bd_21.summa) from bd_21 where bd_21.fk_bd_2=:fk_2 into :summa_nakl; for select bd_grt_tovar.field_key, bd_grt_tovar.name, bd_sgrt.field_key, bd_sgrt.name, bd_tovar.oldkey, bd_tovar.name, bd_tovar.fullname, bd_ed_izm.name, (select first 1 scancod from bd_scan where fk_bd_tovar=bd_11.fk_bd_tovar), bd_tovar.articul, bd_11.priority, bd_21.cnt, bd_21.cena_with_nds, -- cast(bd_21.CENA_WITH_NDS as decimal(15,2)), cast(bd_11.cena_pr_with_nds as decimal(15,2)), ((bd_21.cena_with_nds*bd_21.cnt)-(bd_21.cena_without_nds*bd_21.cnt)), bd_21.summa, bd_11.stock, (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=1), (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=2), bd_21.cena_with_nds, bd_11.date_save, dateadd(day,0-(bd_tovar.day_save),bd_11.date_save), bd_tovar.day_save, coalesce(bd_11.nds,bd_tovar.nds), coalesce(bd_11.inplace,bd_tovar.inplace), 1, coalesce(bd_tovar.made,bd_tovar.land), bd_tovar.oldkey from bd_21 join bd_11 on (bd_11.field_key=bd_21.fk_bd_11) join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) left join bd_grt_tovar bd_sgrt on (bd_sgrt.field_key=bd_tovar.fk_grt) left join bd_grt_tovar on (bd_grt_tovar.field_key=bd_sgrt.parent) left join bd_ed_izm on (bd_ed_izm.field_key=bd_tovar.fk_bd_ed_izm) where (bd_21.fk_bd_2=:fk_2) into :cod_grt, :name_grt, :cod_sgrt, :name_sgrt, :cod_tov, :name, :fullname, :ed_izm, :barcode, :article, :prioritet, :cnt, :cena_rash, :cena_pr, :summa_nds, :summa_pr, :ostatok, :cena1, :cena2, :cena3, :date_save, :date_made, :day_save, :nds, :inplace, :minparty, :made, :oldkey do suspend; end end^ SET TERM ; ^SP_CREATE_DATA_FOR_EDS17.12.24.1SP_CREATE_DATA_FOR_EDS 3 k34z )wA=SET TERM ^ ; ALTER PROCEDURE SP_SET_DISCOUNT_BONUS_CALC ( ID_FIRM Integer DEFAULT null ) AS declare variable AUTO_CALC_BONUS integer; declare variable BONUS_PERCENT decimal(5,2); declare variable ID_CH2 integer; declare variable IDCARD varchar(30); declare variable SUMMABONUS decimal(15,2); begin if (id_firm is null) then exit; select first 1 coalesce(paramvalue,0) from global_options where paramname='auto_calc_bonus' into :auto_calc_bonus; if (coalesce(auto_calc_bonus,0)=0) then exit; select first 1 coalesce(paramvalue,0) from global_options where paramname='bonus_percent' into :bonus_percent; if (coalesce(bonus_percent,0)=0) then exit; bonus_percent=:bonus_percent/100; if (bonus_percent>1) then exit; for SELECT bd_ch2.IDCARD, coalesce(:bonus_percent*(BD_CH2.summa-coalesce((select sum(bd_ch21.SUMPOS_WITH_DISCOUNT) from bd_ch21 join bd_tovar t on t.field_key=bd_ch21.FK_BD_TOVAR where bd_ch21.FK_BD_CH2=bd_ch2.FIELD_KEY and t.NO_BONUS_CALC=1),0)),0) as summa, bd_ch2.field_key FROM BD_CH2 --join BD_DISC_CARD on BD_DISC_CARD.IDCARD=bd_ch2.IDCARD where bd_ch2.fk_bd_firm=:id_firm and coalesce(bd_ch2.need_bonus_flag,0)=1 into :idcard, :summabonus, :id_ch2 do begin update bd_ch2 set need_bonus_flag=0, SUMMA_BONUS_ACCRUED=:summabonus where field_key=:id_ch2; update bd_disc_card set sum_bonus_ost = coalesce(sum_bonus_ost,0) + :summabonus where idcard=:idcard; end end ^ SET TERM ; ^начисление бонусов по картам18.1.11.1SP_SET_DISCOUNT_BONUS_CALC.y S1) then exit; for SELECT bd_ch2.IDCARD, coalesce(:bonus_percent*(BD_CH2.summa-coalesce((select bd_ch21.SUMPOS_WITH_DISCOUNT from bd_ch21 join bd_tovar t on t.field_key=bd_ch21.FK_BD_TOVAR where bd_ch21.FK_BD_CH2=bd_ch2.FIELD_KEY and t.NO_BONUS_CALC=1),0)),0) as summa, bd_ch2.field_key FROM BD_CH2 --join BD_DISC_CARD on BD_DISC_CARD.IDCARD=bd_ch2.IDCARD where bd_ch2.fk_bd_firm=:id_firm and coalesce(bd_ch2.need_bonus_flag,0)=1 into :idcard, :summabonus, :id_ch2 do begin update bd_ch2 set need_bonus_flag=0, SUMMA_BONUS_ACCRUED=:summabonus where field_key=:id_ch2; update bd_disc_card set sum_bonus_ost = coalesce(sum_bonus_ost,0) + :summabonus where idcard=:idcard; end end ^ SET TERM ; ^не начисляем бонусы по товарам с флажком "не начислять"18.1.8.1ALTER PROCEDURE SP_SET_DISCOUNT_BONUS_CALCJNAME_POST_POL char(100), SNAME_POST_POL char(100), LABEL_POST_POL char(50), POST_POL_IS_S integer, NOMER_NAKL char(20), DATE_NAKL date, NOMER char(20), DATA date, NOMER_SF char(20), DATE_SF date, SUMMA_NAKL decimal(15,3), FACE char(50), PRIM_REAL char(100), COD_REAL char(5), DATE_REAL date, LASTDATE date, LASTTIME time, NDS_YES integer, MARK integer, COD_GRT char(20), NAME_GRT char(50), COD_SGRT char(20), NAME_SGRT char(50), COD_TOV char(20), NAME char(100), FULLNAME char(150), ED_IZM char(50), BARCODE char(30), ARTICLE char(50), PRIORITET integer, CNT decimal(7,3), CENA_PR decimal(15,3), CENA_RASH decimal(15,3), SUMMA_NDS decimal(18,4), SUMMA_PR decimal(18,4), OSTATOK decimal(10,3), CENA1 decimal(15,3), CENA2 decimal(15,3), CENA3 decimal(15,3), DATE_SAVE date, DAY_SAVE integer, DATE_MADE date, NDS decimal(5,2), INPLACE decimal(9,2), MINPARTY decimal(5,2), MADE char(100), NOM_DEKL char(30), LAND_DEKL char(100), OLDKEY char(20)) as begin if (fk_1 is not null) then begin select bd_firm.oldkey fk_bd_firm, bd_firm.inn, bd_firm.fullname, bd_firm.name, bd_firm.mark, bd_firm.phone, bd_firm.uaddr, bd_firm.gaddr, bd_firm.kpp, bd_firm.ogrn, bd_firm.okpo, bd_firm.okonh, bd_sup.oldkey fk_supplier, bd_sup.inn, bd_sup.fullname, bd_sup.name, bd_sup.mark, bd_sup.sklad, bd_1.nomer_nakl, bd_1.date_nakl, bd_1.nomer_prih, bd_1.date_prih, bd_1.nomer_sf, bd_1.date_sf, bd_face.name, bd_1.comm, bd_1.cod_prih, dateadd(day,bd_1.day_cons_prih,current_date), bd_1.date_prih, bd_1.time_prih, bd_1.price_nds_flag, bd_1.marker from bd_1 join bd_firm on (bd_firm.field_key=bd_1.fk_bd_firm) join bd_firm bd_sup on (bd_sup.field_key=bd_1.fk_supplier) left join bd_face on (bd_face.field_key=bd_1.fk_face) where (bd_1.field_key=:fk_1) into :cod_skl, :inn_skl, :name_skl, :sname_skl, :label_skl, :phone_skl, :adrsu_skl, :adrsg_skl, :kpp_skl, :ogrn_skl, :okpo_skl, :okohx_skl, :cod_post_pol, :inn_post_pol, :name_post_pol, :sname_post_pol, :label_post_pol, :post_pol_is_s, :nomer_nakl, :date_nakl, :nomer, :data, :nomer_sf, :date_sf, :face, :prim_real, :cod_real, :date_real, :lastdate, :lasttime, :nds_yes, :mark; select sum(bd_11.cena_pr_with_nds*bd_11.cnt) from bd_11 where bd_11.fk_bd_1=:fk_1 into :summa_nakl; for select bd_grt_tovar.field_key, bd_grt_tovar.name, bd_sgrt.field_key, bd_sgrt.name, bd_tovar.oldkey_str, bd_tovar.name, bd_tovar.fullname, bd_ed_izm.name, (select first 1 scancod from bd_scan where fk_bd_tovar=bd_11.fk_bd_tovar), bd_tovar.articul, bd_11.priority, bd_11.cnt, bd_11.cena_pr_with_nds, bd_11.summa_nds, (bd_11.cena_pr_with_nds*bd_11.cnt), bd_11.stock, (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=1), (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=2), (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=3), bd_11.date_save, dateadd(day,0-(bd_tovar.day_save),bd_11.date_save), bd_tovar.day_save, coalesce(bd_11.nds,bd_tovar.nds), coalesce(bd_11.inplace,bd_tovar.inplace), 1, coalesce(bd_tovar.made,bd_tovar.land),bd_tovar.oldkey_str from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) left join bd_grt_tovar bd_sgrt on (bd_sgrt.field_key=bd_tovar.fk_grt) left join bd_grt_tovar on (bd_grt_tovar.field_key=bd_sgrt.parent) left join bd_ed_izm on (bd_ed_izm.field_key=bd_tovar.fk_bd_ed_izm) where (bd_11.fk_bd_1=:fk_1) into :cod_grt, :name_grt, :cod_sgrt, :name_sgrt, :cod_tov, :name, :fullname, :ed_izm, :barcode, :article, :prioritet, :cnt, :cena_pr, :summa_nds, :summa_pr, :ostatok, :cena1, :cena2, :cena3, :date_save, :date_made, :day_save, :nds, :inplace, :minparty, :made, :oldkey do suspend; end if (fk_2 is not null) then begin select bd_firm.oldkey fk_bd_firm, bd_firm.inn, bd_firm.fullname, bd_firm.name, bd_firm.mark, bd_firm.phone, bd_firm.uaddr, bd_firm.gaddr, bd_firm.kpp, bd_firm.ogrn, bd_firm.okpo, bd_firm.okonh, bd_sup.oldkey fk_recipient, bd_sup.inn, bd_sup.fullname, bd_sup.name, bd_sup.mark, bd_sup.sklad, bd_2.nomer_nakl, bd_2.date_nakl, bd_2.nomer_rash, bd_2.date_rash, bd_2.nomer_sf, bd_2.date_sf, bd_face.name, bd_2.comment, bd_2.cod_rash, dateadd(day,bd_2.day_cons_rash,current_date), bd_2.date_rash, current_time, bd_firm.prih_nds_flag, bd_2.marker from bd_2 join bd_firm on (bd_firm.field_key=bd_2.fk_bd_firm) join bd_firm bd_sup on (bd_sup.field_key=bd_2.fk_recipient) left join bd_face on (bd_face.field_key=bd_2.fk_face) where (bd_2.field_key=:fk_2) into :cod_skl, :inn_skl, :name_skl, :sname_skl, :label_skl, :phone_skl, :adrsu_skl, :adrsg_skl, :kpp_skl, :ogrn_skl, :okpo_skl, :okohx_skl, :cod_post_pol, :inn_post_pol, :name_post_pol, :sname_post_pol, :label_post_pol, :post_pol_is_s, :nomer_nakl, :date_nakl, :nomer, :data, :nomer_sf, :date_sf, :face, :prim_real, :cod_real, :date_real, :lastdate, :lasttime, :nds_yes, :mark; select sum(bd_21.summa) from bd_21 where bd_21.fk_bd_2=:fk_2 into :summa_nakl; for select bd_grt_tovar.field_key, bd_grt_tovar.name, bd_sgrt.field_key, bd_sgrt.name, bd_tovar.oldkey_str, bd_tovar.name, bd_tovar.fullname, bd_ed_izm.name, (select first 1 scancod from bd_scan where fk_bd_tovar=bd_11.fk_bd_tovar), bd_tovar.articul, bd_11.priority, bd_21.cnt, bd_21.cena_with_nds, -- cast(bd_21.CENA_WITH_NDS as decimal(15,2)), cast(bd_11.cena_pr_with_nds as decimal(15,2)), ((bd_21.cena_with_nds*bd_21.cnt)-(bd_21.cena_without_nds*bd_21.cnt)), bd_21.summa, bd_11.stock, (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=1), (select cenan from getcurcena(bd_11.fk_bd_tovar) where fkcena=2), bd_21.cena_with_nds, bd_11.date_save, dateadd(day,0-(bd_tovar.day_save),bd_11.date_save), bd_tovar.day_save, coalesce(bd_11.nds,bd_tovar.nds), coalesce(bd_11.inplace,bd_tovar.inplace), 1, coalesce(bd_tovar.made,bd_tovar.land), bd_tovar.oldkey_str from bd_21 join bd_11 on (bd_11.field_key=bd_21.fk_bd_11) join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) left join bd_grt_tovar bd_sgrt on (bd_sgrt.field_key=bd_tovar.fk_grt) left join bd_grt_tovar on (bd_grt_tovar.field_key=bd_sgrt.parent) left join bd_ed_izm on (bd_ed_izm.field_key=bd_tovar.fk_bd_ed_izm) where (bd_21.fk_bd_2=:fk_2) into :cod_grt, :name_grt, :cod_sgrt, :name_sgrt, :cod_tov, :name, :fullname, :ed_izm, :barcode, :article, :prioritet, :cnt, :cena_rash, :cena_pr, :summa_nds, :summa_pr, :ostatok, :cena1, :cena2, :cena3, :date_save, :date_made, :day_save, :nds, :inplace, :minparty, :made, :oldkey do suspend; end end^ SET TERM ; ^oldkey заменен на oldkey_str18.1.11.1SP_CREATE_DATA_FOR_EDS  ` xCjwk7GMCREATE GENERATOR GEN_BD_MACROS_AFTER_PARAMS_ID;14 генератор18.1.11.1GEN_BD_MACROS_AFTER_PARAMS_IDw {SLcreate table BD_MACROS_AFTER_PARAMS ( field_key integer not null primary key, fk_bd_macros integer, fk_bd_macros_params integer, valuetype char(1), valuefrom varchar(100), fk_bd_macros_atom_params Integer, paramname varchar(100), params_type Char(1) );13 параметры дочернего макроса18.1.11.1create table BD_MACROS_AFTER_PARAMSyq?KALTER TABLE BD_MACROS ADD fk_bd_macros_after Integer;12 ссылка на дочерний макрос18.1.11.1ALTER TABLE BD_MACROS ADDaa;JALTER TABLE BD_MACROS_J ADD bigprim Blob;11 комментарий процесса18.1.11.1ALTER TABLE BD_MACROS_J: MIINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Видеть БП чужих авторов', 'macros_j_allavtor', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='macros_j')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Видеть БП чужих текущих владельцев', 'macros_j_allowner', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='macros_j')); 10 права просмотр чужих макросов18.1.11.1INSERT INTO BD_USERS_RIGHTS_NAMEsmCHALTER TABLE BD_MACROS_J ADD fk_curr_owner Integer; 9 макрос - текущий владелец18.1.11.1ALTER TABLE BD_MACROS_J ADDaMFALTER TABLE BD_MACROS_J_PARAMOUT ADD number_run Integer; 8 макрос - номер запуска18.1.11.1ALTER TABLE BD_MACROS_J_PARAMOUTwoAEALTER TABLE BD_MACROS_ATOM ADD fk_stop_user Integer; 7 ожидание решение от юзера18.1.11.1ALTER TABLE BD_MACROS_ATOMt 5]OCCREATE TRIGGER BD_MACROS_J_STEP_BI FOR BD_MACROS_J_STEP ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_MACROS_J_STEP_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_MACROS_J_STEP_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_MACROS_J_STEP_ID, new.FIELD_KEY-tmp); END END 6 шаги макроса триггер18.1.11.1CREATE TRIGGER BD_MACROS_J_STEP_B _eOBCREATE GENERATOR GEN_BD_MACROS_J_STEP_ID;5 генератор шаги макроса18.1.11.1GENERATOR GEN_BD_MACROS_J_STEP_ID>~ o?GACREATE TABLE BD_MACROS_J_STEP ( FIELD_KEY Integer NOT NULL, NAME Varchar(200), RESULT_FLAG BOOLFIELD, RESULT_TXT varchar(200), fk_bd_macros_j Integer, fk_bd_ma Integer, number_run integer, PRIMARY KEY (FIELD_KEY) );4 шаги макроса18.1.11.1CREATE TABLE BD_MACROS_J_STEP}uEA@ALTER TABLE BD_MACROS_ATOM ADD stop_flag BOOLFIELD;3 атом стоп-флаг18.1.11.1ALTER TABLE BD_MACROS_ATOM8| As5?UPDATE BD_CHILD_DOCS SET NAME = 'Бизнес-процесс', SQL = 'select a.field_key, ''БП № ''||a.nomer_create, a.date_create, a.fk_bd_firm, skl.name, 0, 0, 0, coalesce(valid_flag,0) from BD_MACROS_J a join BD_FIRM skl on skl.field_key=a.FK_BD_FIRM where a.FIELD_KEY=:fk_parent' WHERE name = 'Макрос';2 переименование связей в БП18.1.11.1UPDATE BD_CHILD_DOCS`{  oA>UPDATE BD_USERS_RIGHTS_NAME SET NAME = 'Бизнес-процессы' WHERE trim(name_var) = 'macros'; UPDATE BD_USERS_RIGHTS_NAME SET NAME = 'Настройка типов бизнес-процессов' WHERE trim(name_var) = 'macros_edit_macros'; UPDATE BD_USERS_RIGHTS_NAME SET NAME = 'Журнал бизнес-процессов' WHERE trim(name_var) = 'macros_j';1 переименование прав на БП18.1.11.1UPDATE BD_USERS_RIGHTS_NAM ! Z i !zqK3SALTER TABLE BD_FIRM ALTER FULLNAME TYPE Char(150);увеличиваем fullname18.1.23.1ALTER TABLE BD_FIRMW w/RSET TERM ^ ; ALTER PROCEDURE SP_GET_PARENT_DOC ( FK_DOC Integer, TYPE_DOC Integer ) RETURNS ( FK_PARENT Integer, TYPE_PARENT Integer ) AS BEGIN if (type_doc=1) then ---приход begin for select field_key from bd_9 where fk_bd_1=:fk_doc into :fk_parent do begin --ревизия type_parent=5; suspend; exit; end for select field_key from bd_pr where fk_bd_1=:fk_doc into :fk_parent do begin --акт пр-ва type_parent=6; suspend; exit; end for select fk_bd_2 from BD_2_1_IZL where fk_bd_1=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end for select field_key from BD_2 where fk_bd_1_6=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end for select FK_ORDER_IN from BD_1 where field_key=:fk_doc into :fk_parent do begin --заказ пост type_parent=3; suspend; exit; end end ---расход if (type_doc=2) then begin for select field_key from bd_9 where fk_bd_2=:fk_doc into :fk_parent do begin --ревизия type_parent=5; suspend; exit; end for select field_key from bd_pr where fk_bd_2=:fk_doc into :fk_parent do begin --акт пр-ва type_parent=6; suspend; exit; end for select fk_bd_order_out_1 from bd_2 where field_key=:fk_doc and fk_bd_order_out_1 is not null into :fk_parent do begin --заявка покупателя type_parent=4; suspend; exit; end for select field_key from bd_retrobonus where fk_bd_2 = :fk_doc into :fk_parent do begin --ретробонус type_parent = 8; suspend; exit; end for select field_key from bd_pr_zakaz_firm where field_key in (select fk_bd_pr_zakaz_firm from bd_pr_zakOd g?QINSERT INTO BD_CHILD_DOCS (DOC_TYPE, NAME, PARENT_TYPE, SQL, fk_parent) VALUES ('14', 'Бизнес-процесс', NULL, 'select a.field_key, ''БП № ''||a.nomer_create, a.date_create, a.fk_bd_firm, skl.name, 0, 0, 0, coalesce(valid_flag,0), 999999999 from BD_MACROS_J a join BD_FIRM skl on skl.field_key=a.FK_BD_FIRM where a.fk_bd_macros_j=:fk_parent', 171);18 связи - дочерний макрос18.1.11.1INSERT INTO BD_CHILD_DOCSf wGPSET TERM ^ ; create or ALTER PROCEDURE SP_CREATE_SUBMACROS ( FK_PARENT Integer ) RETURNS ( FK_NEW Integer ) AS DECLARE VARIABLE fk_type_macros integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE fk_user integer; DECLARE VARIABLE parent_macros_type integer; DECLARE VARIABLE PARAMNAME type of column BD_MACROS_PARAMS.PARAMNAME; DECLARE VARIABLE PARAMTYPE type of column BD_MACROS_PARAMS.PARAMTYPE; DECLARE VARIABLE DESCRIPTION type of column BD_MAM u;OALTER TABLE BD_MACROS_J ADD fk_bd_macros_j Integer;16 ссылка на родительский макрос18.1.11.1ALTER TABLE BD_MACROS_J q/]NCREATE TRIGGER BD_MACROS_AFTER_PARAMS_BI FOR BD_MACROS_AFTER_PARAMS ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_MACROS_AFTER_PARAMS_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_MACROS_AFTER_PARAMS_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_MACROS_AFTER_PARAMS_ID, new.FIELD_KEY-tmp); END END15 триггер18.1.11.1CREATE TRIGGER BD_MACROS_AFTER_PARAMS_BINCROS_PARAMS.DESCRIPTION; DECLARE VARIABLE LIST_TABLE type of column BD_MACROS_PARAMS.LIST_TABLE; DECLARE VARIABLE LIST_KEY type of column BD_MACROS_PARAMS.LIST_KEY; DECLARE VARIABLE LIST_RESULT type of column BD_MACROS_PARAMS.LIST_RESULT; DECLARE VARIABLE LIST_WHERE type of column BD_MACROS_PARAMS.LIST_WHERE; DECLARE VARIABLE LIST_MULTY type of column BD_MACROS_PARAMS.LIST_MULTY; DECLARE VARIABLE LIST_ORDER type of column BD_MACROS_PARAMS.LIST_ORDER; DECLARE VARIABLE PARAMKEY type of column BD_MACROS_J_PARAMS.PARAMKEY; DECLARE VARIABLE PARAMVALUE type of column BD_MACROS_J_PARAMS.PARAMVALUE; DECLARE VARIABLE PARAMSIZE type of column BD_MACROS_PARAMS.PARAMSIZE; DECLARE VARIABLE FK_BD_MACROS_PARAMS type of column BD_MACROS_J_PARAMS.FK_BD_MACROS_PARAMS; DECLARE VARIABLE NOCHANGE_DEFVALUE_FLAG type of column BD_MACROS_PARAMS.NOCHANGE_DEFVALUE_FLAG; declare variable last_number_run integer; declare variable FK_BD_TOVAR integer; declare variable FK_BD_11 integer; declare variable CNT type of column BD_MACROS_J_TOVAR.CNT; declare variable CENA type of column BD_MACROS_J_TOVAR.CENA; declare variable fk_bd_11_handle_in integer; BEGIN fk_user = (select field_key from bd_users where upper(login)=current_user); select m.FK_BD_MACROS_AFTER, j.FK_BD_FIRM, j.FK_BD_MACROS from bd_macros m join BD_MACROS_J j on j.FK_BD_MACROS=m.FIELD_KEY where j.field_key=:fk_parent into :fk_type_macros, :fk_bd_firm, :parent_macros_type; --создание нового макроса INSERT INTO BD_MACROS_J (NOMER_CREATE, DATE_CREATE, TS_CREATE, FK_AVTOR, VALID_FLAG, FK_BD_MACROS, FK_BD_FIRM, PRIM, FK_CURR_OWNER, BIGPRIM, FK_BD_MACROS_J) VALUES ((select max(NOMER_CREATE+1) from bd_macros_j where fk_bd_firm=:fk_bd_firm), current_date, current_timestamp, :fk_user, 0,:fk_type_macros, :FK_BD_FIRM, 'by macros', :fk_user, null, :fk_parent) returning field_key into :fk_new; --параметры макроса из параметров макроса for SELECT p.PARAMNAME, m.PARAMTYPE, m.DESCRIPTION, m.LIST_TABLE, m.LIST_KEY, m.LIST_RESULT, m.LIST_WHERE, m.LIST_MULTY, m.LIST_ORDER, a.PARAMKEY, a.PARAMVALUE, m.PARAMSIZE, m.FIELD_KEY, m.NOCHANGE_DEFVALUE_FLAG FROM BD_MACROS_AFTER_PARAMS p join BD_MACROS_J_PARAMS a on a.FK_BD_MACROS_PARAMS=p.FK_BD_MACROS_ATOM_PARAMS join BD_MACROS_PARAMS m on m.FIELD_KEY=p.FK_BD_MACROS_PARAMS where p.FK_BD_MACROS=:parent_macros_type and p.VALUETYPE='M' and a.FK_BD_MACROS_J=:fk_parent and p.FK_BD_MACROS_ATOM_PARAMS<>-1 into :PARAMNAME, :PARAMTYPE, :DESCRIPTION, :LIST_TABLE, :LIST_KEY, :LIST_RESULT, :LIST_WHERE, :LIST_MULTY, :LIST_ORDER, :PARAMKEY, :PARAMVALUE, :PARAMSIZE, :FK_BD_MACROS_PARAMS, :NOCHANGE_DEFVALUE_FLAG do begin INSERT INTO BD_MACROS_J_PARAMS (FK_BD_MACROS_J, PARAMNAME, PARAMTYPE, DESCRIPTION, LIST_TABLE, LIST_KEY, LIST_RESULT, LIST_WHERE, LIST_MULTY, LIST_ORDER, PARAMKEY, PARAMVALUE, PARAMSIZE, FK_BD_MACROS_PARAMS, NOCHANGE_DEFVALUE_FLAG) VALUES (:fk_new,:PARAMNAME,:PARAMTYPE, :DESCRIPTION, :LIST_TABLE, :LIST_KEY, :LIST_RESULT, :LIST_WHERE, :LIST_MULTY, :LIST_ORDER, :PARAMKEY, :PARAMVALUE, :PARAMSIZE, :FK_BD_MACROS_PARAMS, :NOCHANGE_DEFVALUE_FLAG); end --параемтры макроса из выходных параметров атомов last_number_run=(select max(number_run) from BD_MACROS_J_PARAMOUT where BD_MACROS_J_PARAMOUT.FK_BD_MACROS_J=:fk_parent); for SELECT ap.PARAMNAME, mp.PARAMTYPE, mp.DESCRIPTION, mp.LIST_TABLE, mp.LIST_KEY, mp.LIST_RESULT, mp.LIST_WHERE, mp.LIST_MULTY, mp.LIST_ORDER, mjp.PARAMVALUE, map.NAME, mp.PARAMSIZE, mp.FIELD_KEY, mp.NOCHANGE_DEFVALUE_FLAG FROM BD_MACROS_AFTER_PARAMS ap join bd_macros_atom_params map on map.FIELD_KEY=ap.FK_BD_MACROS_ATOM_PARAMS and ap.VALUETYPE='A' join BD_MACROS_J_PARAMOUT mjp on mjp.FK_BD_MACROS_ATOM_PARAMS=map.FIELD_KEY and mjp.FK_BD_MACROS_J=:fk_parent and mjp.NUMBER_RUN=:last_number_run join BD_MACROS_PARAMS mp on mp.FIELD_KEY=ap.FK_BD_MACROS_PARAMS where ap.FK_BD_MACROS=:parent_macros_type and ap.FK_BD_MACROS_PARAMS<>-1 into :PARAMNAME, :PARAMTYPE, :DESCRIPTION, :LIST_TABLE, :LIST_KEY, :LIST_RESULT, :LIST_WHERE, :LIST_MULTY, :LIST_ORDER, :PARAMKEY, :PARAMVALUE, :PARAMSIZE, :FK_BD_MACROS_PARAMS, :NOCHANGE_DEFVALUE_FLAG do begin INSERT INTO BD_MACROS_J_PARAMS (FK_BD_MACROS_J, PARAMNAME, PARAMTYPE, DESCRIPTION, LIST_TABLE, LIST_KEY, LIST_RESULT, LIST_WHERE, LIST_MULTY, LIST_ORDER, PARAMKEY, PARAMVALUE, PARAMSIZE, FK_BD_MACROS_PARAMS, NOCHANGE_DEFVALUE_FLAG) VALUES (:fk_new,:PARAMNAME,:PARAMTYPE, :DESCRIPTION, :LIST_TABLE, :LIST_KEY, :LIST_RESULT, :LIST_WHERE, :LIST_MULTY, :LIST_ORDER, :PARAMKEY, :PARAMVALUE, :PARAMSIZE, :FK_BD_MACROS_PARAMS, :NOCHANGE_DEFVALUE_FLAG); end --незаполненные параметры макроса из значений по умолчанию for SELECT mp.PARAMNAME, mp.PARAMTYPE, mp.DESCRIPTION, mp.LIST_TABLE, mp.LIST_KEY, mp.LIST_RESULT, mp.LIST_WHERE, mp.LIST_MULTY, mp.LIST_ORDER, mp.PARAMSIZE, mp.DEFVALUE, mp.DEFVALUE_CAPTION, mp.FIELD_KEY, mp.NOCHANGE_DEFVALUE_FLAG FROM BD_MACROS_AFTER_PARAMS a join BD_MACROS_PARAMS mp on mp.FIELD_KEY=a.FK_BD_MACROS_PARAMS where a.fk_bd_macros=9 and a.FK_BD_MACROS_ATOM_PARAMS is null into :PARAMNAME, :PARAMTYPE, :DESCRIPTION, :LIST_TABLE, :LIST_KEY, :LIST_RESULT, :LIST_WHERE, :LIST_MULTY, :LIST_ORDER, :PARAMSIZE, :PARAMKEY, :PARAMVALUE, :FK_BD_MACROS_PARAMS, :NOCHANGE_DEFVALUE_FLAG do begin INSERT INTO BD_MACROS_J_PARAMS (FK_BD_MACROS_J, PARAMNAME, PARAMTYPE, DESCRIPTION, LIST_TABLE, LIST_KEY, LIST_RESULT, LIST_WHERE, LIST_MULTY, LIST_ORDER, PARAMKEY, PARAMVALUE, PARAMSIZE, FK_BD_MACROS_PARAMS, NOCHANGE_DEFVALUE_FLAG) VALUES (:fk_new,:PARAMNAME,:PARAMTYPE, :DESCRIPTION, :LIST_TABLE, :LIST_KEY, :LIST_RESULT, :LIST_WHERE, :LIST_MULTY, :LIST_ORDER, :PARAMKEY, :PARAMVALUE, :PARAMSIZE, :FK_BD_MACROS_PARAMS, :NOCHANGE_DEFVALUE_FLAG); end --позиции макроса из позиций родительского макроса if (exists(SELECT * FROM BD_MACROS_AFTER_PARAMS p where p.FK_BD_MACROS=:parent_macros_type and p.fk_bd_macros_params=-1 and p.FK_BD_MACROS_ATOM_PARAMS=-1)) then begin for SELECT a.FK_BD_TOVAR, a.FK_BD_11, a.CNT, a.CENA FROM BD_MACROS_J_TOVAR a where FK_BD_MACROS_J=:fk_parent into :FK_BD_TOVAR, :FK_BD_11, :CNT, :CENA do begin INSERT INTO BD_MACROS_J_TOVAR (FK_BD_MACROS_J, FK_BD_TOVAR, FK_BD_11, CNT, CENA) VALUES (:FK_new, :FK_BD_TOVAR, :FK_BD_11, :CNT, :CENA); end end --позиции макроса из выходных параметров родительского макроса fk_bd_11_handle_in=(SELECT mjp.PARAMVALUE FROM BD_MACROS_AFTER_PARAMS ap join bd_macros_atom_params map on map.FIELD_KEY=ap.FK_BD_MACROS_ATOM_PARAMS and ap.VALUETYPE='A' join BD_MACROS_J_PARAMOUT mjp on mjp.FK_BD_MACROS_ATOM_PARAMS=map.FIELD_KEY and mjp.FK_BD_MACROS_J=:fk_parent and mjp.NUMBER_RUN=1 where ap.FK_BD_MACROS=:parent_macros_type and ap.FK_BD_MACROS_PARAMS=-1); for select z.FK_BD_11, BD_TOVAR.FIELD_KEY, z.cnt, z.cena from z_macros_pos z join bd_tovar on (bd_tovar.field_key=z.fk_bd_tovar) where z.fk_bd_macros_j=:fk_parent and tov_handle=:fk_bd_11_handle_in into :fk_bd_11, :fk_bd_tovar, :cnt, :cena do begin INSERT INTO BD_MACROS_J_TOVAR (FK_BD_MACROS_J, FK_BD_TOVAR, FK_BD_11, CNT, CENA) VALUES (:FK_new, :FK_BD_TOVAR, :FK_BD_11, :CNT, :CENA); end suspend; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CREATE_SUBMACROS TO SYSDBA;17 Создание дочернего макроса18.1.11.1PROCEDURE SP_CREATE_SUBMACROSaz_firm_doc join bd_pr_zakaz_firm_prod on bd_pr_zakaz_firm_doc.FK_BD_PR_ZAKAZ_FIRM_PROD=bd_pr_zakaz_firm_prod.field_key where bd_pr_zakaz_firm_doc.fk_doc = :fk_doc and bd_pr_zakaz_firm_doc.type_doc=2) into :fk_parent do begin --заказ на уч-к type_parent = 24; suspend; exit; end for select field_key from bd_pr_zakaz where field_key in (select fk_bd_pr_zakaz from bd_pr_zakaz_6 where fk_bd_2 = :fk_doc) into :fk_parent do begin --заказ на пр-во type_parent = 9; suspend; exit; end end ---заказ поставщику if (type_doc=3) then begin --консол. заявка for select fk_bd_order_sum from bd_order_in_1 where field_key = :fk_doc into :fk_parent do begin type_parent = 10; suspend; exit; end end ---заявка покупателя if (type_doc=4) then begin --заказ поставщику for select fk_bd_order_in_1 from bd_order_out_1 where field_key = :fk_doc into :fk_parent do begin type_parent = 3; suspend; exit; end end ---акт пр-ва if (type_doc=6) then begin for select field_key from bd_pr_zakaz_firm where field_key in (select fk_bd_pr_zakaz_firm from bd_pr_zakaz_firm_doc join bd_pr_zakaz_firm_prod on bd_pr_zakaz_firm_doc.FK_BD_PR_ZAKAZ_FIRM_PROD=bd_pr_zakaz_firm_prod.field_key where bd_pr_zakaz_firm_doc.fk_doc = :fk_doc and bd_pr_zakaz_firm_doc.type_doc=6) into :fk_parent do begin --заказ на уч-к type_parent = 24; suspend; exit; end for select field_key from bd_pr_zakaz where field_key in (select fk_bd_pr_zakaz from bd_pr_zakaz_pr where fk_bd_pr = :fk_doc) into :fk_parent do begin --заказ на пр-во type_parent = 9; suspend; exit; end for select field_key from BD_2 where fk_bd_1_6=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end end ---акт несоотв. if (type_doc=7) then begin for select fk_bd_1 from bd_act_diff where field_key = :fk_doc into :fk_parent do begin --приход type_parent = 1; suspend; exit; end end ---акт ревизии if (type_doc=11) then begin for select fk_bd_9 from bd_9_act where field_key = :fk_doc into :fk_parent do begin --ревизия type_parent = 5; suspend; exit; end end ---заказ на уч-к if (type_doc=24) then begin --пр-ный план for select FK_BD_PR_PLAN from bd_pr_zakaz_firm where field_key = :fk_doc into :fk_parent do begin type_parent = 27; suspend; exit; end end --макрос может быть порожден макросом if (type_doc=14) then begin for select fk_bd_macros_j from bd_macros_j m where field_key=:fk_doc into :fk_parent do begin type_parent = 14; suspend; end end --любой тип документов - может быть порожден фин отчетом for select d.FK_BD_9_ACT from BD_9_ACT_DOC d where d.fk_bd_doc=:fk_doc and d.type_doc=:type_doc into :fk_parent do begin --фин отчет type_parent=15; suspend; exit; end --любой тип документов - может быть порожден макросом for select d.Fk_bd_macros_j from BD_MACROS_J_DOC d where d.fk_bd_doc=:fk_doc and d.type_doc=:type_doc into :fk_parent do begin --макрос type_parent=14; suspend; exit; end suspend; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_GET_PARENT_DOC TO DAMIR; GRANT EXECUTE ON PROCEDURE SP_GET_PARENT_DOC TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_PARENT_DOC TO SYSDBA;19 связи - родительский макрос18.1.11.1SP_GET_PARENT_DOC W W\ cOUSET TERM ^ ; ALTER PROCEDURE SP_GET_PARENT_DOC ( FK_DOC Integer, TYPE_DOC Integer ) RETURNS ( FK_PARENT Integer, TYPE_PARENT Integer ) AS BEGIN if (type_doc=1) then ---приход begin for select field_key from bd_9 where fk_bd_1=:fk_doc into :fk_parent do begin --ревизия type_parent=5; suspend; exit; end for select field_key from bd_pr where fk_bd_1=:fk_doc into :fk_parent do begin --акт пр-ва type_parent=6; suspend; exit; end for select fk_bd_2 from BD_2_1_IZL where fk_bd_1=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end for select field_key from BD_2 where fk_bd_1_6=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end for select FK_ORDER_IN from BD_1 where field_key=:fk_doc and FK_ORDER_IN is not null into :fk_parent do begin --заказ пост type_parent=3; suspend; exit; end end ---расход if (type_doc=2) then begin for select field_key from bd_9 where fk_bd_2=:fk_doc into :fk_parent do begin --ревизия type_parent=5; suspend; exit; end for select field_key from bd_pr where fk_bd_2=:fk_doc into :fk_parent do begin --акт пр-ва type_parent=6; suspend; exit; end for select fk_bd_order_out_1 from bd_2 where field_key=:fk_doc and fk_bd_order_out_1 is not null into :fk_parent do begin --заявка покупателя type_parent=4; suspend; exit; end for select field_key from bd_retrobonus where fk_bd_2 = :fk_doc into :fk_parent do begin --ретробонус type_parent = 8; suspend; exit; end for select field_key from bd_pr_zakaz_firm where field_key in (select fk_bd_pr_zakaz_firm from bd_pr_zakaz_firm_doc join bd_pr_zakaz_firm_prod on bd_pr_zakaz_firm_doc.FK_BD_PR_ZAKAZ_FIRM_PROD=bd_pr_zakaQ= ]u!TINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка прихода по бизнес-процессу', 'macros_edit_prih', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='comming')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка расхода по бизнес-процессу', 'macros_edit_rash', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='consumption')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка заказа поставщику по бизнес-процессу', 'macros_edit_zakpost', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='zakazsupplier')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка заявки от получателя по бизнес-процессу', 'macros_edit_zakpol', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='zakazrecipient')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка акт производства по бизнес-процессу', 'macros_edit_prod', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='prod'));01 - права на правку документа18.1.27.1Праваz_firm_prod.field_key where bd_pr_zakaz_firm_doc.fk_doc = :fk_doc and bd_pr_zakaz_firm_doc.type_doc=2) into :fk_parent do begin --заказ на уч-к type_parent = 24; suspend; exit; end for select field_key from bd_pr_zakaz where field_key in (select fk_bd_pr_zakaz from bd_pr_zakaz_6 where fk_bd_2 = :fk_doc) into :fk_parent do begin --заказ на пр-во type_parent = 9; suspend; exit; end end ---заказ поставщику if (type_doc=3) then begin --консол. заявка for select fk_bd_order_sum from bd_order_in_1 where field_key = :fk_doc and fk_bd_order_sum is not null into :fk_parent do begin type_parent = 10; suspend; exit; end end ---заявка покупателя if (type_doc=4) then begin --заказ поставщику for select fk_bd_order_in_1 from bd_order_out_1 where field_key = :fk_doc and fk_bd_order_in_1 is not null into :fk_parent do begin type_parent = 3; suspend; exit; end --макрос end ---акт пр-ва if (type_doc=6) then begin for select field_key from bd_pr_zakaz_firm where field_key in (select fk_bd_pr_zakaz_firm from bd_pr_zakaz_firm_doc join bd_pr_zakaz_firm_prod on bd_pr_zakaz_firm_doc.FK_BD_PR_ZAKAZ_FIRM_PROD=bd_pr_zakaz_firm_prod.field_key where bd_pr_zakaz_firm_doc.fk_doc = :fk_doc and bd_pr_zakaz_firm_doc.type_doc=6) into :fk_parent do begin --заказ на уч-к type_parent = 24; suspend; exit; end for select field_key from bd_pr_zakaz where field_key in (select fk_bd_pr_zakaz from bd_pr_zakaz_pr where fk_bd_pr = :fk_doc) into :fk_parent do begin --заказ на пр-во type_parent = 9; suspend; exit; end for select field_key from BD_2 where fk_bd_1_6=:fk_doc into :fk_parent do begin --расход type_parent=2; suspend; exit; end end ---акт несоотв. if (type_doc=7) then begin for select fk_bd_1 from bd_act_diff where field_key = :fk_doc into :fk_parent do begin --приход type_parent = 1; suspend; exit; end end ---акт ревизии if (type_doc=11) then begin for select fk_bd_9 from bd_9_act where field_key = :fk_doc into :fk_parent do begin --ревизия type_parent = 5; suspend; exit; end end ---заказ на уч-к if (type_doc=24) then begin --пр-ный план for select FK_BD_PR_PLAN from bd_pr_zakaz_firm where field_key = :fk_doc into :fk_parent do begin type_parent = 27; suspend; exit; end end --макрос может быть порожден макросом if (type_doc=14) then begin for select fk_bd_macros_j from bd_macros_j m where field_key=:fk_doc into :fk_parent do begin type_parent = 14; suspend; end end --любой тип документов - может быть порожден фин отчетом for select d.FK_BD_9_ACT from BD_9_ACT_DOC d where d.fk_bd_doc=:fk_doc and d.type_doc=:type_doc into :fk_parent do begin --фин отчет type_parent=15; suspend; exit; end --любой тип документов - может быть порожден макросом for select d.Fk_bd_macros_j from BD_MACROS_J_DOC d where d.fk_bd_doc=:fk_doc and d.type_doc=:type_doc into :fk_parent do begin --макрос type_parent=14; suspend; exit; end suspend; END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_GET_PARENT_DOC TO DAMIR; GRANT EXECUTE ON PROCEDURE SP_GET_PARENT_DOC TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_PARENT_DOC TO SYSDBA;02 - Поиск родителя - исправление18.1.27.1ALTER PROCEDURE SP_GET_PARENT_DOC L J  u1Y s5`INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Оповещение', 'tfrmalertj', '56'); INSERT INTO BD_SMARTPRINT_REZHIM (REZHIM_NAME, FORMCLASS_NAME, REZHIM) VALUES ('Оповещение', 'tfrmeditalert', '56'); 13 - режимы печати оповещений18.1.27.1BD_SMARTPRINT_REZHIM' w5_alter table BD_ALERT add ts_create timestamp default current_timestamp 12 - время создания оповещений18.1.27.1alter table BD_ALERT; [_5^INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Журнал оповещений', 'alert_j', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='macros')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Просмотр чужих оповещений', 'alert_view_another', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='macros')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка оповещений', 'alert_edit', (select field_key from BD_USERS_RIGHTS_NAME r where trim(r.name_var)='macros')); 11 - права на оповещения18.1.27.1BD_USERS_RIGHTS_NAMEz ?)]INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('alertinterval', 15000, 'Интервал проверки оповещений, мс'); 10 - интервал проверки оповещений18.1.27.1GLOBAL_OPTIONSX  SI\CREATE TRIGGER BD_ALERT_DOC_BI FOR BD_ALERT_DOC ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_ALERT_DOC_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_ALERT_DOC_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_ALERT_DOC_ID, new.FIELD_KEY-tmp); END END 09 - док опов триггер18.1.27.1CREATE TRIGGER BD_ALERT_DOC_BIW{E[CREATE GENERATOR GEN_BD_ALERT_DOC_ID;08 - Документы оповещ генератор18.1.27.1GENERATOR GEN_BD_ALERT_DOC_Iw Ce?Zcreate table BD_ALERT_DOC ( field_key integer not null primary key, fk_bd_alert integer, fk_doc integer, type_doc integer, name_doc varchar(100) )07 - оповещения документы18.1.27.1create table BD_ALERT_DOCE e]AYCREATE TRIGGER BD_ALERT_BI FOR BD_ALERT ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_ALERT_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_ALERT_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_ALERT_ID, new.FIELD_KEY-tmp); END END06 - оповещения триггер18.1.27.1CREATE TRIGGER BD_ALERT_BI|Oe?XCREATE GENERATOR GEN_BD_ALERT_ID;05 - оповещения генератор18.1.27.1GENERATOR GEN_BD_ALERT_ID~ a]7WCREATE TABLE bd_alert ( field_key integer not null primary key, fk_bd_user integer, txt blob, fk_creator_macros integer, hide_flag BOOLFIELD );04 - оповещения таблица18.1.27.1CREATE TABLE bd_alert0 9k5VUPDATE BD_CHILD_DOCS SET SQL = 'select a.field_key, ''Заказ поставщику №''||a.FIELD_KEY, a.DATE_ORDER, a.fk_bd_firm, skl.name, a.FK_supplier, sup.name, coalesce((select sum(BD_ORDER_in_11.SUMMA_WITH_NDS) from BD_ORDER_in_11 where BD_ORDER_in_11.FK_BD_ORDER_IN_1=a.FIELD_KEY),0), a.close_flag, s.field_key from BD_ORDER_IN_1 a join bd_firm skl on skl.field_key=a.fk_bd_firm join bd_firm sup on sup.field_key=a.fk_supplier join BD_MACROS_J_DOC s on s.fk_bd_doc=a.FIELD_KEY and s.type_doc=3 where s.fk_BD_MACROS_J=:fk_parent' WHERE FIELD_KEY = '175';03 - заказ поставщику связи18.1.27.1UPDATE BD_CHILD_DOCS t  PM! K3fSET TERM ^ ; CREATE OR ALTER trigger bd_scan_bi1 for bd_scan active before insert or update position 1 AS declare variable dop_nul varchar(11); declare variable no_valid integer; declare variable i integer; declare variable vesprefix varchar(4); declare variable shtukprefix varchar(4); begin /* Trigger text */ if (char_length(trim(new.scancod))=13) then new.scancod=substring(trim(new.scancod) FROM 1 FOR 12); if (char_length(trim(new.scancod))=8) then new.scancod=substring(trim(new.scancod) FROM 1 FOR 7); select coalesce(max(paramvalue),99) from GLOBAL_OPTIONS where paramname='vesprefix' into :vesprefix; select coalesce(max(paramvalue),22) from GLOBAL_OPTIONS where paramname='shtukprefix' into :shtukprefix; if ((SUBSTRING(new.scancod from 1 for char_length(:vesprefix))=:vesprefix)and(char_length(new.scancod)<7)) then --and(char_length(new.scancod)=4) begin i=1; no_valid=0; while (i<=char_length(new.scancod)) do begin if (not('0123456789' containing SUBSTRING(new.scancod from i for 1))) then no_valid=1; i=i+1; end if (no_valid=1) then exit; dop_nul='0'; while (char_length(new.scancod||dop_nul)<7) do dop_nul=dop_nul||'0'; new.scancod=(select coalesce(cast(max(scancod) as bigint),cast(new.scancod||:dop_nul as bigint))+1 from bd_scan where (SUBSTRING(scancod from 1 for char_length(new.scancod))=new.scancod) and (char_length(scancod)=7)); end if ((SUBSTRING(new.scancod from 1 for char_length(:shtukprefix))=:shtukprefix)and(char_length(new.scancod)<7)) then --and(char_length(new.scancod)=4) begin i=1; no_valid=0; while (i<=char_length(new.scancod)) do begin if (not('0123456789' containing SUBSTRING(new.scancod from i for 1))) then no_valid=1; i=i+1; end if (no_valid=1) then exit; dop_nul='0'; while (char_length(new.scancod||dop_nul)<7) do dop_nul=dop_nul||'0'; new.scancod=(select coalesce(cast(max(scancod) as bigint),cast(new.scancod||:dop_nul as bigint))+1 from bd_scan where (SUBSTRING(scancod from 1 for char_length(new.scancod))=new.scancod) and (char_length(scancod)=7)); end end^ SET TERM ; ^чтобы можно было задавать префикс товара до 4 знаков18.1.31.1trigger bd_scan_bi1/ sIeALTER TABLE BD_FIRM ADD EGAISSTOCK_DATE TIMESTAMP;EGAISSTOCK_DATE - timestamp последнего запроса остатков в егаис18.1.31.1BD_FIRM ydALTER TABLE KS_KODI ADD ISPRIH BOOLFIELD DEFAULT 0 ;галочкa: доходная или расходная18.1.28.1KS_KODI]  {+cCREATE TRIGGER BD_ALERT_POS_BI FOR BD_ALERT_POS ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_ALERT_POS_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_ALERT_POS_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_ALERT_POS_ID, new.FIELD_KEY-tmp); END END16 - позиции оповещения триггер18.1.27.1BD_ALERT_POS_BI  W3bCREATE GENERATOR GEN_BD_ALERT_POS_ID;15 - позиции оповещения генератор18.1.27.1GEN_BD_ALERT_POS_IDz O]Aa CREATE TABLE BD_ALERT_POS ( FIELD_KEY Integer NOT NULL, FK_BD_ALERT Integer, FK_bd_tovar Integer, prim Varchar(100), PRIMARY KEY (FIELD_KEY) );14 - позиции оповещения18.1.27.1 CREATE TABLE BD_ALERT_POS  v &# QYh ALTER TABLE BD_TOVAR ADD DATE_START_SPS1 DATE; ALTER TABLE BD_TOVAR ADD DATE_END_SPS1 DATE;поля DATE_START_SPS1 DATE_END_SPS118.2.6.1BD_TOVAR" /!3gSET TERM ^ ; CREATE OR ALTER procedure SP_GET_PREF_VES_NEW ( FK_GRP_VESI integer, CURR_SKL integer) returns ( PREF_STR varchar(1000)) as declare variable TMP_PREF varchar(20); BEGIN pref_str=''; for SELECT trim(ves_mask) FROM BD_VESI a where FK_BD_VESI_GRP=:fk_grp_vesi and fk_bd_firm=:curr_skl into :tmp_pref do begin if (not(pref_str containing tmp_pref)) then begin pref_str=pref_str||','||tmp_pref; end end if (pref_str='') then pref_str=coalesce((select g.PARAMVALUE from global_options g where g.PARAMNAME='vesprefix'),'')||','||coalesce((select g.PARAMVALUE from global_options g where g.PARAMNAME='shtukprefix'),''); suspend; END^ SET TERM ; ^чтобы корректно отоюражались шк у штучного товара в архиве весового товара18.1.31.1SP_GET_PREF_VES_NEW f$ OM)iSET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER TR_BD_SPS1_AKC FOR BD_SPS1 ACTIVE AFTER UPDATE POSITION 0 AS declare variable fk_tovar integer; declare variable fk_cena integer; declare variable fk integer; declare variable cena decimal(8,2); declare variable cena_old decimal(8,2); declare variable cena_akc decimal(8,2); BEGIN if ((coalesce(new.AKC_FLAG,0)=0)or(coalesce(new.SET_RC_FLAG,0)=1)) then exit; if ((coalesce(old.VALID_FLAG,0)=0)and(coalesce(new.VALID_FLAG,0)=1)) then begin --проводим акционную спецификацию --применяем розничные цены for select fk_bd_tovar, fk_bd_cena, cena, field_key from BD_SPS_CPR where fk_bd_sps1=new.FIELD_KEY and cena is not null into :fk_tovar, :fk_cena, :cena, :fk do begin cena_old=null; select cena from BD_CPR_NOW where fk_bd_tovar=:fk_tovar and fk_bd_cena=:fk_cena into :cena_old; if (coalesce(cena,0)<>coalesce(cena_old,0)) then begin update BD_SPS_CPR c set c.CENA_WITHOUT_AKC=:cena_old where field_key=:fk; INSERT INTO BD_CPR (FK_BD_TOVAR, FK_BD_CENA, CENA, LAST_DATE, LAST_TIME, OPERATOR, WORKPLACE, START_DATE, END_DATE, START_TIME, fk_bd_operation) VALUES (:FK_TOVAR, :FK_CENA, :CENA, current_date, current_time, 0, 0, current_date, null, current_time,0); end end for select fk_bd_tovar from BD_SPS11 where fk_bd_sps1=new.FIELD_KEY and set_akc_flag=1 into :fk_tovar do update BD_TOVAR set akc=1, date_start_sps1=new.date_start, date_end_sps1=new.date_end where field_key=:fk_tovar; end if ((coalesce(old.VALID_FLAG,0)=1)and(coalesce(new.VALID_FLAG,0)=0)) then begin --распроводим акционную спецификацию --возвращаем назад предыдущие цены (которые были запомнены перед установкой акции), только если текущая цена равна цене по акции for select fk_bd_tovar, fk_bd_cena, CENA_WITHOUT_AKC, cena from BD_SPS_CPR where fk_bd_sps1=new.FIELD_KEY and coalesce(CENA_WITHOUT_AKC,0)>0 into :fk_tovar, :fk_cena, :cena, :cena_akc do begin cena_old=null; select cena from BD_CPR_NOW where fk_bd_tovar=:fk_tovar and fk_bd_cena=:fk_cena into :cena_old; if ((coalesce(cena,0)<>coalesce(cena_old,0))and(coalesce(cena,0)=coalesce(cena_akc,0))) then begin --меняем цены на те товары, на которые еще стоит цена по акции и у которых цена не равна запомненной цене по акции INSERT INTO BD_CPR (FK_BD_TOVAR, FK_BD_CENA, CENA, LAST_DATE, LAST_TIME, OPERATOR, WORKPLACE, START_DATE, END_DATE, START_TIME, fk_bd_operation) VALUES (:FK_TOVAR, :FK_CENA, :CENA, current_date, current_time, 0, 0, current_date, null, current_time,0); -- if (new.set_akc_flag=1) then -- update BD_TOVAR set BD_TOVAR.AKC=0 where field_key=:fk_tovar; end end delete from BD_SPS_CPR where fk_bd_sps1=new.field_key and cena is null; for select fk_bd_tovar from BD_SPS11 where fk_bd_sps1=new.FIELD_KEY and set_akc_flag=1 into :fk_tovar do update BD_TOVAR set akc=0, date_start_sps1=null, date_end_sps1=null where field_key=:fk_tovar; end END ^ SET TERM ; ^назначение и очистка кеш дата нач и кон спец в товаре18.2.6.1TR_BD_SPS1_AKC (% 'q3jSET TERM ^ ; CREATE OR ALTER procedure SP_GETKOEFTOVAR_NEW ( FK_TOVAR integer, CURRSKL integer, FK_FIRM integer, STOCK decimal(7,3), IFMINTHENMAX integer, DAY_TORG_MANUALLY integer = null) returns ( MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SOLD decimal(7,3), PRIH_CNT decimal(7,3), LAST_PRIH_CNT decimal(7,3)) as declare variable DNEY_ANALIZ integer; declare variable DNEY_ZAKAZ integer; declare variable CNT decimal(7,3); declare variable ROUND_DOST integer; BEGIN select first 1 minstock, mincnt, avgcnt, maxcnt, avgrash from bd_norma where fk_bd_tovar=:fk_tovar and fk_bd_firm=:currskl into :minstock, :mincnt, :avgcnt, :maxcnt, :avgrash; minstock=coalesce(minstock,0); mincnt=coalesce(mincnt,0); avgcnt=COALESCE(avgcnt,0); maxcnt=coalesce(maxcnt,0); select first 1 coalesce(dney_torg,0), coalesce(ROUND_MINPARTY,0), coalesce(dney_zakaz,0) from bd_firm where field_key=:fk_firm into :dney_torg, :round_dost, :dney_zakaz; if (:day_torg_manually is not null) then dney_torg=:day_torg_manually; /* select first 1 avg(cnt_sum) FROM (select case when coalesce(max(date_rash)-bd_11.date_prih,0)=0 then 0 else sum(bd_21.CNT)/coalesce(max(date_rash)-bd_11.date_prih,0) end as cnt_sum from BD_2 join bd_21 on bd_2.field_key=bd_21.FK_BD_2 join bd_11 on bd_11.field_key=bd_21.FK_BD_11 --join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where date_rash>(current_date-:dney_analiz) and bd_11.fk_bd_tovar=:fk_tovar and BD_2.fk_bd_firm=:currskl group by bd_11.date_prih) as rash into :avgrash; */ select first 1 coalesce(sum(bd_21.cnt),0) from BD_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where bd_21.fk_bd_tovar=:fk_tovar and bd_2.fk_bd_firm=:currskl and bd_2.cod_rash in (0,2,3) and bd_2.date_rash between (current_date-:dney_torg) and (current_date) into :sold; select first 1 coalesce(sum(bd_11.cnt),0) from BD_11 join bd_1 on bd_1.field_key=bd_11.fk_bd_1 where bd_11.fk_bd_tovar=:fk_tovar and bd_1.fk_bd_firm=:currskl --and bd_1.cod_prih in (0,2,3) and bd_1.date_prih between (current_date-:dney_torg) and (current_date) into :prih_cnt; avgrash=coalesce(avgrash,0); select first 1 current_date-bd_11.date_prih, cnt from bd_11 where bd_11.valid_flag=1 and fk_bd_tovar=:fk_tovar and bd_11.fk_bd_firm=:currskl order by bd_11.date_prih desc into :dney_last, last_prih_cnt; if ((ifminthenmax=1)and(stockmaxcnt)) then AVTOZAK=maxcnt; if (avtozak<0) then avtozak=0; SUSPEND; END^ SET TERM ; ^данные по товару для заказа18.2.7.1SP_GETKOEFTOVAR_NEWXCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, ED_IZM_NAME varchar(30), DATE_SAVE date, NEXT_AKC integer, SOLD decimal(7,3), PRIH_CNT decimal(7,3), LAST_PRIH_CNT decimal(7,3), FACE_NAME varchar(200), DATE_START_SPS1 date, DATE_END_SPS1 date, AKC integer, DAY_ORDER integer, LAST_ORDER_CNT decimal(7,3)) as declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf onY mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc do BEGIN cnt=0; self_stock=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; END end else begin -- no specifications if ((sklad=1)and(transit=0)) then begin if (rezerv_allow=1) then begin for select bd_tovar.inplace,bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, bd_11.field_key, bd_11.cena_pr_with_nds, bd_11.cena_pr_without_nds, ed_izm_name, date_save, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), --bd_tovar.field_key (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (Zbd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :date_save, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; end end end else begin -- no sklad for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc from bd_tovar where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/) and coalesce(bd_tovar.IS_old_flag,0)=0 order by name into :inplace ,:fk_bd_tovar, :name, :fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc do BEGIN cnt=0; self_stock=0; cena_nds=0; cena_not_nds=0; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into self_stock; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; suspend; END end end -- suspend; end^ SET TERM ; ^Данные для подбора в заказе18.2.7.1SP_GET_TOV_FOR_ZAK i Z L i- mrALTER TABLE BD_SPS11 ADD PERCENT_DISCOUNT DECIMAL(5,2) DEFAULT 0 ;Процент скидки поставщика18.2.15.1BD_SPS11B, E -qSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(15,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null, CNT_TOV decimal(7,3) = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(15,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(15,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(15,4), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4), NORMA_SUM decimal(15,4), CENA_SEB_SUM decimal(15,4), CENA_SEB_ED_SUM decimal(15,4), NETTO_SUM decimal(15,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3), CURR_LEVEL integer) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(3,2); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; `{+kEApALTER TABLE BD_MACROS_ATOM ADD h_size Integer;04 - высота блока18.2.10.1ALTER TABLE BD_MACROS_ATOM{*kEAoALTER TABLE BD_MACROS_ATOM ADD w_size Integer;03 - ширина блока18.2.10.1ALTER TABLE BD_MACROS_ATOM )mg?nALTER TABLE BD_MACROS_ATOM ADD top_pos Integer;02 - верхняя позиция блока18.2.10.1ALTER TABLE BD_MACROS_ATO (o_AmALTER TABLE BD_MACROS_ATOM ADD left_pos Integer;01 - левая позиция блока18.2.10.1ALTER TABLE BD_MACROS_ATOM ' C1lSET TERM ^ ; CREATE OR ALTER procedure SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ integer) returns ( FK_BD_TOVAR integer, NAME char(100), CNT decimal(7,3), CENA_NDS decimal(12,5), CENA_NOT_NDS decimal(12,5), SUMMA_NDS decimal(12,5), SUMMA_NOT_NDS decimal(12,5), STOCK decimal(7,3), SELF_STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME char(200), INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAX\'& %q1kSET TERM ^ ; CREATE OR ALTER procedure SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ integer) returns ( FK_BD_TOVAR integer, NAME char(100), CNT decimal(7,3), CENA_NDS decimal(12,5), CENA_NOT_NDS decimal(12,5), SUMMA_NDS decimal(12,5), SUMMA_NOT_NDS decimal(12,5), STOCK decimal(7,3), SELF_STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME char(200), INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINW]CNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, ED_IZM_NAME varchar(30), DATE_SAVE date, NEXT_AKC integer, SOLD decimal(7,3), PRIH_CNT decimal(7,3), LAST_PRIH_CNT decimal(7,3), FACE_NAME varchar(200), DATE_START_SPS1 date, DATE_END_SPS1 date, AKC integer, DAY_ORDER integer, LAST_ORDER_CNT decimal(7,3), SCANCOD_MAIN type of column BD_SCAN.SCANCOD, OLDKEY_STR varchar(30)) as declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl^_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str do BEGIN cnt=0; self_stock=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; END end else begin -- no specifications if ((sklad=1)and(transit=0)) then begin if (rezerv_allow=1) then begin for select bd_tovar.inplace,bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, bd_11.field_key, bd_11.cena_pr_with_nds, bd_11.cena_pr_without_nds, ed_izm_name, date_save, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, scancod_main,oldkey_str, sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), --bd_tovar.field_key (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) _ /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; suspend; end end end else begin -- no sklad for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str from bd_tovar where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/) and coalesce(bd_tovar.IS_old_flag,0)=0 order by name into :inplace ,:fk_bd_tovar, :name, :fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str do BEGIN cnt=0; self_stock=0; cena_nds=0; cena_not_nds=0; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into self_stock; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; suspend; END end end -- suspend; end^ SET TERM ; ^шк и код обмена18.2.7.1SP_GET_TOV_FOR_ZAK if (in_level is null) then out_level=1; else out_level=in_level+1; curr_level=:out_level; select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); cena_pr_prod=:cena_pr_prod*:norma_ttk; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (cnt_tov is not null) then begin norma=:norma*:cnt_tov/:norma_ttk; netto=:netto*:cnt_tov/:norma_ttk; end if (norma_prod is not null) then begin norma=(norma*norma_prod/:norma_ttk);--*:cnt_tov; netto=(norma-(norma/100.0000*cast(:procent_poter as decimal(15,5))));--*:cnt_tov; end /*else begin norma=:norma*:cnt_tov; netto=:netto*:cnt_tov; end*/ norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod/:norma_ttk; cena_seb_ed=cena_pr_prod/:norma_ttk; end else begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor,:cnt_tov) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; if ((curr_level=1)) then curr_level=:curr_level+1; -- curr_level=coalesce(:out_level,0)-:curr_level; suspend; if (:fk_ttk_comp is not null) then curr_level=:curr_level+1; end fk_ttk_tmp=null; end curr_level=coalesce(:in_level,0)+1; end end^ SET TERM ; ^измененния для печатной формы ттк18.2.13.1SP_GET_CALC_TREE_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); cena_pr_prod=:cena_pr_prod*:norma_ttk; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (cnt_tov is not null) then begin norma=cast(:norma*:cnt_tov/iif(coalesce(:norma_ttk,0)=0,1,:norma_ttk) as decimal(14,4)); netto=cast(:netto*:cnt_tov/iif(coalesce(:norma_ttk,0)=0,1,:norma_ttk) as decimal(14,4)); end if (norma_prod is not null) then begin norma=cast((norma*norma_prod/:norma_ttk) as decimal(14,4));--*:cnt_tov; netto=cast((norma-(norma/100.0000*cast(:procent_poter as decimal(14,4)))) as decimal(14,4));--*:cnt_tov; end /*else begin norma=:norma*:cnt_tov; netto=:netto*:cnt_tov; end*/ norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod/:norma_ttk; cena_seb_ed=cena_pr_prod/:norma_ttk; end else begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor,null) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; if ((curr_level=1)) then curr_level=:curr_level+1; -- curr_level=coalesce(:out_level,0)-:curr_level; suspend; if (:fk_ttk_comp is not null) then curr_level=:curr_level+1; end fk_ttk_tmp=null; end curr_level=coalesce(:in_level,0)+1; end end^ SET TERM ; ^расширены размерности переменных18.2.15.1SP_GET_CALC_TREE   "#UF8 G9update BD_ORDER_OUT_11 a set cnt_rash = coalesce((select sum(cnt) from bd_22 where bd_22.FK_BD_ORDER_OUT_11=a.FIELD_KEY),0)проставляем кеш18.2.18.1update BD_ORDER_OUT_11_7 ykQ~CREATE TRIGGER TR_BD_22_ZAKPOL_IUD FOR BD_22 ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS declare variable fk integer; declare variable fk_o11 integer; declare variable cnt decimal(7,3); BEGIN if (inserting) then begin fk = new.FIELD_KEY; fk_o11 = new.FK_BD_ORDER_OUT_11; cnt = coalesce(new.CNT,0); end else begin fk = old.FIELD_KEY; fk_o11 = old.FK_BD_ORDER_OUT_11; cnt = coalesce(new.CNT,0) - coalesce(old.CNT,0); end update BD_ORDER_OUT_11 set cnt_rash=coalesce(cnt_rash,0)+:cnt where field_key=:fk_o11; ENDтриггер на позицию расхода, для кеш-поля "в отгрузке" в заявке18.2.18.1CREATE TRIGGER TR_BD_22_ZAKPOL_IUD6{{C}ALTER TABLE BD_ORDER_OUT_11 ADD cnt_rash Decimal(7,3);количество в расходе, кеш-поле18.2.18.1ALTER TABLE BD_ORDER_OUT_11-5 -aE|ALTER TABLE BD_MACROS_J_STEP ADD ts_create Timestamp default current_timestamp;время завершения этапа18.2.18.1ALTER TABLE BD_MACROS_J_STEP4 m%{GRANT ALL ON BD_ALERT_POS TO PUBLIC; GRANT ALL ON BD_ALERT_DOC TO PUBLIC; GRANT ALL ON BD_ALERT TO PUBLIC; GRANT ALL ON BD_MACROS_AFTER_PARAMS TO PUBLIC; GRANT ALL ON BD_MACROS_J_STEP TO PUBLIC;права на доступ к объектам18.2.18.1GRANT ALL ON3ia;xALTER TABLE BD_MACROS_J ADD location Integer;очередность с событием18.2.15.1ALTER TABLE BD_MACROS_Js2o7;wALTER TABLE BD_MACROS_J ADD type_events Integer;тип события18.2.15.1ALTER TABLE BD_MACROS_Jm1i1;yALTER TABLE BD_MACROS_J ADD priority Integer;приоритет18.2.15.1ALTER TABLE BD_MACROS_Jp0k5;vALTER TABLE BD_MACROS_J ADD avto_flag Integer;автозапуск18.2.15.1ALTER TABLE BD_MACROS_J/ucAuALTER TABLE BD_ORDER_OUT_1 ADD stop_flag BOOLFIELD;стоп-отгрузка по заявке18.2.15.1ALTER TABLE BD_ORDER_OUT_1\. y -sSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(14,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null, CNT_TOV decimal(14,4) = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(14,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(14,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(14,4), CENA_SEB decimal(14,4), CENA_SEB_ED decimal(14,4), NORMA_SUM decimal(14,4), CENA_SEB_SUM decimal(14,4), CENA_SEB_ED_SUM decimal(14,4), NETTO_SUM decimal(14,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3), CURR_LEVEL integer) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(14,4); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; curr_level=:out_level; select norma_min, bd_calc.isadble cnt_rash_cash decimal(7,3); BEGIN /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=1; if (withcnt=0) then prov_bd_2_flag=0; for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin delete from bd_11_reserv where FK_BD_ORDER_OUT_11=:fk_rez; end select field_key from bd_users where upper(login)=current_user into :fk_user; --заголовок расхода select fk_bd_firm, fk_recipient, cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery, bd_order_out_1.prim from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :id_rec, :cod_r, :FK_PFIRM_REC, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_snoop_dogg, :date_delivery, :prim; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_sklad), null, :date_delivery, :id_rec, :fk_face, :cod_r, :d_cod_r, :fk_user, :prim, 0, null, null, null, :id_sklad, null, 0, :FK_PFIRM_REC, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_snoop_dogg); --перебираем все строки заказа --сначала переводим в расход строки с резервом cnt_so=0; rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, BD_ORDER_OUT_11.fk_bd_11, bd_order_out_11.fk_bd_11_rezerv, bd_tovar.nds, bd_order_out_11.inplace, coalesce(bd_order_out_11.CNT_RASH,0) from BD_ORDER_OUT_11 left join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) where fk_bd_out_1=:id_zakaz --and fk_bd_11_rezerv is null into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :rez, :nds, :inplace, :cnt_rash_cash do BEGIN --ost_rash - ищем, сколько уже отгружено по данной позиции cnt_otgr=0; if (withcnt=1) then /* select sum(cnt) from BD_22 where bd_22.fk_bd_order_out_11=:fk_o11 into :*/cnt_otgr=cnt_rash_cash; cnt_otgr=coalesce(cnt_otgr,0); ost_rash=ost_rash-cnt_otgr; --проверяем по остаткам если нехватает, проверим замены select sum(stock) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and stock>0 into :stock_tovar; if (coalesce(:stock_tovar,0)<:ost_rash) then begin for select sp.fk_tovar_zamena, sp.cnt_tovar_zamena, sp.koef, t.nds, t.inplace from sp_create_rash_checktov_zamena(:id_zakaz,:fk_o11,:ost_rash-coalesce(:stock_tovar,0)) sp join bd_tovar t on t.field_key=sp.fk_tovar_zamena into :fk_zamena, :cnt_zamena, :koef, :nds_z, :inplace_z do begin cena_z=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_zamena and fk_bd_cena=:fk_cena into :cena_z; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, null , :cena_z, :cena_z/(1+(coalesce(:nds_z,0)/100)), :cnt_zamena, :fk_o11, :fk_zamena, :inplace_z, :nds_z); cnt_so=cnt_so+cnt_zamena; ost_rash=:ost_rash-(:cnt_zamena*:koef); end if ((SET_CNT_BY_STOCK=1)and(ost_rash>coalesce(stock_tovar,0))) then ost_rash=coalesce(stock_tovar,0); end --актуализируем цены --только для расходных цен if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (rez is not null) then begin update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; end else begin fk_11_rezerv=null; end --заполняем расход -- 1. Rezerv or position from fk_bd_11 if ((withcnt=0)or(ost_rash>0)) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); cnt_so=cnt_so+ost_rash; ost_rash=0; end rez=null; END if ((withcnt=0)or(cnt_so>0)) THEN BEGIN -- update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz; if (prov_bd_2_flag=1) then begin execute procedure sp_bd2_prov(:fk_2,'RU',coalesce(:tsd_check,0),:fk_user); if ((select count(*) from bd_2_resultprov r where r.fk_bd_2=:fk_2)>0) then begin delete from bd_21 where fk_bd_2=:fk_2; update bd_2 set valid_flag=0 where field_key=:fk_2; end end -- execute procedure sp_22_by_21(:fk_2,0); update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); -- END ELSE delete from BD_2 where field_key=:fk_2; --делаем разнесение --находим сумму расхода select sum(summa) from bd_21 where fk_bd_2=:fk_2 into :sum_doc; for select fk_ks_1, sum(summa) from ks_11 where fk_ks_1 is not null and coalesce(fo_order_out,0)=:ID_ZAKAZ group by fk_ks_1 into :fk_ks1, :sumraznes do BEGIN --находим сколько можем разнести по этой оплате select main.summa-coalesce((select sum(ks_11.summa) from ks_11 where ks_11.fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null and coalesce(ks_11.fk_bd_2,0)<>:fk_2),0) from ks_1 main where main.field_key=:fk_ks1 group by main.summa into :sum_ok; --сравниваем суммы sumraznes=minvalue(sumraznes,sum_ok,sum_doc); if (sumraznes>0) THEN BEGIN --создаем разнесение в этой же оплате по этому же расходу INSERT INTO KS_11 (FIELD_KEY, FK_KS_1, FK_BD_2, SUMMA) VALUES (gen_id(GEN_KS_11_ID,1), :FK_KS1, :FK_2, :sumraznes); sum_doc=sum_doc-sumraznes; END END END ^ SET TERM ; ^используем кеш количества в отгрузке18.2.18.1ALTER PROCEDURE SP_CREATE_RASH t+tm< m;+SET TERM ^ ; CREATE OR ALTER procedure SP_CALC_SEB_TOV ( FK_BD_TOVAR integer, FK_BD_FIRM integer, NORMA decimal(14,4)) returns ( CENA_CPR decimal(15,2), CENA_PR decimal(15,2), CENA_SEB decimal(15,4), CENA_SEB_ED decimal(15,4)) as declare variable FK_TTK integer; declare variable FK_TOV_TTK integer; declare variable CENA_TTK decimal(15,2); declare variable NORMA_TTK decimal(12,5); declare variable NORMA_TTK_SUM integer; declare variable MOTHER_NORM decimal(15,4); declare variable SOM_VAR decimal(15,4); begin select cena from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=(select fk_bd_cena_basic from bd_firm where field_key=:fk_bd_firm) into :cena_cpr; select last_cena_pr from bd_tovar where field_key=:fk_bd_tovar into :cena_pr; select first 1 c.field_key, c.norma_min from bd_calc c where c.fk_bd_tovar=:fk_bd_tovar and c.valid_flag=1 into :fk_ttk,:mother_norm; if (fk_ttk is not null) then begin select max(summa_seb)/(select iif(coalesce(norma_min,0)=0,1,coalesce(norma_min,0)) from bd_calc where field_key=:fk_ttk) as total_seb from SP_CALC_SEB_PLAN(:fk_ttk) into :cena_pr; cena_seb=cena_pr*norma; end else begin cena_seb=:cena_pr*:norma; cena_seb_ed=:cena_pr; end suspend; end^ SET TERM ; ^ NORMA 3,2 decimal(14,4)18.2.18.1SP_CALC_SEB_TOV"; m Cupdate BD_USERS_RIGHTS_NAME a set name='Настройка шаблонов' where name_var='macros_edit_macros' 18.2.18.1update BD_USERS_RIGHTS_NAME: a Cupdate BD_USERS_RIGHTS_NAME a set name='Настройка блоков' where name_var='macros_edit_atom'18.2.18.1update BD_USERS_RIGHTS_NAMEE9 !IzSET TERM ^ ; ALTER PROCEDURE SP_CREATE_RASH ( ID_ZAKAZ Integer, BY_CURRPRICE Integer, PROV_BD_2_FLAG Integer, WITHCNT Smallint DEFAULT 1, SET_CNT_BY_STOCK Integer DEFAULT 0 ) RETURNS ( FK_2 Integer ) AS declare variable ID_SKLAD integer; declare variable ID_REC integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable COD_R integer; declare variable D_COD_R integer; declare variable FK_PFIRM_REC integer; declare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable CENA decimal(8,2); declare variable FK_BD_TOVAR integer; declare variable CNT decimal(7,3); declare variable REZ integer; declare variable CNT_OTGR decimal(7,3); declare variable FK_O11 integer; declare variable SUM_DOC decimal(8,2); declare variable SUM_OK decimal(8,2); declare variable SUMRAZNES decimal(8,2); declare variable FK_KS1 integer; declare variable CNT_SO decimal(8,3); declare variable FK_SELFUL integer; declare variable MARGIN decimal(3,2); declare variable DISCOUNT decimal(3,2); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable NDS integer; declare variable FK_11_REZERV integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_USER integer; declare variable NAME_IFS type of column BD_2.NAME_IFS; declare variable FK_REZ integer; declare variable FK_SNOOP_DOGG integer; declare variable STOCK_TOVAR decimal(12,3); declare variable FK_ZAMENA integer; declare variable CNT_ZAMENA decimal(12,3); declare variable KOEF decimal(12,3); declare variable INPLACE_Z decimal(12,3); declare variable NDS_Z decimal(12,3); declare variable CENA_Z decimal(12,3); declare variable DATE_DELIVERY date; declare variable PRIM varchar(200); declare variac select norma_min, bd_calc.is_sbor from bd_calc where field_key=:fk_ttk into :norma_ttk, :is_sbor; if (coalesce(:is_sbor, 0)=0) then begin select last_cena_pr from bd_tovar where field_key=(select bd_calc.fk_bd_tovar from bd_calc where field_key=:fk_ttk) into :cena_pr_prod; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (is_sbor_in is not null) then is_sbor=:is_sbor_in; norma_ttk=iif(coalesce(:norma_ttk,1)=0,1,coalesce(:norma_ttk,1)); cena_pr_prod=:cena_pr_prod*:norma_ttk; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, t.name, cmp.procent_seb from bd_calc_component cmp join bd_tovar t on t.field_key=cmp.fk_bd_tovar where cmp.fk_calc=:fk_ttk into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :procent_seb do begin if (cnt_tov is not null) then begin norma=cast(:norma*:cnt_tov/iif(coalesce(:norma_ttk,0)=0,1,:norma_ttk) as decimal(14,4)); netto=cast(:netto*:cnt_tov/iif(coalesce(:norma_ttk,0)=0,1,:norma_ttk) as decimal(14,4)); end if (norma_prod is not null) then begin norma=cast((norma*norma_prod/:norma_ttk) as decimal(14,4));--*:cnt_tov; netto=cast((norma-(norma/100.0000*cast(:procent_poter as decimal(14,4)))) as decimal(14,4));--*:cnt_tov; end /*else begin norma=:norma*:cnt_tov; netto=:netto*:cnt_tov; end*/ norma_sum=:norma; netto_sum=:netto; if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin if (sum_proc_seb=0) then begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod/:norma_ttk; cena_seb_ed=cena_pr_prod/:norma_ttk; end else begin cena_pr=:cena_pr_prod/:norma_ttk; cena_seb=:cena_pr_prod*:procent_seb/100; cena_seb_ed=:cena_pr*:procent_seb/100; end end --suspend; cena_seb_sum=:cena_seb; cena_seb_ed_sum=:cena_seb_ed; fk_parent=:fk_cmp; select first 1 field_key from bd_calc where fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and is_sbor=1 order by valid_flag desc, field_key desc into :fk_ttk_tmp; fk_ttk_comp=:fk_ttk_tmp; suspend; if (:is_sbor=1) then if (fk_ttk_tmp is not null) then begin cena_seb_sum=0; cena_seb_ed_sum=0; for select cmp.field_key, cmp.fk_calc, cmp.fk_bd_tovar, cmp.norma, cmp.seb_ed, cmp.seb_sum, cmp.netto, cmp.procent_poter, cmp.fk_sklad_zakaz, cmp.fk_operation, cmp.track_flag, cmp.track_variant, cmp.name, cmp.fk_parent, cmp.fk_ttk_comp, cmp.out_level from sp_get_calc_tree(:fk_ttk_tmp,:field_key,:norma,:out_level, :is_sbor,null) cmp into :field_key, :fk_calc, :fk_bd_tovar, :norma, :seb_ed, :seb_sum, :netto, :procent_poter, :fk_sklad_zakaz, :fk_operation, :track_flag, :track_variant, :name, :fk_parent, :fk_ttk_comp, :out_level do begin if (is_sbor=1) then begin select ss.cena_pr, ss.cena_seb, ss.cena_seb_ed from sp_calc_seb_tov(:fk_bd_tovar, null, :norma) ss into :cena_pr, :cena_seb, :cena_seb_ed; end else begin cena_pr=0; cena_seb=0; cena_seb_ed=0; end norma_sum=0; netto_sum=0; if ((curr_level=1)) then curr_level=:curr_level+1; -- curr_level=coalesce(:out_level,0)-:curr_level; suspend; if (:fk_ttk_comp is not null) then curr_level=:curr_level+1; end fk_ttk_tmp=null; end curr_level=coalesce(:in_level,0)+1; end end^ SET TERM ; ^ перекомпиляция18.2.18.1SP_GET_CALC_TREE o fEoRE !/MCREATE TRIGGER BD_VALUTA_KURS_BI FOR BD_VALUTA_KURS ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_VALUTA_KURS_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_VALUTA_KURS_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_VALUTA_KURS_ID, new.FIELD_KEY-tmp); END END триггер fk18.2.20.1CREATE TRIGGER BD_VALUTA_KURS_BIlD[YCREATE GENERATOR GEN_BD_VALUTA_KURS_ID;ген fk18.2.20.1CREATE GENERATOR GEN_BD_VALUTA_KURS_IDJC = CCREATE TABLE bd_valuta_kurs ( field_key integer not null primary key, fk_bd_valuta integer, ts_create timestamp, cnt_main integer, kurs decimal (8,4) ); GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON BD_VALUTA_KURS TO PUBLIC WITH GRANT OPTION;18.2.20.1CREATE TABLE bd_valuta_kurs(B mSSET TERM ^ ; CREATE TRIGGER TR_BD_VALUTA_main_iu FOR BD_VALUTA ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS BEGIN if ((old.MAIN_FLAG is distinct from new.MAIN_FLAG)and(new.MAIN_FLAG=1)) then begin update BD_VALUTA set main_flag=0 where field_key<>new.FIELD_KEY; end END^ SET TERM ; ^признак того, что валюта основная18.2.20.1CREATE TRIGGER TR_BD_VALUTA_main_iu4A o/CCREATE TRIGGER BD_VALUTA_BI FOR BD_VALUTA ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_VALUTA_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_VALUTA_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_VALUTA_ID, new.FIELD_KEY-tmp); END ENDтриггер fk18.2.20.1CREATE TRIGGER BD_VALUTA_BI[@QACREATE GENERATOR GEN_BD_VALUTA_ID;ген fk18.2.20.1GENERATOR GEN_BD_VALUTA_IDm? [?9CREATE TABLE BD_VALUTA ( FIELD_KEY Integer NOT NULL, NAME Varchar(10), FULLNAME Varchar(40), main_flag BOOLFIELD, cnt_cash Integer, kurs_cash decimal(8,4), ts_upd_kurs Timestamp, PRIMARY KEY (FIELD_KEY) ); GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON BD_VALUTA TO "PUBLIC" WITH GRANT OPTION; GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON BD_VALUTA TO SYSDBA WITH GRANT OPTION;таблица валют18.2.20.1CREATE TABLE BD_VALUTA> CyAINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('alertinterval', '15000', 'Интервал проверки оповещений, мс');Интервал проверки оповещений18.2.20.1INSERT INTO GLOBAL_OPTIONS9= yE-SET TERM ^ ; CREATE OR ALTER procedure SP_GET_CALC_TREE ( FK_TTK integer, FK_CMP integer = null, NORMA_PROD decimal(14,4) = null, IN_LEVEL integer = null, IS_SBOR_IN integer = null, CNT_TOV decimal(14,4) = null) returns ( FIELD_KEY integer, FK_PARENT integer, FK_CALC integer, FK_BD_TOVAR integer, NORMA decimal(14,4), SEB_ED decimal(8,4), SEB_SUM decimal(8,4), NETTO decimal(14,4), PROCENT_POTER decimal(5,2), FK_SKLAD_ZAKAZ integer, FK_OPERATION integer, TRACK_FLAG smallint, TRACK_VARIANT smallint, NAME varchar(200), CENA_PR decimal(14,4), CENA_SEB decimal(14,4), CENA_SEB_ED decimal(14,4), NORMA_SUM decimal(14,4), CENA_SEB_SUM decimal(14,4), CENA_SEB_ED_SUM decimal(14,4), NETTO_SUM decimal(14,4), FK_TTK_COMP integer, OUT_LEVEL integer, PROCENT_SEB decimal(7,3), CURR_LEVEL integer) as declare variable CENA_PR_PROD decimal(12,3); declare variable FK_TTK_TMP integer; declare variable NORMA_TTK decimal(14,4); declare variable IS_SBOR integer; declare variable SUM_PROC_SEB decimal(7,3); begin --175 if (fk_ttk is null) then exit; if (in_level is null) then out_level=1; else out_level=in_level+1; curr_level=:out_level;f W VEDW%P m}YCREATE TRIGGER TR_BD_ORDER_IN_1_VALUTA FOR BD_ORDER_IN_1 ACTIVE BEFORE INSERT POSITION 0 AS BEGIN --проставляем валюту по умолчанию if (new.fk_bd_valuta is null) then begin new.fk_bd_valuta = (select first 1 field_key from bd_valuta where main_flag=1); end ENDвалюта по умолчанию для заказа18.2.23.1CREATE TRIGGER TR_BD_ORDER_IN_1_VALUTAO I#GCREATE TRIGGER TR_BD_2_VALUTA FOR BD_2 ACTIVE BEFORE INSERT POSITION 0 AS BEGIN --проставляем валюту по умолчанию if (new.fk_bd_valuta is null) then begin new.fk_bd_valuta = (select first 1 field_key from bd_valuta where main_flag=1); end ENDвалюта по умолчанию при создании расхода18.2.23.1CREATE TRIGGER TR_BD_1_VALUTAN I#GCREATE TRIGGER TR_BD_1_VALUTA FOR BD_1 ACTIVE BEFORE INSERT POSITION 0 AS BEGIN --проставляем валюту по умолчанию if (new.fk_bd_valuta is null) then begin new.fk_bd_valuta = (select first 1 field_key from bd_valuta where main_flag=1); end ENDвалюта по умолчанию при создании прихода18.2.23.1CREATE TRIGGER TR_BD_1_VALUTA\Ma%-ALTER TABLE ks_1 ADD fk_bd_valuta Integer;валюта18.2.20.1ALTER TABLE ks_1pLu%AALTER TABLE BD_order_out_1 ADD fk_bd_valuta Integer;валюта18.2.20.1ALTER TABLE BD_order_out_1nKs%?ALTER TABLE BD_order_in_1 ADD fk_bd_valuta Integer;валюта18.2.20.1ALTER TABLE BD_order_in_1\Ja%-ALTER TABLE BD_2 ADD fk_bd_valuta Integer;валюта18.2.20.1ALTER TABLE BD_2\Ia%-ALTER TABLE BD_1 ADD fk_bd_valuta Integer; валюта18.2.20.1ALTER TABLE BD_1 H mOUCREATE TRIGGER TR_BD_VALUTA_iud_cash FOR BD_VALUTA_KURS ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS declare variable last_cnt_main integer; declare variable last_kurs decimal(8,4); declare variable fk_valuta integer; BEGIN if (deleting) then fk_valuta=old.FK_BD_VALUTA; else fk_valuta=new.FK_BD_VALUTA; select first 1 cnt_main, kurs from BD_VALUTA_KURS where fk_bd_valuta=new.FK_BD_VALUTA order by ts_create desc into :last_cnt_main, :last_kurs; update BD_VALUTA set cnt_cash=:last_cnt_main, kurs_cash=:last_kurs, ts_upd_kurs=current_timestamp where field_key=:fk_valuta; END триггер на кеширование последнего актуального курса18.2.20.1CREATE TRIGGER TR_BD_VALUTA_iud_cashpG ' %CREATE DESCENDING INDEX IDX_BD_VALUTA_KURS1 ON BD_VALUTA_KURS (TS_CREATE); 18.2.20.1CREATE INDEX3F MEMINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Настройка валют', 'menu_valuta', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='menu_payment')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Добавление валюты', 'valuta_add', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='menu_valuta')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Удаление валюты', 'valuta_del', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='menu_valuta')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Изменение учетной валюты', 'valuta_setmain', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='menu_valuta')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Изменение курса валюты', 'valuta_setkurs', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='menu_valuta')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Изменение валюты в документах склада', 'valuta_setdoc', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='menu_valuta')); права на валюты18.2.20.1INSERT INTO BD_USERS_RIGHTS_NAME To Tk}-ALTER TABLE KS_1 ADD summa_main Decimal(15,2);сумма оплаты в исходной валюте18.2.23.1ALTER TABLE KS_1Sma-ALTER TABLE KS_1 ADD fk_bd_valuta_main Integer;исходная валюта оплаты18.2.23.1ALTER TABLE KS_1UR KAALTER TRIGGER BD_2_INS_1_6 ACTIVE BEFORE INSERT OR UPDATE POSITION 3 AS declare variable fk1_6 integer; declare variable fk21 integer; declare variable fkuser integer; declare variable price_nds integer; declare variable skl integer; declare variable fktov integer; declare variable priority integer; declare variable nds integer; declare variable date_save date; declare variable date_make date; declare variable gtd varchar(26); declare variable cena_nds decimal(12,5); declare variable cena_nonds decimal(12,5); declare variable summa_nds decimal(12,5); declare variable summa_w_nds decimal(12,5); declare variable summa_wo_nds decimal(12,5); declare variable cnt_ decimal(7,3); declare variable inplace decimal(7,3); declare variable articul varchar(20); declare variable newcod_prih type of column bd_1.cod_prih; declare variable newfk_11_6 integer; declare variable summa_21 decimal(12,5); declare variable man_flag integer; declare variable fk_supplier_6 integer; declare variable fk_bd_11_6_main integer; declare variable fk_bd_21_6 integer; declare variable track_21 type of column bd_21.track_21; declare variable fk_creator_11 integer; begin /* Trigger text */ --приход по расходу уже есть, обрабатываем смену кода расхода, даты расхода, юр.лица получателя, юр.лица отправителя if ((new.FK_BD_1_6 is not null)and((coalesce(old.COD_RASH,'0')<>coalesce(new.COD_RASH,'0'))or(coalesce(old.FK_SELFUL2,0)<>coalesce(new.FK_SELFUL2,0)) or(coalesce(old.DATE_RASH,'1.1.1800')<>coalesce(new.DATE_RASH,'1.1.1800'))or(coalesce(old.FK_SELFUL,0)<>coalesce(new.FK_SELFUL,0))or(coalesce(old.FK_BD_SMENA2,0)<>coalesce (new.FK_BD_SMENA2,0)))) then begin newcod_prih=coalesce((select min(COD_PRIH_6) from BD_COD_RASH where field_key=new.COD_RASH),'0'); update bd_1 set cod_prih=:newcod_prih, fk_selful_from=new.FK_SELFUL, fk_selful=new.FK_SELFUL2, date_prih=new.DATE_RASH, fk_bd_smena=new.FK_BD_SMENA2, fk_bd_valuta=new.FK_BD_VALUTA where field_key=new.FK_BD_1_6; end --прихода по расходу еще нет и контрагент - не склад if ((new.cod_rash in ('0','1','2','3','8','6'))and((new.fk_bd_firm<>new.fk_recipient)or(coalesce(new.FK_BD_SMENA,0)<>coalesce(new.FK_BD_SMENA2,0)))and (new.fk_bd_1_6 is null)and(coalesce(new.VALID_FLAG,0)<>coalesce(old.VALID_FLAG,0))and(new.VALID_FLAG=1)) then BEGIN if (not exists(select coalesce(bd_firm.sklad,0) from bd_firm where bd_firm.field_key=new.fk_recipient and sklad=1)) then exit; ---------------------------------->>------------ select field_key from bd_users where upper(login)=upper(current_user) into fkuser; /* newcod_prih='0'; if (new.cod_rash='0')j(Q q}[CREATE TRIGGER TR_BD_ORDER_OUT_1_VALUTA FOR BD_ORDER_OUT_1 ACTIVE BEFORE INSERT POSITION 0 AS BEGIN --проставляем валюту по умолчанию if (new.fk_bd_valuta is null) then begin new.fk_bd_valuta = (select first 1 field_key from bd_valuta where main_flag=1); end ENDвалюта по умолчанию для заявки18.2.23.1CREATE TRIGGER TR_BD_ORDER_OUT_1_VALUTA then newcod_prih='0'; if (new.cod_rash='1') then newcod_prih='1'; if (new.cod_rash='2') then newcod_prih='2'; if (new.cod_rash='3') then newcod_prih='3'; if (new.cod_rash='8') then newcod_prih='4'; if (new.cod_rash='6') then newcod_prih='6'; */ newcod_prih=coalesce((select min(COD_PRIH_6) from BD_COD_RASH where field_key=new.COD_RASH),'0'); fk1_6=gen_id(gen_bd_1_id,1); /*UPDATE OR*/ INSERT INTO BD_1 ( FIELD_KEY /*INTEGER NOT NULL*/, FK_BD_FIRM /*INTEGER*/, NOMER_PRIH /*INTEGER*/, DATE_PRIH /*DATE*/, TIME_PRIH /*TIME*/, NOMER_NAKL /*CHAR(25)*/, DATE_NAKL /*DATE*/, NOMER_SF /*CHAR(25)*/, FK_SUPPLIER /*INTEGER*/, FK_FACE /*INTEGER*/, COD_PRIH /*CHAR(1)*/, DAY_CONS_PRIH /*INTEGER*/, DATE_SF /*DATE*/, POST_FLAG /*INTEGER*/, EXPORT_FLAG /*INTEGER*/, VALID_FLAG /*INTEGER*/, FK_BD_PFIRM /*INTEGER*/, FK_BD_USERS /*INTEGER*/, PRICE_NDS_FLAG/*BOOLFIELD BOOLFIELD = INTEGER */, FK_BD_SF_IN /*INTEGER*/, FK_SPS1 /*INTEGER*/, MARKER /*INTEGER NOT NULL*/, FK_SELFUL_FROM, FK_SELFUL, DATE_CONS, fk_bd_smena, COMM, fk_bd_valuta ) values (:fk1_6,new.fk_recipient,(select coalesce(max(nomer_prih)+1,1) from bd_1 where fk_bd_firm=new.fk_recipient), new.date_rash,current_time,new.nomer_rash,new.date_nakl,null,new.fk_bd_firm,new.fk_face,:newcod_prih,new.day_cons_rash,null, 0,0,0,new.fk_bd_pfirm,:fkuser,:price_nds,null, null, 0,new.fk_selful,new.fk_selful2,new.date_rash+new.day_cons_rash, new.FK_BD_SMENA2, new."COMMENT", new.FK_BD_VALUTA); --matching () new.fk_bd_1_6=:fk1_6; if (updating) then begin --если это создание прихода при обновлении, то мы добавляем позиции в новый приход for select bd_11.fk_bd_tovar, bd_21.field_key, bd_21.cnt, bd_21.cena_with_nds, bd_21.CENA_WITHOUT_NDS, bd_11.NDS, bd_11.PRIORITY, bd_11.GTD, bd_11.ARTICUL, bd_11.INPLACE, bd_11.DATE_SAVE, bd_11.date_make, bd_21.SUMMA, bd_21.SUM_INPUT_MAN_FLAG, coalesce(bd_11.FK_SUPPLIER_6,bd_11.FK_SUPPLIER), coalesce(bd_11.fk_bd_11_6_main,bd_11.field_key), bd_21.field_key, bd_21.track_21, bd_11.fk_creator_11 from bd_21 join bd_11 on bd_11.FIELD_KEY=bd_21.FK_BD_11 where fk_bd_2=new.FIELD_KEY into :fktov, :fk21, :cnt_, :cena_nds, :cena_nonds, :nds, :priority, :gtd, :articul, :inplace, :date_save, :date_make, :summa_21, :man_flag, :fk_supplier_6, :fk_bd_11_6_main, :fk_bd_21_6, :track_21, :fk_creator_11 do begin summa_w_nds=(iif(man_flag=1,SUMMA_21,(cnt_*cena_nds))); --cnt_*cena_nds; summa_wo_nds=summa_w_nds/(100.00+nds)*100.00; summa_nds=summa_w_nds-summa_wo_nds; insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE, date_make, GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,ARTICUL, summa_nds, fk_supplier_6, fk_bd_11_6_main,fk_bd_21_6, track_11, fk_creator_11) VALUES (:fk1_6,:fktov,:priority,:nds,:date_save,:date_make, :gtd, :cena_nds, :cena_nonds, :cnt_, :summa_w_nds,:summa_wo_nds,0,:inplace,:articul, :summa_nds, :fk_supplier_6, :fk_bd_11_6_main, :fk_bd_21_6, :track_21, :fk_creator_11) returning (FIELD_KEY) into :newfk_11_6; update bd_21 set bd_21.fk_bd_11_6=:newfk_11_6 where bd_21.field_key=:fk21; track_21=null; end end ----------------------------------<<------------ END endвнутренние перемещения, валюта в приходе из расхода18.2.23.1ALTER TRIGGER BD_2_INS_1_6  / /Vke5ALTER TABLE KS_1 ADD valuta_kurs Decimal(8,4);курс конвертации валюты18.2.28.1ALTER TABLE KS_1 ADDDU =wMINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Изменение валюты в документах оплаты', 'valuta_setks', (select field_key from BD_USERS_RIGHTS_NAME where name_var='menu_valuta')); INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Конвертация валюты в документах оплаты', 'valuta_ks_convertion', (select field_key from BD_USERS_RIGHTS_NAME where name_var='menu_valuta'));управление валютой в оплатах18.2.23.1INSERT INTO BD_USERS_RIGHTS_NAMEmse break; end --сначала учитывать накладные со склада = подразделение платежа if (:fk_sklad<>-1) then BEGIN for select main.field_key, dolgfromdate, 1 as typdoc, summa_dolg from bd_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg>0 and coalesce(main.COD_PRIH,0) in (2,3,0,4) and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) UNION select main.FIELD_KEY, main.DATE_RASH, 2 as typdoc, 0-summa_dolg from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg<>0 and main.COD_RASH=5 and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) order by 2 asc, 3 desc into :fk_doc, :date_dolg, :typdoc, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN BREAK; if (typdoc=1) then begin if (not exists(select field_key from ks_11 where ks_11.FK_KS_1=:fk_ks1 and fk_bd_1=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_1, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_1=:fk_doc; end if (typdoc=2) then begin if (not exists(select field_key from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc; end sum_ost=sum_ost-sum_opl; end else BREAK; end END --затем накладные с других складов, но только если глобальная опция oplat_nakl_by_sklad выключена if (by_sklad<>'1') THEN BEGIN for select main.field_key, dolgfromdate, 1 as typdoc, summa_dolg from bd_1 main --BD_1 main left join BD_11 on BD_11.FK_BD_1=main.FIELD_KEY where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg>0 and coalesce(main.COD_PRIH,0) in (2,3,0,4) and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) --and field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) UNION select main.FIELD_KEY, main.DATE_RASH, 2 as typdoc, 0-summa_dolg from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and summa_dolg<>0 and main.COD_RASH=5 and main.VALID_FLAG=1 and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) --and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) order by 2 asc, 3 desc into :fk_doc, :date_dolg, :typdoc, :dolgdoc do n begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; if (typdoc=1) then begin if (not exists(select field_key from ks_11 where ks_11.FK_KS_1=:fk_ks1 and fk_bd_1=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_1, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_1=:fk_doc; end if (typdoc=2) then begin if (not exists(select field_key from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc)) then insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); else update ks_11 set summa=summa+:sum_opl where fk_ks_1=:fk_ks1 and fk_bd_2=:fk_doc; end sum_ost=sum_ost-sum_opl; end else BREAK; end END END --prih=0 if (prih=1) THEN BEGIN sum_ost=coalesce((select ks_1.summa-coalesce(sum(ks_11.summa),0) from KS_1 left join ks_11 on ks_11.FK_KS_1=ks_1.FIELD_KEY and (ks_1.PRIH=1 and ks_11.fk_bd_2 is not null) where ks_1.field_key=:fk_ks1 group by ks_1.summa),0); --разносим по расходам --сначала учитывать накладные со склада = подразделение платежа if (:fk_sklad<>-1) then begin for select main.FIELD_KEY, main.DATE_RASH, iif(main.cod_rash=7,0-summa_dolg,summa_dolg) from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and ( (summa_dolg>0 and main.COD_RASH in (2,3,0,8)) or ((summa_dolg<>0 and main.COD_RASH in (7))) ) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm=:fk_sklad ---- and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) order by 2, 3 into :fk_doc, :date_dolg, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else BREAK; end end --затем накладные с других складов, но только если глобальная опция oplat_nakl_by_sklad выключена if (by_sklad<>'1') THEN BEGIN for select main.FIELD_KEY, main.DATE_RASH, iif(main.cod_rash=7,0-summa_dolg,summa_dolg) from BD_2 main where main.FK_RECIPIENT=:fk_bd_firm and main.FK_SELFUL=:fk_ul and ( (summa_dolg>0 and main.COD_RASH in (2,3,0,8)) or ((summa_dolg<>0 and main.COD_RASH in (7))) ) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((coalesce(main.fk_bd_dogovor,-1)=coalesce(:fk_dogovor,-1)) or (coalesce(:fk_dogovor,-1)=-1)) and main.fk_bd_firm<>:fk_sklad ---- and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) order by 2, 3 into :fk_doc, :date_dolg, :dolgdoc do begin if (sum_ost>0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else BREAK; end END END --prih=1 if (prih=2) THEN --разносим по внутренним перемещениям BEGIN select sum(summa) from ks_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null into :sum_raznes; sum_ost=sum_opl-coalesce(sum_raznes,0); for select main.FIELD_KEY, main.DATE_rash, -coalesce((select sum(ks_11.summa) from ks_11 where FK_BD_2=main.field_key),0)+sum(bd_21.SUMMA) from BD_2 main left join BD_21 on BD_21.FK_BD_2=main.FIELD_KEY where main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and main.fk_selful=:fk_ul2 and main.fk_selful2=:fk_ul and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) --учет глобальной опции "Привязывать платежи к накладным только в рамках подразделения" and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) group by 1,2 having coalesce((select sum(ks_11.summa) from ks_11 where FK_BD_2=main.field_key),0)0) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; insert into ks_11(field_key, fk_ks_1, fk_bd_2, summa) VALUES (gen_id(GEN_KS_11_ID,1),:fk_ks1, :fk_doc, :sum_opl); sum_ost=sum_ost-sum_opl; end else break; END END --обработка если сумма оплаты меньше суммы разнесения if (prih=0) then --уменьшаем разнесение по приходам BEGIN sum_ost=coalesce((select ks_1.summa-coalesce(sum(ks_11.summa),0) from KS_1 left join ks_11 on ks_11.FK_KS_1=ks_1.FIELD_KEY and (ks_1.PRIH=0 and ((ks_11.fk_bd_1 is not null) or (coalesce(ks_11.summa,0)<0))) where ks_1.field_key=:fk_ks1 group by ks_1.summa),0); if (sum_ost<0) then -- if (2>3) then begin for select ks_11.field_key, ks_11.summa from ks_11 where fk_ks_1=:fk_ks1 and ks_11.fk_bd_1 is not null order by field_key desc into :fk_ks11, :sum_ks11 do begin if (sum_ost<0) then begin if (sum_ks113) then begin for select ks_11.field_key, ks_11.summa from ks_11 where fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null order by field_key desc into :fk_ks11, :sum_ks11 do begin if (sum_ost<0) then begin if (sum_ks110) then begin sum_opl=0; if (dolgdoc>sum_ost) then sum_opl=sum_ost; else sum_opl=dolgdoc; if (sum_opl=0) THEN break; update ks_11 set fk_ks_1=:fk_ks1, summa=:sum_opl where field_key=:fk_ks1; sum_ost=sum_ost-sum_opl; end ellq; BEGIN by_sklad=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='OPLAT_NAKL_BY_SKLAD'),'0'); if (by_sklad='') then by_sklad='0'; select fk_sklad, fk_bd_valuta from ks_1 where field_key=:fk_ks1 into :fk_sklad, :fk_valuta; if ((fk_sklad is null) and (by_sklad='1')) then exit; --если подразделение не указано, но требуется привязывать только по нему lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); vh_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Входящий счет ',:lang)),''); prihod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); vozvrat_txt= coalesce((select TR_NAME from SP_TRANSLATE('Возврат от получателя ',:lang)),''); ish_shet_txt=coalesce((select TR_NAME from SP_TRANSLATE('Исходящий счет ',:lang)),''); rashod_txt= coalesce((select TR_NAME from SP_TRANSLATE('Расход ',:lang)),''); select fk_selful from KS_SCHET where field_key=:fk_ks_shet into :urfrom; select fk_selful from KS_SCHET where field_key=:fk_ks_shet2 into :urto; -- select coalesce(KS_KODI.PODBOR,2) from ks_kodi where field_key=:fk_codi into :podbor; -- podbor=coalesce(podbor,2); --если подбор не указан, выводим все документы podbor=2; --теперь всегда выводим все документы, подбор по типам убран IF (IS_PRIHOD=0) THEN BEGIN --расход - оплата счетов поставщиков и приходов if (podbor in (0,2)) then BEGIN for select main.FIELD_KEY, main.NOMER_PRIH, main.DOLGFROMDATE, main.date_prih, main.summa, summa_dolg, :prihod_txt, 100||coalesce(main.COD_PRIH,'') from BD_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and cod_prih=4 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END END if (podbor in (1,2)) then BEGIN --приходы for select main.FIELD_KEY, main.NOMER_PRIH, main.DOLGFROMDATE, main.date_prih, main.summa, summa_dolg, :prihod_txt, 100||coalesce(main.COD_PRIH,'') from BD_1 main where main.FK_SUPPLIER=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.field_key not in (select coalesce(fk_bd_1,-1) from KS_11 where fk_ks_1=:fk_ks1) and main.cod_prih not in (4,9) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=3; suspend; END --возвраты от получателя --[24.09.2015] заменено на возвраты поставщику for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg, :rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (5,7) --было 7, потом 5, [17.11.15] (5,7) and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; ---- suspend; END END END IF (IS_PRIHOD=1) then BEGIN if (podbor in (0,2)) then BEGIN for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, main.summa, summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH=8 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, main.summa, summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (2,3,0) --[24.09.2015] 5 убрано and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END --[24.09.2015] добавлено, код 7 if (podbor in (1,2)) then for select main.FIELD_KEY, main.NOMER_rash, main.DOLGFROMDATE, main.date_rash, 0-main.summa, 0-summa_dolg ,:rashod_txt, 200||coalesce(main.COD_RASH,'') from BD_2 main where main.FK_recipient=:fk_bd_firm and main.FK_SELFUL=:urfrom and summa_dolg>0 and main.COD_RASH in (5,7) ---[17.11.15] добавлено 5 and main.field_key not in (select coalesce(fk_bd_2,-1) from KS_11 where fk_ks_1=:fk_ks1) and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc, :cod_doc do BEGIN num_typdoc=4; suspend; END END if (is_prihod=2) THEN BEGIN --если это перемещение между счетами, находим внутренние перемещения между складами юрлиц --находим юр.лицо-отправитель и юр.лицо-получатель --находим все неоплаченные расходы со склада-юрлица счета получателя на склады юрлица счета-отправителя, --потому что товары и деньги движутся в противоположных направлениях... for select main.FIELD_KEY, main.NOMER_rash, main.dolgfromdate, main.date_rash, summa, summa_dolg, bd_cod_rash.name||coalesce('('||trim(main.NOMER_NAKL)||')','') from BD_2 main left join BD_COD_RASH on BD_COD_RASH.FIELD_KEY=main.cod_rash where main.fk_selful=:urto and main.fk_selful2=:urfrom and main.field_key not in (select fk_bd_2 from KS_11 where fk_ks_1=:fk_ks1 and fk_bd_2 is not null) and summa_dolg>0 and ((main.fk_bd_firm=:fk_sklad and :by_sklad='1') or (main.fk_bd_firm<>-1 and :by_sklad<>'1')) and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) into :fk_doc, :nomerdoc, :datdoc, :datdoc_enter, :summadoc, :dolgdoc, :typdoc do BEGIN num_typdoc=4; suspend; END END END ^ SET TERM ; ^подбор документов в оплату - по валюте18.2.28.1ALTER PROCEDURE SP_KS_11_PODBOR  X KSET TERM ^ ; ALTER PROCEDURE SP_KS_11_PODBOR ( IS_PRIHOD Integer, FK_BD_FIRM Integer, FK_CODI Integer, FK_KS1 Integer, FK_KS_SHET Integer, FK_KS_SHET2 Integer ) RETURNS ( NUM_TYPDOC Integer, FK_DOC Integer, NOMERDOC Integer, DATDOC Date, DATDOC_ENTER Date, SUMMADOC Decimal(15,2), DOLGDOC Decimal(15,2), TYPDOC Varchar(50), COD_DOC Varchar(10), FK_KS11 Integer ) AS declare variable PODBOR integer; declare variable ID_RASH integer; declare variable ID_SH_IN integer; declare variable ID_SH_OUT integer; declare variable URTO integer; declare variable URFROM integer; declare variable LANG varchar(2); declare variable VH_SHET_TXT varchar(100); declare variable PRIHOD_TXT varchar(100); declare variable VOZVRAT_TXT varchar(100); declare variable ISH_SHET_TXT varchar(100); declare variable RASHOD_TXT varchar(100); declare variable by_sklad varchar(1); declare variable fk_sklad integer; declare variable FK_valuta integerp CC9Y   QSET TERM ^ ; ALTER PROCEDURE SP_KS_11_PODBOR_ZV ( IS_PRIHOD Integer, FK_BD_FIRM Integer, FK_CODI Integer, FK_KS1 Integer, FK_KS_SHET Integer, FK_KS_SHET2 Integer ) RETURNS ( NUM_TYPDOC Integer, FK_DOC Integer, NOMERDOC Integer, DATDOC Date, SUMMADOC Decimal(15,2), DOLGDOC Decimal(15,2), TYPDOC Varchar(50), FK_KS11 Integer ) AS DECLARE VARIABLE podbor integer; DECLARE VARIABLE id_prih integer; DECLARE VARIABLE id_rash integer; DECLARE VARIABLE id_sh_in integer; DECLARE VARIABLE id_sh_out integer; DECLARE VARIABLE URTO Integer; DECLARE VARIABLE URFrom Integer; DECLARE VARIABLE id_kont Integer; DECLARE VARIABLE prih Integer; declare variable lang varchar(2); declare variable zakaz_txt varchar(100); declare variable prihod_txt varchar(100); declare variable FK_valuta integer; BEGIN lang=coalesce((select first 1 paramvalue from GLOBAL_OPTIONS where upper(paramname)='LANGUAGE'),'RU'); prihod_txt=coalesce((select TR_NAME from SP_TRANSLATE('Приход ',:lang)),''); zakaz_txt= coalesce((select TR_NAME from SP_TRANSLATE('Заказ ',:lang)),''); --при оплате по заявкам выбираем все ks_11, не привязанные к оплатам select fk_selful from KS_SCHET where field_key=:fk_ks_shet into :urfrom; select fk_selful from KS_SCHET where field_key=:fk_ks_shet2 into :urto; select ks_1.PRIH, ks_1.FK_BD_FIRM, fk_bd_valuta from ks_1 where field_key=:FK_KS1 into :prih, :id_kont, :fk_valuta; if (prih=0) THEN begin --приход for select ks_11.field_key, fk_bd_1, :prihod_txt||(case main.cod_prih when 0 then ' ('||BD_COD_PRIH.NAME||')' when 2 then ' ('||BD_COD_PRIH.NAME||' '||(date_prih+coalesce(main.DAY_CONS_PRIH,0))||')' when 3 then ' ('||BD_COD_PRIH.NAME||')' when 4 then ' ('||BD_COD_PRIH.NAME||')' else '' end), main.NOMER_PRIH, ks_11.PLAN_DAT, (select sum(summa_with_nds) from bd_11 where fk_bd_1=main.field_key), ks_11.PLAN_SUM from KS_11 join bd_1 main on main.field_key=ks_11.FK_BD_1 --join bd_firm on bd_firm.field_key=main.fk_bd_firm join BD_COD_PRIH on BD_COD_PRIH.FIELD_KEy=main.cod_prih where fk_ks_1 is null and (plan_fk_schet is null or plan_fk_schet=:FK_KS_SHET) and plan_sum>0 and fk_bd_1 is not null and main.FK_SELFUL=:urfrom and main.FK_SUPPLIER=:id_kont and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) INTO :fk_ks11,:FK_DOC, :typdoc, :nomerdoc, :datdoc, :summadoc, :dolgdoc do BEGIN NUM_TYPDOC=3; suspend; END --счет от поставщика for select ks_11.field_key, fk_order_in, :zakaz_txt,main.NOMER_SHET, ks_11.PLAN_DAT, (select sum(BD_ORDER_IN_11.SUMMA_WITH_NDS) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_ORDER_IN_1=main.field_key), ks_11.PLAN_SUM from ks_11 join BD_ORDER_IN_1 main on main.field_key=ks_11.fk_order_in --join bd_firm on bd_firm.field_key=main.fk_bd_firm where fk_ks_1 is null and (plan_fk_schet is null or plan_fk_schet=:FK_KS_SHET) and plan_sum>0 and fk_order_in is not null and main.FK_SELFUL=:urfrom and main.FK_SUPPLIER=:id_kont and (coalesce(:fk_valuta,-1)=coalesce(main.FK_BD_VALUTA,-1)) INTO :fk_ks11,:FK_DOC, :typdoc, :nomerdoc, :datdoc, :summadoc, :dolgdoc do BEGIN NUM_TYPDOC=1; suspend; END END END^ SET TERM ; ^подбор заявок на оплату - по валюте18.2.28.1ALTER PROCEDURE SP_KS_11_PODBOR_ZV KeK|\iU7ALTER TABLE BD_VALUTA ADD cod_num Varchar(3);цифровой код валюты18.3.1.1ALTER TABLE BD_VALUTA[ A/7CREATE TRIGGER TR_BD_VALUTA_FIRST_BI FOR BD_VALUTA ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if ((select count(*) from BD_VALUTA)=0) then begin new.MAIN_FLAG=1; INSERT INTO BD_VALUTA_KURS (FK_BD_VALUTA, CNT_MAIN, KURS) VALUES (new.FIELD_KEY, 1, 1); end ENDустановка первой введенной валюты в учетную18.3.1.1TR_BD_VALUTA_FIRST_BIZ KSSET TERM ^ ; ALTER PROCEDURE SP_GET_SHET_OSTATOK ( FK_SHET_IN Integer, TODATE Date, fk_val integer ) RETURNS ( FK_SHET Integer, NAME_SHET Varchar(100), SUM_PRIH Decimal(15,2), SUM_RASH Decimal(15,2), SUM_PRIH_SELF Decimal(15,2), SUM_RASH_SELF Decimal(15,2), OSTATOK Decimal(15,2), SHET_NAME Varchar(100), UL_NAME Char(100), fk_bd_valuta integer, valuta varchar(20) ) AS declare variable ID_USER integer; BEGIN select first 1 field_key from BD_USERS where upper(login)=upper(current_user) into :id_user; todate=coalesce(todate,CURRENT_DATE); for select KS_SCHET.FIELD_KEY, KS_SCHET.name||' '||coalesce(bd_selful.OW_NAME,0), KS_SCHET.name,coalesce(bd_selful.OW_NAME,0) from KS_SCHET join BD_USERS_RIGHTS on BD_USERS_RIGHTS.FK_RIGHTS=KS_SCHET.FIELD_KEY left join bd_selful on bd_selful.field_key=ks_schet.FK_SELFUL where (KS_SCHET.field_key=:fk_shet_in or :fk_shet_in is null) and (coalesce(ks_schet.is_arh_flag,0)=0) and BD_USERS_RIGHTS.TYPEOFRIGHTS='C' and BD_USERS_RIGHTS.FK_BD_USERSORGRT=:id_user into :fk_shet, :name_shet, :shet_name, :ul_name do BEGIN --находим все поступления на счет и списания со счета for select cast(-1 as integer), cast(null as varchar(20)) from RDB$DATABASE where (:fk_val is null or :fk_val=-1) and exists(select field_key from ks_1 where fk_bd_valuta is null and (fk_ks_schet=:fk_shet or fk_ks_shet2=:fk_shet) and ks_1.VALID_FLAG=1) union select v.field_key, v.name from BD_VALUTA v where (:fk_val is null or :fk_val=v.field_key) and exists(select field_key from ks_1 where fk_bd_valuta=v.field_key and (fk_ks_schet=:fk_shet or fk_ks_shet2=:fk_shet) and ks_1.VALID_FLAG=1) and (coalesce(:fk_val,-2)<>-1) into :fk_bd_valuta, :valuta do begin select coalesce(sum(case when (prih=1) then coalesce(summa_main,summa) else 0 end),0), coalesce(sum(case when (prih=0) then coalesce(summa_main,summa) else 0 end),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih in (1,0) and ks_1.VALID_FLAG=1 and coalesce(ks_1.fk_bd_valuta,-1)=coalesce(:fk_bd_valuta,-1) into :sum_prih, :sum_rash; select coalesce(sum(coalesce(summa_main,summa)),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and coalesce(ks_1.fk_bd_valuta,-1)=coalesce(:fk_bd_valuta,-1) into :sum_rash_self; select coalesce(sum(coalesce(summa_main,summa)),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_shet2=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and coalesce(ks_1.fk_bd_valuta,-1)=coalesce(:fk_bd_valuta,-1) into :sum_prih_self; ostatok=sum_prih+sum_prih_self-sum_rash-sum_rash_self; suspend; end END END^ SET TERM ; ^Остаток по счетам в разрезе валют18.2.28.1ALTER PROCEDURE SP_GET_SHET_OSTATOK EE7] Qc3SET TERM ^ ; ALTER PROCEDURE SP_GET_SHET_OSTATOK ( FK_SHET_IN Integer, TODATE Date, FK_VAL Integer default null ) RETURNS ( FK_SHET Integer, NAME_SHET Varchar(100), SUM_PRIH Decimal(15,2), SUM_RASH Decimal(15,2), SUM_PRIH_SELF Decimal(15,2), SUM_RASH_SELF Decimal(15,2), OSTATOK Decimal(15,2), SHET_NAME Varchar(100), UL_NAME Char(100), FK_BD_VALUTA Integer, VALUTA Varchar(20) ) AS declare variable ID_USER integer; declare variable has_dvig integer; BEGIN select first 1 field_key from BD_USERS where upper(login)=upper(current_user) into :id_user; todate=coalesce(todate,CURRENT_DATE); for select KS_SCHET.FIELD_KEY, KS_SCHET.name||' '||coalesce(bd_selful.OW_NAME,0), KS_SCHET.name,coalesce(bd_selful.OW_NAME,0) from KS_SCHET join BD_USERS_RIGHTS on BD_USERS_RIGHTS.FK_RIGHTS=KS_SCHET.FIELD_KEY left join bd_selful on bd_selful.field_key=ks_schet.FK_SELFUL where (KS_SCHET.field_key=:fk_shet_in or :fk_shet_in is null) and (coalesce(ks_schet.is_arh_flag,0)=0) and BD_USERS_RIGHTS.TYPEOFRIGHTS='C' and BD_USERS_RIGHTS.FK_BD_USERSORGRT=:id_user into :fk_shet, :name_shet, :shet_name, :ul_name do BEGIN --находим все поступления на счет и списания со счета has_dvig=0; for select cast(-1 as integer), cast(null as varchar(20)) from RDB$DATABASE where (:fk_val is null or :fk_val=-1) and exists(select field_key from ks_1 where fk_bd_valuta is null and (fk_ks_schet=:fk_shet or fk_ks_shet2=:fk_shet) and ks_1.VALID_FLAG=1) union select v.field_key, v.name from BD_VALUTA v where (:fk_val is null or :fk_val=v.field_key) and exists(select field_key from ks_1 where fk_bd_valuta=v.field_key and (fk_ks_schet=:fk_shet or fk_ks_shet2=:fk_shet) and ks_1.VALID_FLAG=1) and (coalesce(:fk_val,-2)<>-1) into :fk_bd_valuta, :valuta do begin select coalesce(sum(case when (prih=1) then coalesce(summa_main,summa) else 0 end),0), coalesce(sum(case when (prih=0) then coalesce(summa_main,summa) else 0 end),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih in (1,0) and ks_1.VALID_FLAG=1 and coalesce(ks_1.fk_bd_valuta,-1)=coalesce(:fk_bd_valuta,-1) into :sum_prih, :sum_rash; select coalesce(sum(coalesce(summa_main,summa)),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and coalesce(ks_1.fk_bd_valuta,-1)=coalesce(:fk_bd_valuta,-1) into :sum_rash_self; select coalesce(sum(coalesce(summa_main,summa)),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_shet2=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and coalesce(ks_1.fk_bd_valuta,-1)=coalesce(:fk_bd_valuta,-1) into :sum_prih_self; ostatok=sum_prih+sum_prih_self-sum_rash-sum_rash_self; has_dvig=1; suspend; end if (has_dvig=0) then begin ostatok=0; select field_key, name from BD_VALUTA where main_flag=1 into :fk_bd_valuta, :valuta; suspend; end END END^ SET TERM ; ^параметр валюта - значение по умолчанию+счета без движений18.3.2.1SP_GET_SHET_OSTATOKwag=1 and fk_bd_firm=a.field_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0)) as summa, 1 as typerec from bd_firm a where --a.GET_KS_post=1 and coalesce(sklad,0)=0 a.field_key=:fk_sklad ------1 UNION ------3 select a.field_key, a.name, d.nomer_partner, d.field_key as fk_bd_dogovor, (coalesce((select sum(bd_1.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_1 left join ks_11 on ks_11.fk_bd_1=bd_1.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_1.fk_supplier=a.field_key and bd_1.fk_selful=:fk_selful and bd_1.fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor=d.field_key and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=a.field_key and bd_2.fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5 ) and bd_2.fk_bd_dogovor=d.field_key ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=d.field_key),0))- (coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=a.field_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor=d.field_key ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=a.field_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor=d.field_key ),0)+ coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=d.field_key),0)) as summa, 3 as typerec from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key where --a.GET_KS_post=1 and coalesce(sklad,0)=0 and d.field_key is not null and a.field_key=:fk_sklad -------3 order by 2 asc, 6 desc INTO :firm_key, :name, :nomer_partner, :fk_bd_dogovor, :summa, :typerec DO BEGIN docs_valid=0; docs_not_valid=0; if (:fk_bd_dogovor is null) then tmp_fk_bd_dogovor = -1; else tmp_fk_bd_dogovor=fk_bd_dogovor; if (typerec in (1,3)) then begin cnt=0; select first 1 field_key from bd_1 where fk_supplier=:firm_key and fk_selful=:fk_selful and fk_selful_from is null and bd_1.dolgfromdate <=:date_dolg and valid_flag=1 and coalesce(bd_1.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor into :cnt; if (coalesce(:cnt,0)>0) then docs_valid=1; if (docs_valid=0) then select first 1 field_key from bd_2 where fk_recipient=:firm_key and fk_selful=:fk_selful and fk_selful2 is null and bd_2.dolgfromdate <=:date_dolg and valid_flag=1 and coalesce(bd_2.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor into :cnt; if (coalesce(:cnt,0)>0) then docs_valid=1; x if (docs_valid=0) then select first 1 field_key from ks_1 where (fk_bd_firm=:firm_key and valid_flag=1 and ks_1.date_create <=:date_dolg and coalesce(ks_1.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor) and ((ks_1.fk_selful=:fk_selful and prih=0) or (fk_selful=:fk_selful and prih=1)) into :cnt; if (coalesce(:cnt,0)>0) then docs_valid=1; cnt=0; select first 1 field_key from ks_1 where (fk_bd_firm=:firm_key and valid_flag<>1 and ks_1.date_create <=:date_dolg and coalesce(ks_1.fk_bd_dogovor,-1)=:tmp_fk_bd_dogovor) and ((ks_1.fk_selful=:fk_selful and prih=0) or (fk_selful=:fk_selful and prih=1)) into :cnt; if (coalesce(:cnt,0)>0) then docs_not_valid=1; end debit=0; KREDIT=0; debit2=0; kredit2=0; IF (TYPEREC=1) THEN begin select coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=:firm_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=:firm_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0) as summa from bd_firm a where a.GET_KS_post=1 and coalesce(sklad,0)=0 and field_key=:firm_key INTO :DEBIT; --1-1d select coalesce((select sum(bd_1.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_1 left join ks_11 on ks_11.fk_bd_1=bd_1.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_1.fk_supplier=:firm_key and bd_1.fk_selful=:fk_selful and bd_1.fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor is null and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=:firm_key and bd_2.fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0) as summa from bd_firm a where a.GET_KS_post=1 and coalesce(sklad,0)=0 and field_key=:firm_key into :KREDIT; --1-1k end IF (TYPEREC=3) THEN begin select coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=:firm_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor=:fk_bd_dogovor ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=:firm_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor=:fk_bd_dogovor ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and ks_1.fk_selful=:fk_selful and prih=1 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=:fk_bd_dogovor),0) as summa from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key and d.field_key=:fk_bd_dogovor and d.fk_recipient=:firm_key where a.GET_KS_post=1 and coalesce(sklad,0)=0 and a.field_key=:firm_key INTO :DEBIT; --3-3d select coalesce((select sum(bd_1.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_1 left join ks_11 on ks_11.fk_bd_1=bd_1.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_1.fk_supplier=:firm_key and bd_1.fk_selful=:fk_selful and bd_1.fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor=:fk_bd_dogovor and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=:firm_key and bd_2.fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5) and bd_2.fk_bd_dogovor=:fk_bd_dogovor ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:firm_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor=:fk_bd_dogovor),0) as summa from bd_firm a left join bd_dogovor d on d.fk_recipient=a.field_key and d.field_key=:fk_bd_dogovor and d.fk_recipient=:firm_key where a.GET_KS_post=1 and coalesce(sklad,0)=0 and a.field_key=:firm_key INTO :kredit; --3-3k end if (debit<0) then kredit2=-debit; if (kredit<0) then debit2=-kredit; if (debit>0) then debit2=debit2+debit; if (kredit>0) then kredit2=kredit2+kredit; selnum=selnum+1; if (summa<>0) then suspend; end END^ SET TERM ; ^учитывать что могли быть оплаты после срока расчета которые уменьшали значение кеш поля summa_dolg18.3.7.1SP_GET_DOLG_UL_KONTR w_ {E'SET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date, DATE_OPER date) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare vaz[^ g5SET TERM ^ ; CREATE OR ALTER procedure SP_GET_DOLG_UL_KONTR ( FK_SELFUL integer, DATE_DOLG date, FK_SKLAD integer) returns ( FIRM_KEY integer, NAME varchar(100), NOMER_PARTNER varchar(100), FK_BD_DOGOVOR integer, SUMMA decimal(15,2), TYPEREC smallint, DEBIT decimal(15,2), KREDIT decimal(15,2), DEBIT2 decimal(15,2), KREDIT2 decimal(15,2), DOCS_VALID integer, DOCS_NOT_VALID integer, SELNUM integer) as declare variable TMP_FK_BD_DOGOVOR integer; declare variable CNT integer; BEGIN selnum=0; for select a.field_key, a.name, '' as nomer_partner, null as fk_bd_dogovor, (coalesce((select sum(bd_1.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_1 left join ks_11 on ks_11.fk_bd_1=bd_1.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_1.fk_supplier=a.field_key and bd_1.fk_selful=:fk_selful and bd_1.fk_selful_from is null and dolgfromdate<=:date_dolg and bd_1.fk_bd_dogovor is null and coalesce(bd_1.cod_prih,0)<>9 ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=a.field_key and bd_2.fk_selful=:fk_selful and dolgfromdate<=:date_dolg and (cod_rash=5 ) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=a.field_key and KS_1.fk_selful=:fk_selful and prih=0 and date_create<=:date_dolg and ks_1.fk_bd_dogovor is null),0))- (coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=a.field_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash not in (5,7)) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(bd_2.summa_dolg)-sum(iif(ks_1.date_create is not null,coalesce(ks_11.summa,0),0)) from bd_2 left join ks_11 on ks_11.fk_bd_2=bd_2.field_key left join ks_1 on ks_1.field_key=ks_11.fk_ks_1 and ks_1.date_create>:date_dolg where bd_2.fk_recipient=a.field_key and bd_2.fk_selful=:fk_selful and bd_2.fk_selful2 is null and dolgfromdate<=:date_dolg and (cod_rash=7) and bd_2.fk_bd_dogovor is null ),0)- coalesce((select sum(summa_dolg) from ks_1 where ks_1.valid_flv{riable DDOG varchar(20); declare variable SUM_OPL1 decimal(15,2); declare variable SUM_OPL2 decimal(15,2); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select -sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=coalesce(:sum_opl1,0); if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; date_oper=null; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))||nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; suspend; END --обороты за период select sum(summa) from sp_get_dolg_ul_kontr(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); if (kredit=0) then kredit=null; date_oper=null; suspend; --считаем итоговое сальдо razn=coalesce(:sum_opl2,0); name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); date_oper=null; -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org||' '||RAZN||' тенге.'; end ELSE txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org_client||' '||RAZN||' тенге.'; id=null; date_oper=null; suspend; END^ SET TERM ; ^перекомпиляция18.3.7.1SP_ACT_SVERKI   q0Xzh #%%CREATE INDEX IDX_BD_TOVAR_FIRM_CASH2 ON BD_TOVAR_FIRM_CASH (FK_BD_FIRM); индекс18.3.14.1CREATE INDEX{g %%%CREATE INDEX IDX_BD_TOVAR_FIRM_CASH1 ON BD_TOVAR_FIRM_CASH (FK_BD_TOVAR);индекс18.3.14.1CREATE INDEXgf I)UCREATE TRIGGER BD_TOVAR_FIRM_CASH_BI FOR BD_TOVAR_FIRM_CASH ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_TOVAR_FIRM_CASH_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_TOVAR_FIRM_CASH_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_TOVAR_FIRM_CASH_ID, new.FIELD_KEY-tmp); END ENDтриггер18.3.14.1CREATE TRIGGER BD_TOVAR_FIRM_CASH_BIlec1?CREATE GENERATOR GEN_BD_TOVAR_FIRM_CASH_ID;генератор18.3.14.1GEN_BD_TOVAR_FIRM_CASH_ID=d %KCREATE TABLE bd_tovar_firm_cash ( field_key integer not null primary key, fk_bd_tovar integer, fk_bd_firm integer, cena_without_nds decimal(12,5), cena_with_nds decimal(12,5) );кеш приходных цен по поставщику18.3.14.1CREATE TABLE bd_tovar_firm_cash}c K)INSERT INTO BD_TOVAR_UPARAM (P_NAME1, P_NAME2, P_NAME3, P_NAME4, P_NAME5, P_NAME6, P_NAME7, P_NAME8, P_NAME9, P_NAME10, FORMULA) VALUES ('Тип товара', 'Название товара', 'Производитель', '4', '5', '6', '7', '8', 'Упаковка', 'Фасовка', NULL)свойства товаров18.3.14.1tovar_propertybos9ALTER TABLE BD_CH2 ADD ts_print_prech Timestamp;время первой печати пречека18.3.14.1ALTER TABLE BD_CH2 ADD aas;ALTER TABLE BD_CH21 ADD ts_del Timestamp;время удаления позиции чека18.3.14.1ALTER TABLE BD_CH21 ADDh` 1q'SET TERM ^ ; ALTER PROCEDURE SP_CURRSKLDOP ( FK_BD_11 Integer ) RETURNS ( NOMER_PRIH Integer, DATE_PRIH Date, POSTAV Varchar(100), COD_POST Integer, pfirmname varchar(100), KOLVO_PRIH Decimal(7,3), CENA_PR Decimal(8,2), SUMMA_PRIH Decimal(10,2), CNT_RASH Integer, KOLVO_PROD Decimal(7,3), LAST_RCENA Decimal(8,2), LAST_DAT_RASH Date, SUMMA_PROD Decimal(10,2) ) AS DECLARE VARIABLE fk_bd_1 integer; BEGIN select bd_1.field_key, bd_1.NOMER_PRIH, bd_1.DATE_PRIH, bd_firm.name, bd_1.COD_PRIH, bd_11.CNT, bd_11.CENA_PR_WITH_NDS, bd_pfirm.name from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key join bd_firm on bd_firm.field_key=bd_1.FK_SUPPLIER left join BD_PFIRM on BD_PFIRM.FIELD_KEY=bd_1.FK_BD_PFIRM where bd_11.field_key=:fk_bd_11 into :fk_bd_1, :nomer_prih, :date_prih, :postav, :cod_post, :kolvo_prih, :cena_pr, :pfirmname; select sum(cena_pr_with_nds*cnt) from bd_11 where fk_bd_1=:fk_bd_1 into :summa_prih; select count(*), coalesce(sum(cnt),0), count(*)*coalesce(sum(cnt),0) from BD_21 where fk_bd_11=:fk_bd_11 into :cnt_rash, :kolvo_prod, :summa_prod; select first 1 coalesce(cena_with_nds,0), bd_2.date_rash from BD_21 join bd_2 on bd_2.field_key=bd_21.fk_bd_2 where fk_bd_11=:fk_bd_11 order by bd_2.DATE_RASH desc, bd_2.NOMER_RASH desc into :last_rcena, :last_dat_rash; suspend; END^ SET TERM ; ^добавлен филиал поставщика18.3.14.1SP_CURRSKLDOP  F!l ;M3update BD_DISC_CARD set field_key=gen_id(GEN_BD_DISC_CARD_ID,1) where field_key is null проставляем field_key18.3.14.1update bd_disc_cardbk aGALTER TRIGGER BD_DISC_CARD_BI ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.field_key IS NULL) THEN NEW.field_key = gen_id(GEN_BD_DISC_CARD_ID,1);--cast(substring(new.IDCARD from 3 for 9) as decimal(12)); END триггер для fk диск карт18.3.14.1ALTER TRIGGER BD_DISC_CARD_BI>j '}QSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_CENA_PR ( ID_SUPPLIER Integer, ID_SKLAD Integer, ID_TOVAR Integer, ID_DOGOVOR Integer DEFAULT null, WITH_STOCK Integer DEFAULT 1, ONLY_BY_SPS Integer DEFAULT 0 ) RETURNS ( CENA_PR_WITH_NDS Decimal(12,5), CENA_PR_WITHOUT_NDS Decimal(12,5), SELF_STOCK Decimal(7,3), STOCK Decimal(7,3), PRIM Varchar(500), NDS_TOVAR Integer, INPLACE Decimal(7,3) ) AS declare variable SKLAD type of column BD_FIRM.SKLAD; begin select coalesce(sklad,0) from bd_firm where field_key=:id_supplier into :sklad; cena_pr_with_nds=0; cena_pr_without_nds=0; --поиск по спецификациям по договору, группе склада и поставщику if (id_dogovor is not null) then begin select first 1 cena_pr, cena_pr_without_nds, 'Спецификация №'||bd_sps1.nomer_create from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 where (bd_sps11.fk_bd_tovar=:id_tovar) and ((bd_sps1.fk_bd_dogovor=:id_dogovor)or(bd_sps1.fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1~i mGQALTER TRIGGER TR_BD_11_SETCASHCENA ACTIVE AFTER INSERT OR UPDATE POSITION 200 AS declare variable issklad integer; BEGIN select first 1 sklad from bd_firm where field_key=new.fk_supplier into :issklad; if (coalesce(old.CENA_PR_WITH_NDS,0)<>coalesce(new.CENA_PR_WITH_NDS,0) and (:issklad<>1)) THEN update bd_tovar set BD_TOVAR.LAST_CENA_PR=coalesce(new.CENA_PR_WITH_NDS,0) where field_key=new.fk_bd_tovar and coalesce(BD_TOVAR.LAST_CENA_PR,0)<>coalesce(new.CENA_PR_WITH_NDS,0); if (coalesce(old.CENA_PR_WITH_NDS,0)<>coalesce(new.CENA_PR_WITH_NDS,0) or coalesce(old.CENA_PR_WITHOUT_NDS,0)<>coalesce(new.CENA_PR_WITHOUT_NDS,0)) THEN update or insert into BD_TOVAR_FIRM_CASH (fk_bd_tovar, fk_bd_firm, cena_with_nds, cena_without_nds) values (new.FK_BD_TOVAR,new.fk_supplier, coalesce(new.CENA_PR_WITH_NDS,0), coalesce(new.CENA_PR_WITHOUT_NDS,0)) matching (fk_bd_tovar, fk_bd_firm); END сохранение кеша18.3.14.1ALTER TRIGGER TR_BD_11_SETCASHCENA) and (bd_sps1.FK_SUPPLIER=:id_supplier) into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end --не нашли по договору - ищем без него if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 cena_pr, cena_pr_without_nds, 'Спецификация №'||bd_sps1.nomer_create from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 where ((bd_sps11.fk_bd_tovar=:id_tovar) and (bd_sps1.fk_supplier=:id_supplier) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_sklad)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1)) into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end if (only_by_sps=0) then --если разрешено искать по последним приходам begin --не нашли по спецификации - ищем по последнему приходу и поставщику if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 bd_11.cena_pr_with_nds,bd_11.cena_pr_without_nds, 'Приход (посл. по складу и поставщику)' from bd_11 where (bd_11.fk_bd_firm=:id_SKLAD and bd_11.fk_bd_tovar=:id_tovar and bd_11.FK_SUPPLIER=:id_supplier) order by bd_11.date_prih desc, bd_11.field_key desc into :cena_pr_with_nds,:cena_pr_without_nds, :prim; end --не нашли по последнему приходу по складу, ищем по всем складам и поставщику if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 bd_11.cena_pr_with_nds,bd_11.cena_pr_without_nds, 'Приход (посл. по всем складам и поставщику)' from bd_11 where (bd_11.fk_bd_tovar=:id_tovar and bd_11.FK_SUPPLIER=:id_supplier) order by bd_11.date_prih desc, bd_11.field_key desc into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 bd_11.cena_pr_with_nds,bd_11.cena_pr_without_nds, 'Приход (посл. по складу)' from bd_11 where (bd_11.fk_bd_firm=:id_SKLAD and bd_11.fk_bd_tovar=:id_tovar) order by bd_11.date_prih desc, bd_11.field_key desc into :cena_pr_with_nds,:cena_pr_without_nds, :prim; end --не нашли по последнему приходу по складу, ищем по всем складам if (coalesce(cena_pr_with_nds,0)=0) then begin select first 1 bd_11.cena_pr_with_nds,bd_11.cena_pr_without_nds, 'Приход (посл. по всем складам)' from bd_11 where (bd_11.fk_bd_tovar=:id_tovar) order by bd_11.date_prih desc, bd_11.field_key desc into :cena_pr_with_nds, :cena_pr_without_nds, :prim; end end --поиск текущих остатков - по поставвщику и на своем складе if (with_stock=1) then begin self_stock=0; stock=0; select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 join bd_1 on (bd_1.field_key=bd_11.fk_bd_1) where (bd_1.valid_flag=1) and (bd_1.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:id_tovar) and (bd_11.stock>0) into self_stock; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 join bd_1 on (bd_1.field_key=bd_11.fk_bd_1) where (bd_1.valid_flag=1) and (bd_1.fk_bd_firm=:id_supplier) and (bd_11.fk_bd_tovar=:id_tovar) and (bd_11.stock>0) into :stock; end select nds, inplace from BD_TOVAR where field_key=:id_tovar into :nds_tovar, :inplace; suspend; end ^ SET TERM ; ^ послед прих цена по поставщику18.3.14.1ALTER PROCEDURE SP_GET_TOV_CENA_PR'; connect_string = db_server||':'||db_name; /* SELECT BD_AUDIT_FIELDS.field_key, fieldnametxt, oldvalue, newvalue, date_edit, login, BD_AUDIT_1.OPERATION FROM BD_AUDIT_FIELDS join BD_AUDIT_1 on bd_audit_1.FIELD_KEY=BD_AUDIT_FIELDS.FK_BD_AUDIT where BD_AUDIT_FIELDS.tablename=:tablename and fieldnametxt is not null --?-- and BD_AUDIT_1.FK_TABLE=:fk_obj || BD_AUDIT_1.FK_TABLE in (select field_key from bd_scan where fk_bd_tovar=:fk_obj) and date_edit between :date_start and :date_end order by date_edit desc, login*/ select_sql = ' SELECT BD_AUDIT_FIELDS.field_key, bd_audit_1.fk_table, fieldnametxt, oldvalue, newvalue, date_edit, login, BD_AUDIT_1.OPERATION, 2 as dbtype FROM BD_AUDIT_FIELDS join BD_AUDIT_1 on bd_audit_1.FIELD_KEY=BD_AUDIT_FIELDS.FK_BD_AUDIT where BD_AUDIT_FIELDS.tablename=:tablename and fieldnametxt is not null and bd_audit_1.fk_table=:fk_obj and date_edit between :date_start and :date_end+1 order by date_edit desc, login '; if (date_start<=:date_end_for_pack) then begin date_start_copydb=:date_start; date_start=:date_end_for_pack+1; end if (date_end<=:date_end_for_pack) then date_end_copydb=:date_end; else date_end_copydb=:date_end_for_pack; if (date_end>=date_start) then begin /* отбор из рабочей базы */ FOR SELECT BD_AUDIT_FIELDS.field_key, bd_audit_1.fk_table, fieldnametxt, oldvalue, newvalue, date_edit, login, BD_AUDIT_1.OPERATION, 1 as dbtype, BD_AUDIT_1.COMM FROM BD_AUDIT_FIELDS join BD_AUDIT_1 on bd_audit_1.FIELD_KEY=BD_AUDIT_FIELDS.FK_BD_AUDIT where BD_AUDIT_FIELDS.tablename=:tablename and fieldnametxt is not null and bd_audit_1.fk_table=:fk_obj and date_edit between :date_start and :date_end+1 order by date_edit desc, login into :field_key, :fk_table, :fieldnametxt, :oldvalue, :newvalue, :date_edit, :login, :operation, :dbtype, :comm do suspend; end if ((date_start_copydb is not null)and(date_end_copydb>=date_start_copydb)) then begin /* отбор из архивной базы */ if (pass is not null) then begin FOR EXECUTE STATEMENT (:select_sql) (tablename:=:tablename, fk_obj:=:fk_obj, date_start:=:date_start_copydb, date_end:=:date_end_copydb) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :field_key, :fk_table, :fieldnametxt, :oldvalue, :newvalue, :date_edit, :login, :operation, :dbtype do suspend; end end end else begin if (date_end>=date_start) then begin /* отбор из рабочей базы */ FOR SELECT BD_AUDIT_FIELDS.field_key, bd_audit_1.fk_table, fieldnametxt, oldvalue, newvalue, date_edit, login, BD_AUDIT_1.OPERATION, 1 as dbtype, BD_AUDIT_1.COMM FROM BD_AUDIT_FIELDS join BD_AUDIT_1 on bd_audit_1.FIELD_KEY=BD_AUDIT_FIELDS.FK_BD_AUDIT where BD_AUDIT_FIELDS.tablename=:tablename and fieldnametxt is not null and bd_audit_1.fk_table=:fk_obj and date_edit between :date_start and :date_end+1 order by date_edit desc, login into :field_key, :fk_table,:fieldnametxt, :oldvalue, :newvalue, :date_edit, :login, :operation, :dbtype, :comm do suspend; end end when any do begin suspend; end end^ SET TERM ; ^вывод примечания18.3.14.1ALTER PROCEDURE SP_AUDIT_OBJ_DATA  O :q A'1update bd_egais_doc_types set eng_name_old='WayBillAct_v2' where eng_name_old='WayBillAct'WayBillAct_v218.3.15.1bd_egais_doc_typesp 5!1update bd_egais_doc_types set eng_name_old='WayBill_v2' where eng_name_old='WayBill'WayBill_v218.3.15.1bd_egais_doc_types o 7'1update bd_egais_doc_types set eng_name='WayBillAct_v3' where eng_name='WayBillAct_v2'WayBillAct_v318.3.15.1bd_egais_doc_typesn +!1update bd_egais_doc_types set eng_name='WayBill_v3' where eng_name='WayBill_v2'WayBill_v318.3.15.1bd_egais_doc_types%m )KOSET TERM ^ ; ALTER PROCEDURE SP_AUDIT_OBJ_DATA ( DATE_START Date, DATE_END Date, TABLENAME Varchar(31), FK_OBJ Integer, USERNAME Char(31), PASS Char(31) ) RETURNS ( FIELD_KEY Integer, OPERATION Char(1), LOGIN Char(31), DATE_EDIT Timestamp, DBTYPE Integer, FIELDNAMETXT Varchar(62), OLDVALUE Varchar(250), NEWVALUE Varchar(250), FK_TABLE Integer, comm varchar(250) ) AS declare variable DATE_END_FOR_PACK date; declare variable DATE_START_COPYDB date; declare variable DATE_END_COPYDB date; declare variable SELECT_SQL varchar(1000); declare variable CONNECT_STRING varchar(501); declare variable DB_SERVER varchar(250); declare variable DB_NAME varchar(250); begin if (exists(select paramname from global_options where upper(paramname)='DATE_PACK_AUDIT')) then begin date_end_for_pack=cast((select paramvalue from global_options where upper(paramname)='DATE_PACK_AUDIT') as date); date_start_copydb=null; date_end_copydb=null; if (username is null) then username=current_user; select paramvalue from global_options where upper(paramname)='SERVER_AUDIT_REZERV' into :db_server; if (db_server is null) then db_server='192.168.0.6'; select paramvalue from global_options where upper(paramname)='DBNAME_AUDIT_REZERV' into :db_name; if (db_name is null) then db_name='/home/mercury_audit_arh/mercury_audit.fdb 44uk1iCREATE GENERATOR GEN_BD_GRT_TOVAR_PRICE_DEF_ID;генератор18.3.28.1CREATE GENERATOR GEN_BD_GRT_TOVAR_PRICE_DEF_IDxt IMSCREATE TABLE bd_grt_tovar_price_def ( field_key integer not null primary key, fk_bd_grt_tovar integer, fk_bd_cena integer, cena DEC82 );цены по умолчанию18.3.28.1CREATE TABLE bd_grt_tovar_price_defFs ?AINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('after_space_del_scan', '0', 'При поиске по ШК отбрасывать часть после пробела');При поиске по ШК отбрасывать часть после пробела18.3.26.1INSERT INTO GLOBAL_OPTIONSyr OISSET TERM ^ ; ALTER PROCEDURE SP_GET_SHET_OSTATOK ( FK_SHET_IN Integer, TODATE Date, FK_VAL Integer DEFAULT null ) RETURNS ( FK_SHET Integer, NAME_SHET Varchar(100), SUM_PRIH Decimal(15,2), SUM_RASH Decimal(15,2), SUM_PRIH_SELF Decimal(15,2), SUM_RASH_SELF Decimal(15,2), OSTATOK Decimal(15,2), SHET_NAME Varchar(100), UL_NAME Char(100), FK_BD_VALUTA Integer, VALUTA Varchar(20) ) AS declare variable ID_USER integer; declare variable has_dvig integer; BEGIN select first 1 field_key from BD_USERS where upper(login)=upper(current_user) into :id_user; todate=coalesce(todate,CURRENT_DATE); for select KS_SCHET.FIELD_KEY, KS_SCHET.name||' '||coalesce(bd_selful.OW_NAME,0), KS_SCHET.name,coalesce(bd_selful.OW_NAME,0) from KS_SCHET join BD_USERS_RIGHTS on BD_USERS_RIGHTS.FK_RIGHTS=KS_SCHET.FIELD_KEY left join bd_selful on bd_selful.field_key=ks_schet.FK_SELFUL where (KS_SCHET.field_key=:fk_shet_in or :fk_shet_in is null) and (coalesce(ks_schet.is_arh_flag,0)=0) and BD_USERS_RIGHTS.TYPEOFRIGHTS='C' and BD_USERS_RIGHTS.FK_BD_USERSORGRT=:id_user into :fk_shet, :name_shet, :shet_name, :ul_name do BEGIN --находим все поступления на счет и списания со счета has_dvig=0; for select cast(-1 as integer), cast(null as varchar(20)) from RDB$DATABASE where (:fk_val is null or :fk_val=-1) and exists(select field_key from ks_1 where fk_bd_valuta is null and (fk_ks_schet=:fk_shet or fk_ks_shet2=:fk_shet) and ks_1.VALID_FLAG=1) union select v.field_key, v.name from BD_VALUTA v where (:fk_val is null or :fk_val=v.field_key) and exists(select field_key from ks_1 where coalesce(fk_bd_valuta_main,fk_bd_valuta)=v.field_key and (fk_ks_schet=:fk_shet or fk_ks_shet2=:fk_shet) and ks_1.VALID_FLAG=1) and (coalesce(:fk_val,-2)<>-1) into :fk_bd_valuta, :valuta do begin select coalesce(sum(case when (prih=1) then coalesce(summa_main,summa) else 0 end),0), coalesce(sum(case when (prih=0) then coalesce(summa_main,summa) else 0 end),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih in (1,0) and ks_1.VALID_FLAG=1 and coalesce(coalesce(ks_1.fk_bd_valuta_main,ks_1.fk_bd_valuta),-1)=coalesce(:fk_bd_valuta,-1) into :sum_prih, :sum_rash; select coalesce(sum(coalesce(summa_main,summa)),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_schet=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and coalesce(coalesce(ks_1.fk_bd_valuta_main,ks_1.fk_bd_valuta),-1)=coalesce(:fk_bd_valuta,-1) into :sum_rash_self; select coalesce(sum(coalesce(summa_main,summa)),0) from ks_1 where ks_1.DATE_CREATE<=:todate and fk_ks_shet2=:fk_shet and prih=2 and ks_1.VALID_FLAG=1 and coalesce(coalesce(ks_1.fk_bd_valuta_main,ks_1.fk_bd_valuta),-1)=coalesce(:fk_bd_valuta,-1) into :sum_prih_self; ostatok=sum_prih+sum_prih_self-sum_rash-sum_rash_self; has_dvig=1; suspend; end if (has_dvig=0) then begin ostatok=0; select field_key, name from BD_VALUTA where main_flag=1 into :fk_bd_valuta, :valuta; suspend; end END END^ SET TERM ; ^остаток по счету18.3.19.1ALTER PROCEDURE SP_GET_SHET_OSTATOK , %,y y=GCREATE TRIGGER TR_bd_tovar_AI FOR BD_TOVAR ACTIVE AFTER INSERT POSITION 0 AS declare variable fk_bd_cena integer; declare variable cena DEC82; declare variable fk_user integer; BEGIN fk_user=(select field_key from bd_users where upper(login)=upper(current_user)); for select fk_bd_cena, cena from BD_GRT_TOVAR_PRICE_DEF a where a.FK_BD_GRT_TOVAR=new.FK_GRT and coalesce(cena,0)>0 into :fk_bd_cena, :cena do begin insert into bd_cpr (fk_bd_tovar, fk_bd_cena, cena, last_date, last_time, operator, workplace, start_date, cena_pr, end_date, start_time, fk_bd_operation) values (new.FIELD_KEY, :fk_bd_cena, :CENA, current_date, current_time, :fk_user, 'cena_g',current_date,0,null, current_time, 0); end ENDавтоназначение цены при вставке товара в группу18.3.28.1CREATE TRIGGER TR_bd_tovar_AInx MINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Изменение цены по умолчанию на категорию товара', 'ctv_price_def', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='price'));права на назначение цен на группу18.3.28.1INSERT INTO BD_USERS_RIGHTS_NAMETw ?_create TRIGGER TR_GRT_TOVAR_PRICE_DEF_BIU for BD_GRT_TOVAR_PRICE_DEF ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS declare variable fk_tovar integer; declare variable fk_user integer; declare variable last_pr DEC82; declare variable cur_cena DEC82; BEGIN if (coalesce(new.cena,0)<=0) then exit; fk_user=(select field_key from bd_users where upper(login)=upper(current_user)); --для всех товаров группы for select a.field_key, a.LAST_CENA_PR from BD_TOVAR a where a.FK_GRT=new.fk_bd_grt_tovar into :fk_tovar, :last_pr do begin --устанавливаем цену cur_cena=coalesce((select a.cena from BD_CPR_NOW a where fk_bd_tovar=:fk_tovar and fk_bd_cena=new.fk_bd_cena),0); if (cur_cena is distinct from new.CENA) then insert into bd_cpr (fk_bd_tovar, fk_bd_cena, cena, last_date, last_time, operator, workplace, start_date, cena_pr, end_date, start_time, fk_bd_operation) values (:fk_tovar, new.fk_bd_cena, new.CENA, current_date, current_time, :fk_user, 'cena_g',current_date,:last_pr,null, current_time, 0); end ENDназначение цен на товары группы18.3.28.1create TRIGGER TR_GRT_TOVAR_PRICE_DEF_BIUv q)]CREATE TRIGGER BD_GRT_TOVAR_PRICE_DEF_BI FOR BD_GRT_TOVAR_PRICE_DEF ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE tmp DECIMAL(18,0); BEGIN IF (NEW.FIELD_KEY IS NULL) THEN NEW.FIELD_KEY = GEN_ID(GEN_BD_GRT_TOVAR_PRICE_DEF_ID, 1); ELSE BEGIN tmp = GEN_ID(GEN_BD_GRT_TOVAR_PRICE_DEF_ID, 0); if (tmp < new.FIELD_KEY) then tmp = GEN_ID(GEN_BD_GRT_TOVAR_PRICE_DEF_ID, new.FIELD_KEY-tmp); END ENDтриггер18.3.28.1CREATE TRIGGER BD_GRT_TOVAR_PRICE_DEF_BI  >{ 9{AINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('OrderoutPartRashIsNoRash', '0', 'Заявки покупателя: недоотгруженные считать неотгруженными');частичная отгрузка для заявок18.3.29.1INSERT INTO GLOBAL_OPTIONS|z EeEalter TRIGGER TR_bd_tovar_AI ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS declare variable fk_bd_cena integer; declare variable cena DEC82; declare variable cur_cena DEC82; declare variable fk_user integer; BEGIN if ((inserting)or((updating) and (old.fk_grt is distinct from new.fk_grt))) then begin fk_user=(select field_key from bd_users where upper(login)=upper(current_user)); for select fk_bd_cena, cena from BD_GRT_TOVAR_PRICE_DEF a where a.FK_BD_GRT_TOVAR=new.FK_GRT and coalesce(cena,0)>0 into :fk_bd_cena, :cena do begin if (updating) then cur_cena=coalesce((select a.cena from BD_CPR_NOW a where fk_bd_tovar=new.FIELD_KEY and fk_bd_cena=:fk_bd_cena),0); else cur_cena=0; if (cur_cena is distinct from :CENA) then insert into bd_cpr (fk_bd_tovar, fk_bd_cena, cena, last_date, last_time, operator, workplace, start_date, cena_pr, end_date, start_time, fk_bd_operation) values (new.FIELD_KEY, :fk_bd_cena, :CENA, current_date, current_time, :fk_user, 'cena_g',current_date,0,null, current_time, 0); end end END+Автоназначение цен при перемещении товара в другую группу18.3.29.1alter TRIGGER TR_bd_tovar_AIble CNT_RESERV_REC decimal(8,3); declare variable FK_REC integer; declare variable FK_RES integer; declare variable CNT_RESERV_CANCEL decimal(8,3); declare variable CNT_RES decimal(8,3); declare variable CNT_RESERV_PR decimal(8,3); declare variable fk_bd_order_out_11 integer; BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22, bd_22.FK_BD_ORDER_OUT_11 from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22, :fk_bd_order_out_11 do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11; cnt_11_stock=cnt_11_stock-cnt_reserv_11; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем резервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end if (cnt_21<>0) then insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod,fk_bd_order_out_11) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod,:fk_bd_order_out_11); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)or(checkstock7=1)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cntcurrent_timestamp)) and (bd_cpr.fk_bd_tovar=:id) and (bd_cpr.fk_bd_cena=:fkcena) and (bd_cpr.start_date<=current_date)) order by 1 desc, 2 desc into :v1, :fkcpr, :cenan; suspend; end end^ SET TERM ; ^увеличена длина для названия цены18.4.8.1ALTER PROCEDURE GETCURCENAd_2.IN_PRIH_CENA,0),coalesce(bd_2.in_bd115_cena,0), bd_2.date_rash from bd_2 where field_key=:fk_bd_2 into :in_prih_cena, :in_115_cena, :date_rash; select first 1 bd_cena.FIELD_KEY, bd_cena.name, bd_firm.field_key from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY join bd_2 on bd_2.FK_BD_FIRM=BD_Firm.FIELD_KEY where bd_2.FIELD_KEy=:FK_BD_2 into :fk_cena, :name_cena, :fk_firm; if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd_2)) then begin update bd_21 set fk_bd_22=null where fk_bd_2=:fk_bd_2 and fk_bd_22 is not null; delete from bd_22 where fk_bd_2=:fk_bd_2; end for select bd_21.field_key, bd_21.fk_bd_tovar, bd_21.fk_bd_tovar_mod , (case when (coalesce(:with_fk_11,0)=0) then null else bd_21.fk_bd_11 end), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_with_nds,bd_11.CENA_PR_WITH_NDS)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_without_nds, bd_11.CENA_PR_WITHOUT_NDS)), bd_21.cnt, -- sum(bd_21.cnt), coalesce(bd_11.nds,bd_tovar.nds,0) , bd_21.FK_BD_ORDER_OUT_11, iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds*bd_21.cnt, iif(((:in_prih_cena=1)and(bd_21.CNT=bd_11.CNT)),bd_11.SUMMA_WITH_NDS,bd_21.SUMMA)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), 0, iif((:in_prih_cena=1) and (bd_21.cena_with_nds<>bd_11.CENA_PR_WITH_NDS), 0, bd_21.SUM_INPUT_MAN_FLAG)), bd_21.CNT_IN_INPLACE -- max(bd_11.NDS) from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 left join bd_115 on bd_115.fk_bd_11=bd_11.field_key left join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar where bd_21.fk_bd_2=:fk_bd_2 -- group by 1,2,3,4,5,6 into :fk_21, :fk_tovar, :fk_mod, :fk_11, :cena_with_nds, :cena_without_nds,:cnt, :nds,:FK_BD_ORDER_OUT_11, :summa_21, :summa_man, :cnt_in_inplace do begin if (in_prih_cena=0) then begin cena_otl=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rash between coalesce(o1.begin_date,:date_rash) and coalesce(o1.end_date,:date_rash) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:fk_firm))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_tovar and ocpr.fk_bd_cena=:fk_cena into :cena_otl; if ((:in_115_cena=1)and(:cena_otl is not null)) then begin cena_with_nds=:cena_otl; cena_without_nds=:cena_with_nds/(100.00+:NDS)*100.00; summa_21=:cena_with_nds*:cnt; end end cnt=abs(cnt); fk_22=gen_id(GEN_BD_22_ID,1); if (coalesce(with_fk_11,0)=0) then fk_11=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, FK_BD_ORDER_OUT_11, NDS, FK_BD_11, CNT, summa, SUM_INPUT_MAN_FLAG, cnt_in_inplace) VALUES (:fk_22,:FK_BD_2,:FK_TOVAR,:FK_MOD,:cena_with_nds,:cena_without_nds,:FK_BD_ORDER_OUT_11,:NDS,:FK_11,:cnt, :summa_21, :summa_man, :cnt_in_inplace); update bd_21 set fk_bd_22=:fk_22, cena_without_nds=:cena_without_nds, cena_with_nds=:cena_with_nds, SUM_INPUT_MAN_FLAG=:summa_man where field_key=:fk_21; end update bd_2 set bd_2.name_ifs=(case when (cod_rash in (4,5,6,9)) then 'В прих.ценах' else 'По цене '||:name_cena end), bd_2.FK_CENA_RASH=(case when (cod_rash in (4,5,6,9)) then null else :fk_cena end), bd_2.IN_PRIH_CENA=(case when (cod_rash in (4,5,6,9)) then 1 else 0 end) where field_key=:fk_bd_2 and name_ifs is null; update bd_2 set valid_flag=1 where field_key=:fk_bd_2; END ^ SET TERM ; ^увеличена длина для названия цены18.4.8.1ALTER PROCEDURE SP_22_BY_21 end if (fk_bd_2new is not null) then execute procedure sp_create_ks1byrash(:fk_bd_2new,:fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: оплата создана, удаляем пустые расходы',cast('now' as timestamp)); if (fk_bd_2new is not null) then delete from bd_2 where field_key=:fk_bd_2new and not exists(select field_key from bd_21 where fk_bd_2=:fk_bd_2new); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: пустые расходы удалены',cast('now' as timestamp)); --создаем новый расход fk_bd_2new=gen_id(GEN_BD_2_ID,1); insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), :date_close, :date_close, 2, iif((:is_vozvrat=0),0,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; end --создаем строки в BD_22 for select fk_bd_tovar, fk_bd_tovar_mod, --case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cena*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else cena end, /*trim(scancod) scan,*/ sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)), bd_ch21.AKC_FLAG, bd_ch21.SP_AKC_FLAG from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa) --and(coalesce(case when (summa<0) then 1 else 0 end,0)=:is_vozvrat) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, fk_bd_tovar_mod, /*cena, */ BD_TOVAR.EMKTOV, bd_ch21.AKC_FLAG, bd_ch21.SP_AKC_FLAG having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) and (sum(cnt)<>0) order by 2 desc into :fk_tovar, :fk_tovar_mod, /*:cena,*/ /*:scan, */:cnt_ch22, :sumpos_ch22, :akc_flag, :sp_akc_flag do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER, akc_flag, sp_akc_flag) values (:fk_bd_2new,:nabor_fk_tovar, null, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar, :akc_flag, :sp_akc_flag); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG, AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :fk_tovar_mod, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1, :AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход сформирован, запуск проведения',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure SP_BD2_PROV(:fk_bd_2new,:lang,:allowizl, :fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход проведен, проставляем флаги на позициях чека',cast('now' as timestamp)); if (fk_bd_2new is not null) then begin if (allowizl=0) then execute procedure sp_set_accept_ch21(:fk_bd_2new,:old_fk_kassa,:old_is_vozvrat,:olddate); end insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: флаги проставлены, создаем оплату',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure sp_create_ks1byrash(:fk_bd_2new,:fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: оплата создана, удаляем пустые расходы',cast('now' as timestamp)); if (fk_bd_2new is not null) then delete from bd_2 where field_key=:fk_bd_2new and not exists(select field_key from bd_21 where fk_bd_2=:fk_bd_2new); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: пустые расходы удалены',cast('now' as timestamp)); end --закончили перебор касс if (allowizl=1) then --если излишки были разрешены, то проставляем как переведенные в расход все позиции чеков без проверки begin for select main.field_key from bd_ch2 main where coalesce(accept_flag,0)=0 and fk_bd_firm=:FK_FIRM and exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0) and (date_close<=:withtoday) into :fk_ch2 do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2 and coalesce(accept_flag,0)=0; end end update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_firm=:FK_FIRM and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: флаг на заголовке чека',cast('now' as timestamp)); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: завершено',cast('now' as timestamp)); END^ SET TERM ; ^увеличена длина для названия цены18.4.8.1ALTER PROCEDURE SP_CH_TO_RASH_22  ' MSET TERM ^ ; ALTER PROCEDURE SP_CH_TO_RASH_22 ( FK_FIRM Integer, WITHTODAY Date, ALLOWIZL Integer, LANG Varchar(2) ) AS declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA type of column bd_cena.NAME; declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable sumpos_ch22 decimal(3,2); declare variable i integer; declare variable fk_ch2 integer; declare variable akc_flag integer; declare variable sp_akc_flag integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0) from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) group by 1,2 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0) into :date_close, :is_vozvrat do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)) then begin --проводим предыдущий расход insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход сформирован, запуск проведения',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure SP_BD2_PROV(:fk_bd_2new,:lang,:allowizl, :fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход проведен, проставляем флаги на позициях чека',cast('now' as timestamp)); if (fk_bd_2new is not null) then begin if (ALLOWIZL=0) then execute procedure sp_set_accept_ch21(:fk_bd_2new,:old_fk_kassa,:old_is_vozvrat,:olddate); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: флаги проставлены, создаем оплату',cast('now' as timestamp)); d,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2, coalesce(fk_bd_firm_kredit,2), sum(bd_ch2.SUMMA-coalesce(bd_ch2.SUMMA_KREDIT,0)) from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa_all,0)<>0)/*or(coalesce(summa_disc,0)=coalesce(summa_all,0))*/) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5,6 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch, :fk_rec, :summa_opl do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)or(old_fk_rec<>fk_rec)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, :fk_rec, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); --создание оплаты if ((SUMMA_OPL>0)and(fk_rec<>2)) then begin INSERT INTO KS_1 (FK_KS_KODI, FK_KS_SCHET, DATE_CREATE, TIME_CREATE, OPER_CREATE, SUMMA, COMM, FK_BD_FIRM, PRIH, VALID_FLAG, OPL_FLAG, NOMER_CREATE,fk_sklad) VALUES ( 2, coalesce((select bd_firm.FK_KS_SHET from bd_firm where field_key=:fk_firm),(select first 1 field_key from KS_SCHET order by field_key)), :date_close, current_time, :fk_user, :SUMMA_OPL, null, :FK_REC, 1, 1, 0, (select coalesce(max(NOMER_CREATE)+1,1) from ks_1), :fk_firm ) returning (field_key) into :fk_ks_1; INSERT INTO KS_11 (FK_KS_1, FK_BD_2, SUMMA) VALUES (:FK_KS_1, :fk_bd_2new, :SUMMA_OPL); end --------- end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; old_fk_rec=:fk_rec; end --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0)and(coalesce(bd_ch2.fk_bd_firm_kredit,2)=:fk_rec) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе end --закончили перебор касс END ^ SET TERM ; ^увеличена длина для названия цены18.4.8.1ALTER PROCEDURE SP_CH_TO_RASH_22_OP ZZ G SSET TERM ^ ; ALTER PROCEDURE SP_CH_TO_RASH_22_OP ( FK_FIRM Integer, WITHTODAY Date, ALLOWIZL Integer, LANG Varchar(2), ID_OPERATION Integer ) AS declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA type of column bd_cena.NAME; declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; declare variable FK_CH2_TMP integer; declare variable FK_REC integer; declare variable OLD_FK_REC integer; declare variable summa_opl decimal(15,2); declare variable FK_KS_1 integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; old_fk_rec=2; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; -- отменненые позиции ставим обработанными for select field_key from bd_ch2 where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and (date_close<=:withtoday) and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0) into :fk_ch2_tmp do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0; if (not exists(select field_key from bd_ch21 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.accept_flag,0)=0)) then update bd_ch2 set accept_flag=1 where field_key=:fk_ch2_tmp; end for select date_close, coalesce(case when (summa<0) then 1 else 0 enthen begin --проводим предыдущий расход insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход сформирован, запуск проведения',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure SP_BD2_PROV(:fk_bd_2new,:lang,:allowizl, :fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход проведен, проставляем флаги на позициях чека',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure sp_set_accept_ch21(:fk_bd_2new,:old_fk_kassa,:old_is_vozvrat,:olddate); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: флаги проставлены, создаем оплату',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure sp_create_ks1byrash(:fk_bd_2new,:fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: оплата создана, удаляем пустые расходы',cast('now' as timestamp)); if (fk_bd_2new is not null) then delete from bd_2 where field_key=:fk_bd_2new and not exists(select field_key from bd_21 where fk_bd_2=:fk_bd_2new); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: пустые расходы удалены',cast('now' as timestamp)); --создаем новый расход fk_bd_2new=gen_id(GEN_BD_2_ID,1); insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), :date_close, :date_close, 2, iif((:is_vozvrat=0),0,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; end --создаем строки в BD_22 for select fk_bd_tovar, fk_bd_tovar_mod, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cena*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else cena end, /*trim(scancod) scan,*/ sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(case when (summa<0) then 1 else 0 end,0)=:is_vozvrat) and(coalesce(bd_ch21.accept_flag,0)<>1) group by fk_bd_tovar, fk_bd_tovar_mod, cena, BD_TOVAR.EMKTOV order by 2 desc into :fk_tovar, :fk_tovar_mod, :cena, /*:scan, */:cnt_ch22 do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER) values (:fk_bd_2new,:nabor_fk_tovar, null, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,fk_bd_tovar_mod,cnt,cena_with_nds, nds) values (:fk_bd_2new,:fk_tovar, :fk_tovar_mod, :cnt_bd22, :cena,:nds); end -- этот товар был не набор end end --закончили создание строки end --закончили перебор чеков по кассе insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход сформирован, запуск проведения',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure SP_BD2_PROV(:fk_bd_2new,:lang,:allowizl, :fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: расход проведен, проставляем флаги на позициях чека',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure sp_set_accept_ch21(:fk_bd_2new,:old_fk_kassa,:old_is_vozvrat,:olddate); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: флаги проставлены, создаем оплату',cast('now' as timestamp)); if (fk_bd_2new is not null) then execute procedure sp_create_ks1byrash(:fk_bd_2new,:fk_user); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: оплата создана, удаляем пустые расходы',cast('now' as timestamp)); if (fk_bd_2new is not null) then delete from bd_2 where field_key=:fk_bd_2new and not exists(select field_key from bd_21 where fk_bd_2=:fk_bd_2new); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: пустые расходы удалены',cast('now' as timestamp)); end --закончили перебор касс insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: флаг на заголовке чека',cast('now' as timestamp)); update bd_ch2 main set accept_flag=1 where coalesce(accept_flag,0)=0 and fk_bd_firm=:FK_FIRM and not exists(select field_key from bd_ch21 where fk_bd_ch2=main.field_key and coalesce(accept_flag,0)=0); insert into BD_TIME_CHECKING(fk_bd_firm,name,ts_create) values (:fk_firm,'чеки в расход: завершено',cast('now' as timestamp)); END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_CH_TO_RASH_22_RESERV TO DAMIR; GRANT EXECUTE ON PROCEDURE SP_CH_TO_RASH_22_RESERV TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_CH_TO_RASH_22_RESERV TO SYSDBA;увеличена длина для названия цены18.4.8.1ALTER PROCEDURE SP_CH_TO_RASH_22_RESERV _ Q [SET TERM ^ ; ALTER PROCEDURE SP_CH_TO_RASH_22_RESERV ( FK_FIRM Integer, WITHTODAY Date, ALLOWIZL Integer, LANG Varchar(2) ) AS declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA type of column bd_cena.NAME; declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable i integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm into :fk_kassa, :kassaname do begin for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0) from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close<=:withtoday) group by 1,2 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0) into :date_close, :is_vozvrat do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa))  vv 5 GSET TERM ^ ; ALTER PROCEDURE SP_GET_RPRICE ( FK_BD_CENA_BASIC Integer, ID_PRIHOD Integer ) RETURNS ( ID_11 Integer, RC1 Float, RC2 Float, RC3 Float, RC4 Float, RC5 Float, N1 Float, N2 Float, N3 Float, N4 Float, N5 Float, NAME1 type of column bd_cena.NAME, NAME2 type of column bd_cena.NAME, NAME3 type of column bd_cena.NAME, NAME4 type of column bd_cena.NAME, NAME5 type of column bd_cena.NAME ) AS DECLARE VARIABLE tmp_rcena float; DECLARE VARIABLE tmp_pcena float; DECLARE VARIABLE tmp_id_cena integer; DECLARE VARIABLE i integer; DECLARE VARIABLE tmp_name type of column bd_cena.NAME; BEGIN if (fk_bd_cena_basic>0) THEN select name from bd_cena where field_key=:fk_bd_cena_basic into :name1; for select bd_11.FIELD_KEY, bd_11.CENA_PR_WITH_NDS from bd_11 --для каждой позиции в приходе where bd_11.FK_BD_1=:id_prihod into :id_11, :tmp_pcena do begin rc1=null; n1=null; rc2=null; n2=null; rc3=null; n3=null; rc4=null; n4=null; rc5=null; n5=null; if (tmp_pcena>0) THEN begin i=0; rc1=null; n1=null; --находим базовую цену для товара if (fk_bd_cena_basic>0) THEN BEGIN for select bd_115.CENA_WITH_NDS from bd_115 where bd_115.FK_BD_11=:id_11 and bd_115.FK_BD_CENA=:fk_bd_cena_basic into :rc1 do n1=rc1/tmp_pcena*100-100; --вычисляем доп.цены i=1; END rc2=null; n2=null; rc3=null; n3=null; rc4=null; n4=null; rc5=null; n5=null;name2=null;name3=null;name4=null;name5=null; for select bd_cena.NAME, bd_cena.field_key --для всех существующих цен from bd_cena where not(bd_cena.field_key=:fk_bd_cena_basic) order by nomer into :tmp_name, :tmp_id_cena do BEGIN --находим соотв. цену для текущей строки прихода i=i+1; if (i=1) then name1=tmp_name; if (i=2) then name2=tmp_name; if (i=3) then name3=tmp_name; if (i=4) then name4=tmp_name; if (i=5) then name5=tmp_name; for select CENA_WITH_NDS from bd_115 where bd_115.FK_BD_11=:id_11 and bd_115.FK_BD_CENA=:tmp_id_cena into :tmp_rcena do BEGIN if (i=1) then BEGIN rc1=tmp_rcena; n1=rc1/tmp_pcena*100-100; END if (i=2) then BEGIN rc2=tmp_rcena; n2=rc2/tmp_pcena*100-100; END if (i=3) then BEGIN rc3=tmp_rcena; n3=rc3/tmp_pcena*100-100; END if (i=4) then BEGIN rc4=tmp_rcena; n4=rc4/tmp_pcena*100-100; END if (i=5) then BEGIN rc5=tmp_rcena; n5=rc5/tmp_pcena*100-100; END END END END suspend; END END^ SET TERM ; ^увеличена длина для названия цены18.4.8.1ALTER PROCEDURE SP_GET_RPRICE  b{N b =Q+SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS ? CiMINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Просмотр журнала входов-выходов', 'login_hist_view', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='adm'));просмотр журнала логинов18.4.8.1INSERT INTO BD_USERS_RIGHTS_NAME`o ACREATE INDEX IDX_BD_LOGIN3 ON BD_LOGIN (ID_CONN);18.4.8.1CREATE INDEX IDX_BD_LOGIN3r 5gCALTER TRIGGER TR_DISCONNECT ACTIVE POSITION 0 AS BEGIN update bd_login set ts_logout=current_timestamp where id_conn=current_connection; ENDлоггинг отключений от бд18.4.8.1ALTER TRIGGER TR_DISCONNECTs  =ALTER TABLE BD_LOGIN ADD id_conn Integer default current_connection;18.4.8.1ALTER TABLE BD_LOGIN ADD[ i =ALTER TABLE BD_LOGIN ADD ts_logout Timestamp; 18.4.8.1ALTER TABLE BD_LOGIN ADD o]AALTER TABLE BD_ORDER_OUT_1 ADD date_before Date; дата истечения заявки18.4.8.1ALTER TABLE BD_ORDER_OUT_1W EMINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Проведение внутренних платежей', 'opl_interprov', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='oplata')); права на проведение внутренних оплат18.4.8.1INSERT INTO BD_USERS_RIGHTS_NAME; {3AINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('from_zakaz_for_prihod', '0', 'Число дней от заказа до поставки по умолчанию'); Число дней от заказа до поставки по умолчанию18.4.8.1INSERT INTO GLOBAL_OPTIONS[ W OSET TERM ^ ; ALTER PROCEDURE SP_REP_PEREOZENKA ( DAT1 Date, DAT2 Date, FK_FACE Blob sub_type 0 ) RETURNS ( FK_TOVAR Integer, NAME_TOVAR Varchar(100), NAME_CENA type of column bd_cena.NAME, OLDCENA Decimal(18,2), NEWCENA Decimal(18,2) ) AS DECLARE VARIABLE cena_ts TIMESTAMP; DECLARE VARIABLE fk_cena integer; BEGIN /* write your code here */ for select bd_tovar.FIELD_KEY, bd_tovar.name, BD_CPR.CENA, bd_cena.NAME, bd_cpr.START_DATE+bd_cpr.START_TIME, bd_cena.field_key from BD_TOVAR join bd_cpr on bd_cpr.FK_BD_TOVAR=bd_tovar.FIELD_KEY join bd_cena on BD_CENA.FIELD_KEY=bd_cpr.FK_BD_CENA where bd_cpr.START_DATE+bd_cpr.START_TIME BETWEEN :dat1 and :dat2 and (:fk_face='all' or :fk_face CONTAINING '['||bd_tovar.FK_BD_FACE||']') order by 1,2 into :fk_tovar, :NAME_tovar, :newcena, :name_cena, :cena_ts, :fk_cena do begin oldcena=0; --находим предыдущую цену select first 1 BD_CPR.CENA from BD_CPR where fk_bd_tovar=:fk_tovar and fk_bd_cena=:fk_cena and bd_cpr.START_DATE+bd_cpr.START_TIME<:cena_ts order by bd_cpr.START_DATE+bd_cpr.START_TIME desc into :oldcena; oldcena=coalesce(oldcena,0); suspend; END END^ SET TERM ; ^увеличена длина для названия цены18.4.8.1ALTER PROCEDURE SP_REP_PEREOZENKAinteger; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 and bd_11.date_prih<=:dat order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^Исправление проблем с поиском замен при производстве18.4.10.1SP_CREATE_BY_PRm.field_key=bd_order_out_1.fk_bd_firm where bd_firm.fk_selful=(select fk_selful from bd_firm where field_key=:fk_post) into :nomer_shet; INSERT INTO BD_ORDER_OUT_1 (FIELD_KEY, NOMER_SHET, FK_BD_FIRM, DATE_ORDER, TIME_ORDER, DATE_DELIVERY, NABOR_FLAG, FK_RECIPIENT, FK_BD_ORDER_IN_1, in_prih_price, cod_rash, day_cons_rash, fk_selful, fk_pfirm_recipient, BD_ORDER_OUT_1.MARGIN, BD_ORDER_OUT_1.DISCOUNT, BD_ORDER_OUT_1.FK_BD_CENA, prim) VALUES (:fk, :nomer_shet, :fk_post, current_date, current_time, :date_del, 0, :fk_zak, :id_zakaz, :in_prih_price, :cod_rash, :day_cons_rash, -- (select fk_selful from bd_firm where field_key=:fk_zak), (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_zak), :margin, :discount, :fk_bd_cena, :prim); --было ошибочное копирование юрлица из заказа в заявку (select fk_selful from bd_firm where field_key=:fk_post), (select first 1 field_key from BD_PFIRM where fk_bd_firm=:fk_zak), :margin, :discount, :fk_bd_cena, :prim); for SELECT fk_bd_tovar, cnt, bd_order_in_11.cnt_11, BD_ORDER_IN_11.CENA_PR_WITH_NDS, BD_ORDER_IN_11.SUMMA_WITH_NDS, fk_bd_11, bd_order_in_11.inplace from BD_ORDER_IN_11 where fk_bd_order_in_1=:id_zakaz INTO :fk_tovar, :kolvo, :kolvo11, :cena_nds, :sum_nds, :fk_11, :inplace do BEGIN if ((coalesce(fk_11,0)=0)or(kolvo110 and bd_11.PRIORITY>0 and valid_flag=1 and ((:fk_11 is null) or (:fk_11=field_key)) --либо конкретная партия не задана, либо если указана, берем только ее order by date_prih, fk_bd_1 into :fk_bd_11, :stock do begin if (cnt_ost>0) then begin if (stock>cnt_ost) then begin INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,fk_poluchatel) VALUES (:fk_bd_11, :fk_o_11,:cnt_ost, 4, :fk, :fk_zak); cnt_ost=0; end else begin cnt_ost=cnt_ost-stock; INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,fk_poluchatel) VALUES (:fk_bd_11, :fk_o_11,:stock, 4, :fk, :fk_zak); end end end if (cnt_ost>0) then --Не все распределилось по приходам begin --сохраняем запись select trim(name) from bd_tovar where field_key=:fk_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках на базе с учетом резервов',:lang))||': '||(:kolvo-:cnt_ost)||', '||(select TR_NAME from SP_TRANSLATE(' в заказе',:lang))||': '||kolvo||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||cnt_ost; INSERT INTO BD_order_in_RESULTSEND (FK_BD_order_in_1, TXT_MSG, FK_BD_TOVAR, CNT_order_in, CNT_11, CNT_MINUS) VALUES (:ID_ZAKAZ,:result_txt,:FK_TOVAR,:kolvo,(:kolvo+:cnt_ost),:cnt_ost); end end END update bd_order_in_1 set SEND_FLAG=1, received_flag=1 where field_key=:id_zakaz; END END ^ SET TERM ; ^передача ссылок на выбранную партию из заказа в заявку18.4.10.1ALTER PROCEDURE SP_SEND_ZAKPOST \\ UKSET TERM ^ ; ALTER PROCEDURE SP_SEND_ZAKPOST ( ID_ZAKAZ Integer, LANG Varchar(2) DEFAULT 'RU' ) AS declare variable FK integer; declare variable FK_ZAK integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable FK_POST integer; declare variable DATE_ZAK date; declare variable DATE_DEL date; declare variable TIME_ZAK time; declare variable FK_TOVAR integer; declare variable KOLVO decimal(7,3); declare variable CENA_NDS decimal(8,2); declare variable SUM_NDS decimal(8,2); declare variable FK_11 integer; declare variable KOLVO11 decimal(7,3); declare variable NOMER_SPEC NOMER_SPEC; declare variable DATE_SPEC date; declare variable FK_SELFUL integer; declare variable FK_PFIRM integer; declare variable NOMER_SHET integer; declare variable CNT_OST decimal(7,3); declare variable STOCK decimal(7,3); declare variable FK_O_11 integer; declare variable FK_BD_11 integer; declare variable COD_RASH integer; declare variable IN_PRIH_PRICE integer; declare variable COD_PRIH integer; declare variable DAY_CONS_PRIH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_CENA integer; declare variable MARGIN type of column BD_DOGOVOR.MARGIN; declare variable DISCOUNT type of column BD_DOGOVOR.DISCOUNT; declare variable FK_DOGOVOR integer; declare variable RESULT_TXT varchar(1000); declare variable PRIM type of column BD_ORDER_OUT_1.PRIM; declare variable ZAYAVKA_RESERV type of column BD_FIRM.ZAYAVKA_RESERV_FLAG; BEGIN delete from BD_order_in_RESULTSEND where fk_bd_order_in_1=:ID_ZAKAZ; for select BD_ORDER_IN_1.FK_BD_FIRM, BD_ORDER_IN_1.FK_SUPPLIER, BD_ORDER_IN_1.DATE_ORDER, BD_ORDER_IN_1.DATE_DELIVERY, BD_ORDER_IN_1.TIME_ORDER, bd_order_in_1.fk_pfirm_supplier, BD_ORDER_IN_1.COD_PRIH, BD_ORDER_IN_1.DAY_CONS_PRIH, substring(BD_ORDER_IN_1.PRIM from 1 for 200) , BD_FIRM.zayavka_reserv_flag from BD_ORDER_IN_1 join bd_firm on bd_firm.field_key=BD_ORDER_IN_1.FK_SUPPLIER where BD_ORDER_IN_1.field_key=:id_zakaz into :fk_zak, :fk_post, :date_zak, :date_del, :time_zak, :fk_pfirm, :cod_prih, :day_cons_prih, :prim , :zayavka_reserv do BEGIN --переводим код прихода в код расхода --cod_rash=(select bd_cod_rash.FIELD_KEY from BD_COD_RASH where BD_COD_RASH.COD_PRIH_6=:cod_prih); --ищем условия расхода по договорам fk_dogovor=null; cod_rash=null; day_cons_rash=null; margin=null; discount=null; fk_bd_cena=null; in_prih_price=null; select first 1 d.field_key, d.COD_RASH, day_cons_rash, d.DISCOUNT, d.MARGIN, d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:fk_zak and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:fk_post) and d.valid_flag=1 into :fk_dogovor, :cod_rash, :day_cons_rash, :discount, :margin ,:fk_bd_cena, :in_prih_price; if (fk_dogovor is null) then --договора нет, тогда берем из заказа в приходных ценах begin cod_rash=(select bd_cod_rash.FIELD_KEY from BD_COD_RASH where BD_COD_RASH.COD_PRIH_6=:cod_prih); day_cons_rash=day_cons_prih; in_prih_price=1; margin=0; discount=0; end fk=GEN_ID(GEN_BD_ORDER_OUT_1_ID,1); select coalesce(max(nomer_shet+1),1) from BD_ORDER_OUT_1 join BD_FIRM on bd_firfminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str do BEGIN cnt=0; self_stock=0; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; suspend; END end end -- suspend; end ^ SET TERM ; ^Отображение остатка на базе не более макс нормы при отсутствии прав18.4.10.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK  Y Y ;QSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, by_max_norm integer = 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30) ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :i) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; suspend; END end end -- suspend; end ^ SET TERM ; ^выводить цену в подборе в зависимости от договора18.4.10.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( 1CQSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30) ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad  8 &Y?) yALTER TABLE BD_FIRM ADD FK_BD_CENA_RECIPIENT INTEGER;Рекомендованная продажная цена клиента18.4.21.1BD_FIRM ALTER TABLE BD_FIRM ADD ZAPRET_CENA_RASH_0 BOOLFIELD DEFAULT 0 ;Запрет на отпуск по нулевой цене18.4.21.1BD_FIRM kyAINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('AlertSound', 'Alert.wav', 'Звуковой файл *.wav при получении оповещения');расположение звукового файла18.4.21.1INSERT INTO GLOBAL_OPTIONS* y7ALTER TABLE BD_21 ADD cena_without_disc Decimal(8,2);цена с ндс до применения скидки-наценки18.4.16.1ALTER TABLE BD_21 ADD* y7ALTER TABLE BD_22 ADD cena_without_disc Decimal(8,2);цена с ндс до применения скидки-наценки18.4.16.1ALTER TABLE BD_22 ADDU GAINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('OrderOutNoDubleFromRec', '0', 'При вводе заявке проверять наличие заявок от данного контрагента и предлагать переход');При вводе заявке проверять наличие заявок от данного контрагента и предлагать перехо18.4.16.1INSERT INTO GLOBAL_OPTIONS= {5AINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('OrderOutGridUnistate', '0', 'Показывать ОСС по позиции в заявке получателя');Показывать ОСС по позиции в заявке получателя18.4.16.1INSERT INTO GLOBAL_OPTIONS= #''SET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date, DATE_OPER date) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); declare variable SUM_OPL1 decimal(15,2); de /7SET TERM ^ ; create or alter procedure SP_GET_DOLG_UL_KONTR2 ( FK_SELFUL integer, DATE_DOLG date, FK_FIRM integer) returns ( SUMMA decimal(15,2)) as declare variable ID integer; declare variable DAT date; declare variable NOMER varchar(50); declare variable TYP_DOC integer; declare variable NAME_OPER varchar(200); declare variable RAZN decimal(15,2); declare variable DEBET decimal(15,2); declare variable KREDIT decimal(15,2); declare variable SUMMA_OPL decimal(15,2); decg ]MINSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Правка резервов по чужим заявкам', 'zr_res_edit_all', (SELECT a.FIELD_KEY FROM BD_USERS_RIGHTS_NAME a where name_var='zakazrecipient'));Право правки резеврво по чужим заявкам18.4.11.1INSERT INTO BD_USERS_RIGHTS_NAMEY WAINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('NewTovarAddInSpec', '0', 'Предлагать включать новый ассортимент в спецификацию');'Предлагать включать новый ассортимент в спецификацию'18.4.11.1INSERT INTO GLOBAL_OPTIONSlare variable SUMMA_REAL decimal(15,2); declare variable FK_DOC integer; declare variable DATE_OPER date; BEGIN for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))|| nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (bd_2.date_nakl < :date_dolg) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create < :date_dolg group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (bd_1.date_nakl < :date_dolg) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create < :date_dolg group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=coalesce(summa_opl,0)+coalesce(razn,0); end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; -- suspend; END name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); if (kredit=0) then kredit=null; date_oper=null; summa=:debet-:kredit; suspend; END^ SET TERM ; ^ /* Following GRANT statetements are generated automatically */ GRANT SELECT ON BD_2 TO PROCEDURE SP_GET_DOLG_UL_KONTR2; GRANT SELECT ON BD_21 TO PROCEDURE SP_GET_DOLG_UL_KONTR2; GRANT SELECT ON KS_1 TO PROCEDURE SP_GET_DOLG_UL_KONTR2; GRANT SELECT ON KS_SCHET TO PROCEDURE SP_GET_DOLG_UL_KONTR2; GRANT SELECT ON BD_1 TO PROCEDURE SP_GET_DOLG_UL_KONTR2; GRANT SELECT ON BD_11 TO PROCEDURE SP_GET_DOLG_UL_KONTR2; /* Existing privileges on this procedure */ GRANT EXECUTE ON PROCEDURE SP_GET_DOLG_UL_KONTR2 TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_GET_DOLG_UL_KONTR2 TO SYSDBA;расчет сальдо на начало для акта сверки18.4.16.1SP_GET_DOLG_UL_KONTR2clare variable SUM_OPL2 decimal(15,2); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=coalesce(:sum_opl1,0); if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; date_oper=null; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))|| nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; suspend; END --обороты за период --select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); if (kredit=0) then kredit=null; date_oper=null; suspend; --считаем итоговое сальдо razn=-coalesce((coalesce(:sum_opl1,0))+(abs(coalesce(:summa_real,0))-abs(coalesce(:summa_opl,0))),0); name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); date_oper=null; -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org||' '||RAZN||' тенге.'; end ELSE txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org_client||' '||RAZN||' тенге.'; id=null; date_oper=null; suspend; END^ SET TERM ; ^SP_ACT_SVERKI18.4.16.1SP_ACT_SVERKI m@w" o5CSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME char(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME char(200), INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY_STR, PRIM11 varchar(200)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); declare variable CURR_RESERV decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.00) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey_str from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey do BEGIN prim11=null; cnt=! c/ALTER TABLE BD_22 add CENA_PR decimal(8,3);кеш прих цены при добавлении из подбора18.4.21.1ALTER TABLE BD_22 E/ALTER TABLE BD_TOVAR_DISCOUNT ADD SUM_DISC DECIMAL(12,2) DEFAULT 0 ;скидка в рублях18.4.21.1BD_TOVAR_DISCOUNT gALTER TABLE BD_AKC ADD MANUAL_SELECT_IN_KASSA BOOLFIELD DEFAULT 0 ;Вручную указать на кассе18.4.21.1BD_AKC0; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_not_nds; -- cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); -- cena_not_nds = coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); --находим количество из приходной накладной curr_reserv=coalesce((select cnt_reserv from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_11_REZERV=:fk_bd_11 and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz),0); stock=stock+curr_reserv; for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если резерв по позиции заказа уже имеется, плюсуем его к остатку --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; --cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^oldkey -> oldkey_str18.4.21.1SP_GET_CURRSTATE_FOR_ZAKPOL_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey_str from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end suspend; end end END^ SET TERM ; ^oldkey -> oldkey_str18.4.21.1SP_GET_SPR_FOR_ZAKPOL aA3Sa)( aQSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTk' !'GRANT EXECUTE ON PROCEDURE SP_GET_MAXCNTFORZAKAZ TO "PUBLIC";права18.4.23.1GRANT EXECUTEn& o YSET TERM ^ ; CREATE or alter PROCEDURE sp_get_maxcntforzakaz ( fk_bd_firm_self integer, fk_bd_firm_zakaz integer, fk_bd_tovar integer, cnt_stock decimal(12,3), sum_prih decimal(12,2) default null) RETURNS ( cnt decimal(12,3), sum_pc decimal(12,2)) AS DECLARE VARIABLE cnt_max decimal(12,3); BEGIN --поиск нормы if (fk_bd_firm_self=fk_bd_firm_zakaz) then begin cnt = cnt_stock; sum_pc = sum_prih; suspend; exit; end cnt_max=coalesce((select bd_norma.MAXCNT from bd_norma where fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:fk_bd_firm_self),0); if ((cnt_max>0)and(cnt_max1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешам добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам польователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; stock=0; if (sklad=1) then begin select sum(coalesce(stock-rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-rezerv)>0 and valid_flag=1 into stock; --контроль отображения остатка if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0) then avgrash=coalesce(:sold,0)/:day_torg_manually; suspend; END end end -- suspend; end ^ SET TERM ; ^вывод остатков по транзитному складу18.4.24.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAKorder_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15,16 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0)  group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; track_11=null; stock=null; has_stock=0; if (sklad=1) then --транзитный склад begin maxcnt_ost=maxcnt; for select field_key, coalesce(stock-coalesce(rezerv,0),0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 into :fk_bd_11, :stock, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; suspend; end end --end for end if ((sklad=0)or(has_stock=0)) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end cnt=null; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; suspend; end END end end -- suspend; end ^ SET TERM ; ^ подбор в заказ поставщику: для транзитного склада ассортимент+партии+контроль отображения по макс норме+вывод трека18.4.25.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK 2) O9QSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30), track_11 type of column bd_11.TRACK_11 ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; declare variable has_stock integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_er_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15,16 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; track_11=null; stock=null; has_stock=0; fk_bd_11=null; if (sklad=1) then --транзитный склад begin maxcnt_ost=maxcnt; for select field_key, coalesce(stock-coalesce(rezerv,0),0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 into :fk_bd_11, :stock, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; suspend; end end --end for end if ((sklad=0)or(has_stock=0)) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end cnt=null; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; suspend; end END end end -- suspend; end ^ SET TERM ; ^ исправление дублирования fk_1118.4.26.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK r7r5+ mWSET TERM ^ ; ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ Integer, ID_SKLAD Integer, ID_POL Integer, ID_PPOL Integer, ID_DOG Integer DEFAULT null ) RETURNS ( FK_BD_TOVAR Integer, NAME Varchar(100), CNT Float, CENA_NDS Float, CENA_NOT_NDS Float, SUMMA_NDS Float, SUMMA_NOT_NDS Float, INS Integer, STOCK Decimal(7,3), FK_BD_11 Integer, SELF_STOCK Decimal(7,3), FULLNAME Varchar(200), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, IN,* wQSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30), track_11 type of column bd_11.TRACK_11 ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; declare variable has_stock integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_ordPLACE Decimal(7,3), OLDKEY Integer, PRIM11 Varchar(200), track_11 type of column bd_11.TRACK_11, rezerv Decimal(7,3)) AS declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNT decimal(7,2); declare variable HAS_STOCK integer; BEGIN ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; -- select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; /* if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end*/ stock=0; has_stock=0; rezerv=0; track_11=null; fk_bd_11=null; --остаток по партиям for select field_key, coalesce(stock,0)-coalesce(rezerv,0), coalesce(rezerv,0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into :fk_bd_11, :stock, :rezerv, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end --else --begin -- cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); -- cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); --end cnt=null; select cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; end --end for if (has_stock=0) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end -- else --begin -- cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); -- cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); --end cnt=null; select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; end end end END ^ SET TERM ; ^ добавлен вывод трека, вывод партий по остаткам, вывод резерва18.4.26.1ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOLsce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_not_nds; -- cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); -- cena_not_nds = coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); --находим количество из приходной накладной curr_reserv=coalesce((select cnt_reserv from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_11_REZERV=:fk_bd_11 and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz),0); stock=stock+curr_reserv; for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если резерв по позиции заказа уже имеется, плюсуем его к остатку --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; --cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END ^ SET TERM ; ^ добавлен вывод трека, вывод резерва по партии18.4.26.1ALTER PROCEDURE SP_GET_CURRSTATE_FOR_ZAKPOL +, 73cSET TERM ^ ; ALTER PROCEDURE SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ Integer, ID_SKLAD Integer, ID_POL Integer, ID_PPOL Integer, IN_PRIH_PRICE Integer, ID_CENA Integer, ID_DOG Integer DEFAULT null ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Float, CENA_NDS Float, CENA_NOT_NDS Float, SUMMA_NDS Float, SUMMA_NOT_NDS Float, STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, SELF_STOCK Decimal(7,3), AKC Integer, ED_IZM_NAME Char(30), OLDKEY Integer, PRIM11 Varchar(200), track_11 type of column bd_11.TRACK_11, rezerv decimal(7,3) ) AS declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); declare variable curr_reserv decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.00) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey, coalesce(bd_11.REZERV,0), track_11 from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey, :rezerv, :track_11 do BEGIN prim11=null; cnt=0; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coale m >|nm 2 _-ALTER TABLE BD_2 ADD ts_print Timestamp; признак что накладная печаталась18.5.7.1ALTER TABLE BD_2n1 /%CREATE INDEX BD_DISC_CARD_IDX1 ON BD_DISC_CARD (FK_GROUP); BD_DISC_CARD_IDX118.5.7.1BD_DISC_CARD\0k%%ALTER TABLE BD_DISC_CARD ADD FK_GROUP INTEGER; ADD FK_GROUP18.5.7.1BD_DISC_CARD+/ c=1UPDATE OR INSERT INTO BD_DISC_CARD_GROUP (FIELD_KEY, NAME, PREF) VALUES (0, 'ВСЕ', NULL) MATCHING(NAME); Группа ВСЕ ДК18.5.7.1BD_DISC_CARD_GROUP>. /1SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_DISC_CARD_GROUP_ID; CREATE TABLE BD_DISC_CARD_GROUP ( FIELD_KEY INTEGER NOT NULL, NAME VARCHAR(100), PREF VARCHAR(4) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_DISC_CARD_GROUP ADD CONSTRAINT PK_BD_DISC_CARD_GROUP PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_DISC_CARD_GROUP_BI */ CREATE OR ALTER TRIGGER BD_DISC_CARD_GROUP_BI FOR BD_DISC_CARD_GROUP ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_disc_card_group_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_DISC_CARD_GROUP TO PUBLIC; Группы ДК18.5.7.1BD_DISC_CARD_GROUP>- 7+SET TERM ^ ; CREATE OR ALTER procedure SP_BD_TOVAR_ADD ( NAME type of column BD_TOVAR.NAME, SCAN type of column BD_SCAN.SCANCOD, ED_IZM type of column BD_ED_IZM.NAME, PRICE type of column BD_CPR.CENA, FK_BD_FIRM integer) returns ( FK_TOVAR integer) as declare variable FK_CENA integer; declare variable FK_EDIZM integer; BEGIN --единица измерения if (coalesce(trim(ed_izm),'')='') then ed_izm='n/a'; update or INSERT INTO BD_ED_IZM (NAME, ACCURACY) VALUES (trim(:ed_izm),3) matching (name) returning (field_key) into :fk_edizm; INSERT INTO BD_TOVAR (FK_GRT, NAME, FULLNAME, FK_BD_ED_IZM, NDS) VALUES (0,:NAME,:name,:fk_edizm,coalesce((select nds from BD_GRT_TOVAR where field_key=0),18)) returning (field_key) into :fk_tovar; INSERT INTO BD_SCAN (FK_BD_TOVAR, SCANCOD, COL, MAIN_FLAG, CENNIK_FLAG, COMMIT_FLAG) VALUES (:FK_TOVAR,:SCAN,1,1,0,1); select bd_firm.FK_BD_CENA_BASIC from bd_firm where field_key=:fk_bd_firm into :fk_cena; INSERT INTO BD_CPR (FK_BD_TOVAR, FK_BD_CENA, CENA, LAST_DATE, LAST_TIME, OPERATOR, WORKPLACE, FK_BD_OPERATION, START_DATE, CENA_PR, END_DATE, START_TIME, FK_BD_11, OLDKEY) VALUES (:FK_TOVAR, :FK_CENA, :price, current_date, current_time, 0, 0, 0, current_date, 0, null, null, null, null); suspend; END^ SET TERM ; ^ добавление товаров при скачке чеков18.4.26.1SP_BD_TOVAR_ADD Zt WZ\6 #ICSET TERM ^ ; ALTER PROCEDURE SP_BD2_PROV ( FK_BD2 Integer, LANG Varchar(2), CREATE_7 Integer, FK_USER Integer, IGNORE_NO_IZLISH_FLAG Integer DEFAULT 0, CHECKSTOCK7 Integer DEFAULT 0 ) AS declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; /* coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) */ declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); declare variable CNT_RESERV_11 decimal(8,3); declare variable CNT_RESERV_REC decimal(8,3); declare variable FK_REC ȩ5 c]CSET TERM ^ ; ALTER PROCEDURE SP_22_BY_21 ( FK_BD_2 Integer, WITH_FK_11 Integer ) AS declare variable FK_21 integer; declare variable FK_22 integer; declare variable FK_TOVAR integer; declare variable FK_MOD integer; declare variable CNT decimal(7,3); /* type of column bd_22.CNT; */ declare variable CENA_WITH_NDS decimal(8,2); /* type of column bd_22.CENA_WITH_NDS; */ declare variable CENA_WITHOUT_NDS decimal(8,2); /* type of column bd_22.CENA_WITHOUT_NDS; */ declare variable FK_11 integer; declare variable FK_BD_ORDER_OUT_11 integer; declare variable NDS integer; declare variable NAME_CENA type of column bd_cena.NAME; declare variable FK_CENA integer; declare variable IN_PRIH_CENA integer; declare variable SUMMA_21 decimal(15,2); declare variable SUMMA_MAN integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable IN_115_CENA integer; declare variable FK_FIRM integer; declare variable DATE_RASH date; declare variable CENA_OTL decimal(12,3); declare variable posprim varchar(100); BEGIN select coalesce(bd_2.IN_PRIH_CENA,0),coalesce(bd_2.in_bd115_cena,0), bd_2.date_rash from bd_2 wheǁ4_w7ALTER TABLE BD_21 ADD prim Varchar(100); примечание к позиции расхода18.5.7.1ALTER TABLE BD_22 ADD3_w7ALTER TABLE BD_22 ADD prim Varchar(100); примечание к позиции расхода18.5.7.1ALTER TABLE BD_22 ADDre field_key=:fk_bd_2 into :in_prih_cena, :in_115_cena, :date_rash; select first 1 bd_cena.FIELD_KEY, bd_cena.name, bd_firm.field_key from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY join bd_2 on bd_2.FK_BD_FIRM=BD_Firm.FIELD_KEY where bd_2.FIELD_KEy=:FK_BD_2 into :fk_cena, :name_cena, :fk_firm; if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd_2)) then begin update bd_21 set fk_bd_22=null where fk_bd_2=:fk_bd_2 and fk_bd_22 is not null; delete from bd_22 where fk_bd_2=:fk_bd_2; end for select bd_21.field_key, bd_21.fk_bd_tovar, bd_21.fk_bd_tovar_mod , (case when (coalesce(:with_fk_11,0)=0) then null else bd_21.fk_bd_11 end), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_with_nds,bd_11.CENA_PR_WITH_NDS)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_without_nds, bd_11.CENA_PR_WITHOUT_NDS)), bd_21.cnt, -- sum(bd_21.cnt), coalesce(bd_11.nds,bd_tovar.nds,0) , bd_21.FK_BD_ORDER_OUT_11, iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds*bd_21.cnt, iif(((:in_prih_cena=1)and(bd_21.CNT=bd_11.CNT)),bd_11.SUMMA_WITH_NDS,bd_21.SUMMA)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), 0, iif((:in_prih_cena=1) and (bd_21.cena_with_nds<>bd_11.CENA_PR_WITH_NDS), 0, bd_21.SUM_INPUT_MAN_FLAG)), bd_21.CNT_IN_INPLACE, bd_21.prim -- max(bd_11.NDS) from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 left join bd_115 on bd_115.fk_bd_11=bd_11.field_key left join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar where bd_21.fk_bd_2=:fk_bd_2 -- group by 1,2,3,4,5,6 into :fk_21, :fk_tovar, :fk_mod, :fk_11, :cena_with_nds, :cena_without_nds,:cnt, :nds,:FK_BD_ORDER_OUT_11, :summa_21, :summa_man, :cnt_in_inplace, :posprim do begin if (in_prih_cena=0) then begin cena_otl=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rash between coalesce(o1.begin_date,:date_rash) and coalesce(o1.end_date,:date_rash) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:fk_firm))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_tovar and ocpr.fk_bd_cena=:fk_cena into :cena_otl; if ((:in_115_cena=1)and(:cena_otl is not null)) then begin cena_with_nds=:cena_otl; cena_without_nds=:cena_with_nds/(100.00+:NDS)*100.00; summa_21=:cena_with_nds*:cnt; end end cnt=abs(cnt); fk_22=gen_id(GEN_BD_22_ID,1); if (coalesce(with_fk_11,0)=0) then fk_11=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, FK_BD_ORDER_OUT_11, NDS, FK_BD_11, CNT, summa, SUM_INPUT_MAN_FLAG, cnt_in_inplace, prim) VALUES (:fk_22,:FK_BD_2,:FK_TOVAR,:FK_MOD,:cena_with_nds,:cena_without_nds,:FK_BD_ORDER_OUT_11,:NDS,:FK_11,:cnt, :summa_21, :summa_man, :cnt_in_inplace, :posprim); update bd_21 set fk_bd_22=:fk_22, cena_without_nds=:cena_without_nds, cena_with_nds=:cena_with_nds, SUM_INPUT_MAN_FLAG=:summa_man where field_key=:fk_21; end update bd_2 set bd_2.name_ifs=(case when (cod_rash in (4,5,6,9)) then 'В прих.ценах' else 'По цене '||:name_cena end), bd_2.FK_CENA_RASH=(case when (cod_rash in (4,5,6,9)) then null else :fk_cena end), bd_2.IN_PRIH_CENA=(case when (cod_rash in (4,5,6,9)) then 1 else 0 end) where field_key=:fk_bd_2 and name_ifs is null; update bd_2 set valid_flag=1 where field_key=:fk_bd_2; END ^ SET TERM ; ^ восстановление примечания к позиции расхода из движения18.5.7.1ALTER PROCEDURE SP_22_BY_21integer; declare variable FK_RES integer; declare variable CNT_RESERV_CANCEL decimal(8,3); declare variable CNT_RES decimal(8,3); declare variable CNT_RESERV_PR decimal(8,3); declare variable fk_bd_order_out_11 integer; declare variable posprim varchar(100); BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22, bd_22.FK_BD_ORDER_OUT_11, bd_22.prim from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22, :fk_bd_order_out_11, :posprim do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11; cnt_11_stock=cnt_11_stock-cnt_reserv_11; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем резервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end if (cnt_21<>0) then insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod,fk_bd_order_out_11, prim) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11, prim) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11, prim) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)or(checkstock7=1)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod, prim) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod, :posprim); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod, prim) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod, :posprim); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0) then begin select pref from bd_disc_card_group where field_key=new.fk_group into :prefix; if (prefix is not null) then mask=:prefix||'000SSSSSSS'; end if ((new.idcard is not null)and(new.nomer_disc_card is null)) then begin --select first 1 trim(prefix_disc_card) from bd_firm where prefix_disc_card is not null into :mask; len=char_length(:mask); pos=position('S',:mask); if (char_length(new.idcard)>=:pos) then new.nomer_disc_card=cast(substring(new.idcard from :pos for :len-:pos+1) as integer); else new.nomer_disc_card=new.idcard; end else if ((new.idcard is null)and(new.nomer_disc_card is not null)) then begin -- select first 1 trim(prefix_disc_card) from bd_firm where prefix_disc_card is not null into :mask; len=char_length(:mask); pos=position('S',:mask); prefix=substring(:mask from 1 for :pos-1); new.idcard=:prefix||lpad(new.nomer_disc_card, :len-:pos+1 ,'0'); end end^ SET TERM ; ^  trigger bd_disc_card_nomer18.5.7.1bd_disc_card_nomer7 u;ALTER TABLE BD_FIRM ADD prim_to_zakaz Varchar(300);  примечание контрагента к заказу18.5.7.1ALTER TABLE BD_FIRM ADDt from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; -- select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; /* if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end*/ stock=0; has_stock=0; rezerv=0; track_11=null; fk_bd_11=null; --остаток по партиям for select field_key, coalesce(stock,0)-coalesce(rezerv,0), coalesce(rezerv,0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into :fk_bd_11, :stock, :rezerv, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end --end for if (has_stock=0) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end end end END ^ SET TERM ; ^ вывод расх цены, убрано дублирование для Null значений18.5.7.2ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOLkey=:fk_bd_2 into :in_prih_cena, :in_115_cena, :date_rash; select first 1 bd_cena.FIELD_KEY, bd_cena.name, bd_firm.field_key from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY join bd_2 on bd_2.FK_BD_FIRM=BD_Firm.FIELD_KEY where bd_2.FIELD_KEy=:FK_BD_2 into :fk_cena, :name_cena, :fk_firm; if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd_2)) then begin update bd_21 set fk_bd_22=null where fk_bd_2=:fk_bd_2 and fk_bd_22 is not null; delete from bd_22 where fk_bd_2=:fk_bd_2; end for select bd_21.field_key, bd_21.fk_bd_tovar, bd_21.fk_bd_tovar_mod , (case when (coalesce(:with_fk_11,0)=0) then null else bd_21.fk_bd_11 end), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_with_nds,bd_11.CENA_PR_WITH_NDS)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds, iif(:in_prih_cena=0,bd_21.cena_without_nds, bd_11.CENA_PR_WITHOUT_NDS)), bd_21.cnt, -- sum(bd_21.cnt), coalesce(bd_11.nds,bd_tovar.nds,0) , bd_21.FK_BD_ORDER_OUT_11, iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), bd_115.cena_with_nds*bd_21.cnt, iif(((:in_prih_cena=1)and(bd_21.CNT=bd_11.CNT)),bd_11.SUMMA_WITH_NDS,bd_21.SUMMA)), iif((:in_115_cena=1)and(coalesce(bd_115.cena_with_nds,0)>0), 0, iif((:in_prih_cena=1) and (bd_21.cena_with_nds<>bd_11.CENA_PR_WITH_NDS), 0, bd_21.SUM_INPUT_MAN_FLAG)), bd_21.CNT_IN_INPLACE, bd_21.prim, bd_21.date_exp -- max(bd_11.NDS) from bd_21 join bd_11 on bd_11.field_key=bd_21.fk_bd_11 left join bd_115 on bd_115.fk_bd_11=bd_11.field_key left join bd_tovar on bd_tovar.field_key=bd_11.fk_bd_tovar where bd_21.fk_bd_2=:fk_bd_2 -- group by 1,2,3,4,5,6 into :fk_21, :fk_tovar, :fk_mod, :fk_11, :cena_with_nds, :cena_without_nds,:cnt, :nds,:FK_BD_ORDER_OUT_11, :summa_21, :summa_man, :cnt_in_inplace, :posprim, :date_exp do begin if (in_prih_cena=0) then begin cena_otl=null; select ocpr.cena from bd_otl_cena1 o1 join bd_otl_cena_cpr ocpr on ocpr.fk_bd_otl_cena1=o1.field_key where :date_rash between coalesce(o1.begin_date,:date_rash) and coalesce(o1.end_date,:date_rash) and o1.valid_flag=1 and ((o1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:fk_firm))or(o1.fk_bd_grt_firm is null)) and ocpr.fk_bd_tovar=:fk_tovar and ocpr.fk_bd_cena=:fk_cena into :cena_otl; if ((:in_115_cena=1)and(:cena_otl is not null)) then begin cena_with_nds=:cena_otl; cena_without_nds=:cena_with_nds/(100.00+:NDS)*100.00; summa_21=:cena_with_nds*:cnt; end end cnt=abs(cnt); fk_22=gen_id(GEN_BD_22_ID,1); if (coalesce(with_fk_11,0)=0) then fk_11=null; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, FK_BD_ORDER_OUT_11, NDS, FK_BD_11, CNT, summa, SUM_INPUT_MAN_FLAG, cnt_in_inplace, prim, date_exp) VALUES (:fk_22,:FK_BD_2,:FK_TOVAR,:FK_MOD,:cena_with_nds,:cena_without_nds,:FK_BD_ORDER_OUT_11,:NDS,:FK_11,:cnt, :summa_21, :summa_man, :cnt_in_inplace, :posprim, :date_exp); update bd_21 set fk_bd_22=:fk_22, cena_without_nds=:cena_without_nds, cena_with_nds=:cena_with_nds, SUM_INPUT_MAN_FLAG=:summa_man where field_key=:fk_21; end update bd_2 set bd_2.name_ifs=(case when (cod_rash in (4,5,6,9)) then 'В прих.ценах' else 'По цене '||:name_cena end), bd_2.FK_CENA_RASH=(case when (cod_rash in (4,5,6,9)) then null else :fk_cena end), bd_2.IN_PRIH_CENA=(case when (cod_rash in (4,5,6,9)) then 1 else 0 end) where field_key=:fk_bd_2 and name_ifs is null; update bd_2 set valid_flag=1 where field_key=:fk_bd_2; END ^ SET TERM ; ^ восстановление срока эксплуатации18.5.8.1ALTER PROCEDURE SP_22_BY_21  E E/=  C SET TERM ^ ; ALTER PROCEDURE SP_22_BY_21 ( FK_BD_2 Integer, WITH_FK_11 Integer ) AS declare variable FK_21 integer; declare variable FK_22 integer; declare variable FK_TOVAR integer; declare variable FK_MOD integer; declare variable CNT decimal(7,3); /* type of column bd_22.CNT; */ declare variable CENA_WITH_NDS decimal(8,2); /* type of column bd_22.CENA_WITH_NDS; */ declare variable CENA_WITHOUT_NDS decimal(8,2); /* type of column bd_22.CENA_WITHOUT_NDS; */ declare variable FK_11 integer; declare variable FK_BD_ORDER_OUT_11 integer; declare variable NDS integer; declare variable NAME_CENA type of column bd_cena.NAME; declare variable FK_CENA integer; declare variable IN_PRIH_CENA integer; declare variable SUMMA_21 decimal(15,2); declare variable SUMMA_MAN integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable IN_115_CENA integer; declare variable FK_FIRM integer; declare variable DATE_RASH date; declare variable CENA_OTL decimal(12,3); declare variable posprim varchar(100); declare variable date_exp date; BEGIN select coalesce(bd_2.IN_PRIH_CENA,0),coalesce(bd_2.in_bd115_cena,0), bd_2.date_rash from bd_2 where field_ if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22, bd_22.FK_BD_ORDER_OUT_11, bd_22.prim, bd_22.date_exp from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22, :fk_bd_order_out_11, :posprim, :date_exp do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11; cnt_11_stock=cnt_11_stock-cnt_reserv_11; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем резервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end if (cnt_21<>0) then insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod,fk_bd_order_out_11, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim, :date_exp); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim, :date_exp); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списываеׂся, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim, :date_exp); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)or(checkstock7=1)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod, :posprim, :date_exp); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod, :posprim, :date_exp); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt 'C SET TERM ^ ; ALTER PROCEDURE SP_BD2_PROV ( FK_BD2 Integer, LANG Varchar(2), CREATE_7 Integer, FK_USER Integer, IGNORE_NO_IZLISH_FLAG Integer DEFAULT 0, CHECKSTOCK7 Integer DEFAULT 0 ) AS declare variable FK_BD_FIRM integer; declare variable COD_RASH integer; declare variable DATE_RASH date; declare variable TIME_RASH time; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable FK_BD_TOVAR integer; declare variable FK_BD_MOD integer; declare variable FK_BD_11 integer; declare variable FK_BD_22 integer; declare variable FK_22_11 integer; declare variable CENA_WITH_NDS type of column BD_22.CENA_WITH_NDS; declare variable CENA_WITHOUT_NDS type of column BD_22.CENA_WITHOUT_NDS; declare variable CNT_OST decimal(8,3); declare variable CNT_11 decimal(8,3); declare variable CNT_11_STOCK decimal(10,3); declare variable CNT_21 decimal(8,3); declare variable CNT_22 decimal(8,3); declare variable RESULT_TXT varchar(1000); declare variable TMP_TXT varchar(300); declare variable FK_BD_1_NEW integer; /* coalesce(iif((stock-coalesce(REZERV,0)<0),0,stock-coalesce(rezerv,0)),0) */ declare variable FK_BD_1 integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable FK_BD_RASH_POL integer; declare variable CNT_FOR_VOZVRAT decimal(8,3); declare variable I integer; declare variable IN_PRIH_CENA integer; declare variable CNT_IN_INPLACE decimal(8,3); declare variable FK_BD_KASSA integer; declare variable FK_CH2 integer; declare variable IS_VOZVRAT integer; declare variable SUMMA_MAN type of column BD_22.SUMMA; declare variable MAN_FLAG type of column BD_22.SUM_INPUT_MAN_FLAG; declare variable DATE_SAVE date; declare variable DATE_MAKE date; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable SUMMA_OST type of column BD_22.SUMMA; declare variable FK_BD_TTK_AVTOPR integer; declare variable CNT_AVTOPR_OST decimal(8,3); declare variable CNT_TMP_OST decimal(8,3); declare variable CNT_PR_SPIS decimal(8,3); declare variable FK_BD_PR integer; declare variable RES_PR varchar(100); declare variable CNT_PR_PROD decimal(8,3); declare variable CNT_AVTOPR decimal(8,3); declare variable AVTOPR_FLAG integer; declare variable NO_IZLISH_FLAG integer; declare variable CREATE_7_PR integer; declare variable IN_115_CENA integer; declare variable TRACK_22 varchar(30); declare variable CNT_RESERV_11 decimal(8,3); declare variable CNT_RESERV_REC decimal(8,3); declare variable FK_REC integer; declare variable FK_RES integer; declare variable CNT_RESERV_CANCEL decimal(8,3); declare variable CNT_RES decimal(8,3); declare variable CNT_RESERV_PR decimal(8,3); declare variable fk_bd_order_out_11 integer; declare variable posprim varchar(100); declare variable date_exp date; BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); umn BD_DISC_CARD.NOMER_DISC_CARD, FIX_DISCOUNT_FLAG smallint, FK_GROUP integer) as begin -- if (oper is null) then oper = 'sum'; if (data1 is null) then select min(bd_ch2.date_close) from bd_ch2 into :data1; if (data2 is null) then select max(bd_ch2.date_close) from bd_ch2 into :data2; if (summa1 is null) then summa1=0; for select idcard, discount, fio, date_start, birthday, sex, active_flag, addr, fk_emitent, coalesce(bd_disc_card.SUM_BONUS,0), coalesce(bd_disc_card.SUM_BONUS_ISP,0), coalesce(bd_disc_card.SUM_BONUS_OST,0), field_key, coalesce(bd_disc_card.SUM_BONUS_CALC,0), date_reg, date_bonus, email, bd_disc_card.FK_BD_GRT_FIRM, BD_DISC_CARD.DATE_CALC, BD_DISC_CARD.summa_sales, BD_DISC_CARD.phone, bd_disc_card.nomer_disc_card, coalesce(bd_disc_card.fix_discount_flag,0), bd_disc_card.fk_group from bd_disc_card where (coalesce(:idcard_filter,'')='' or idcard containing :idcard_filter) and ((0=coalesce(:fk_grp,0))or(bd_disc_card.fk_group=:fk_grp)) order by 1 into :idcard, :discount, :fio, :date_start, :birthday, :sex, :active_flag, :addr, :fk_emitent, :summa_bonus, :summa_bonus_isp, :summa_bonus_ost, :field_key, :summa_bonus_calc, :date_reg, :date_bonus, :email, :FK_BD_GRT_FIRM, :date_calc, :summa_sales, :phone, :nomer_disc_card, :fix_discount_flag, :fk_group do begin summa=0; if (oper='sum') then if ((summa2 is not null)and((summa2-summa1)>0)) then select sum(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (sum(bd_ch2.summa)>=:summa1)and(sum(bd_ch2.summa)<=:summa2) into :summa; else if ((summa2-summa1)=0) then select sum(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (sum(bd_ch2.summa)=:summa1) into :summa; else select sum(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (sum(bd_ch2.summa)>=:summa1) into :summa; if (oper='avg') then if ((summa2 is not null)and((summa2-summa1)>0)) then select avg(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (avg(bd_ch2.summa)>=:summa1)and(avg(bd_ch2.summa)<=:summa2) into :summa; else if ((summa2-summa1)=0) then select avg(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (avg(bd_ch2.summa)=:summa1) into :summa; else select avg(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (avg(bd_ch2.summa)>=:summa1) into :summa; if (oper='cnt') then if ((summa2 is not null)and((summa2-summa1)>0)) then select count(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (count(bd_ch2.summa)>=:summa1)and(count(bd_ch2.summa)<=:summa2) into :summa; else if ((summa2-summa1)=0) then select count(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (count(bd_ch2.summa)=:summa1) into :summa; else select count(bd_ch2.summa) from bd_ch2 where (bd_ch2.idcard=:idcard) and (bd_ch2.date_close>=:data1 and bd_ch2.date_close<=:data2) having (count(bd_ch2.summa)>=:summa1) into :summa; if ((summa>0)or(oper is null)) then suspend; end end^ SET TERM ; ^процедура запроса диск.карт18.5.14.1SP_GET_DISC_CARD_ b] ;bCcq5ALTER TABLE BD_2 ADD fk_user_prov Integer;Юзер, который провел расход18.5.21.2ALTER TABLE BD_2 ADDJB GEALTER TRIGGER BD_11_TRACK_11 ACTIVE BEFORE INSERT POSITION 20 AS declare variable trace_flag integer; declare variable track_21_6 type of column bd_21.track_21; begin select coalesce(bd_tovar.trace_proslej_flag,0) from bd_tovar where field_key=new.fk_bd_tovar into :trace_flag; if (trace_flag=1) then begin /* if (exists(select field_key from bd_2 where fk_bd_1_6 = new.fk_bd_1)) then begin new.track_11 end*/ if ((new.track_11 is null)and((select coalesce(min(paramvalue),'0') from GLOBAL_OPTIONS where PARAMNAME='NoAddTrack11ifNULL')<>'1')) then begin new.track_11=coalesce((select paramvalue from global_options where paramname='track_prefix'),'31337')||lpad(cast(gen_id(track_key,1) as varchar(20)), 20-char_length(coalesce((select paramvalue from global_options where paramname='track_prefix'),'31337')),'0'); end end endучет настройки по отключению автозаполнения трека18.5.19.1ALTER TRIGGER BD_11_TRACK_11A E-AINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('NoAddTrack11ifNULL', '1', 'Не заполнять трек автоматически');настройка - не заполнять трек автоматически18.5.19.1INSERT INTO GLOBAL_OPTIONS@ cAINSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('prihTSD.doublescan_defadd', '0', 'В приходе по ТСД при двойном сканировании по умолчанию добавляем товар');В приходе по ТСД при двойном сканировании по умолчанию добавляем товар18.5.16.1INSERT INTO GLOBAL_OPTIONSteger; declare variable posprim varchar(100); declare variable date_exp date; BEGIN create_7=coalesce(create_7,0); create_7_pr=0; ignore_NO_IZLISH_FLAG=coalesce(ignore_NO_IZLISH_FLAG,0); if (((select coalesce(valid_flag,0) from bd_2 where field_key=:fk_bd2)=0) and(exists(select field_key from bd_21 where fk_bd_2=:fk_bd2))) then begin EXECUTE PROCEDURE SP_22_BY_21(:fk_bd2, 0); exit; end else begin --проводим расход select fk_bd_firm, cod_rash, date_rash, time_rash, nomer_rash, fk_bd_rash_pol, coalesce(IN_PRIH_CENA,0), fk_bd_kassa, coalesce(in_bd115_cena,0), bd_2.FK_RECIPIENT from bd_2 where field_key=:fk_bd2 into :fk_bd_firm, :cod_rash, :date_rash, :time_rash, :nomer_rash, :fk_bd_rash_pol, :in_prih_cena, :fk_bd_kassa, :in_115_cena, :fk_rec; if ((fk_bd_kassa is not null)or(cod_rash=7)) then ignore_no_izlish_flag=1; select coalesce(avtoPR_flag,0) from bd_firm where field_key=:fk_bd_firm into :avtoPR_flag; if (cod_rash=7) then is_vozvrat=1; else is_vozvrat=0; if (fk_user is null) then select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; delete from BD_21 where fk_bd_2=:fk_bd2; delete from BD_2_RESULTPROV where fk_bd_2=:fk_bd2; for select bd_22.field_key, fk_bd_tovar, fk_bd_tovar_mod, cnt, fk_bd_11, cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace, bd_22.SUMMA, bd_22.SUM_INPUT_MAN_FLAG, bd_22.AKC_FLAG, bd_22.SP_AKC_FLAG, bd_22.track_22, bd_22.FK_BD_ORDER_OUT_11, bd_22.prim, bd_22.date_exp from bd_22 join bd_tovar on bd_tovar.field_key=bd_22.fk_bd_tovar where fk_bd_2=:fk_bd2 and coalesce(BD_TOVAR.IS_USLUGA,0)=0 /*and coalesce(cnt,0)<>0 */ into :fk_bd_22, :fk_bd_tovar, :fk_bd_mod, :cnt_22, :fk_22_11, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :AKC_FLAG, :SP_AKC_FLAG, :track_22, :fk_bd_order_out_11, :posprim, :date_exp do begin --проведение обычного расхода if (coalesce(cod_rash,0)<>7) then begin select coalesce(sum(coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0)),0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) into :cnt_11_stock; summa_ost=summa_man; cnt_ost=cnt_22; cnt_11=0; for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.REZERV,0) from bd_11 where valid_flag=1 and fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar and stock>0 /*and stock-coalesce(rezerv,0)>0 */ and ((coalesce(:fk_bd_mod,0)=0) or (fk_bd_tovar_mod is null) or (fk_bd_tovar_mod=:fk_bd_mod) ) and ((coalesce(:fk_22_11,0)=0) or (bd_11.field_key=:fk_22_11)) and (date_prih<=:date_rash) and (bd_11.PRIORITY>0) order by priority desc, date_prih, fk_bd_1, bd_11.field_key into :fk_bd_11, :cnt_11, :cnt_reserv_11 do begin ---------------------------------------------работа с остатком партии -----------корректируем остаток партии с учетом резерва cnt_reserv_rec=0; if (cnt_reserv_11>0) then begin --уменьшаем остаток на общий резерв cnt_11=cnt_11-cnt_reserv_11; cnt_11_stock=cnt_11_stock-cnt_reserv_11; --находим резерв под получателя расхода cnt_reserv_rec=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel=:fk_rec and fk_bd_11=:fk_bd_11 and type_doc=4),0); --не учитываем ހезервы на производство при отгрузке (они только для заказа на производство) cnt_reserv_pr=coalesce((select sum(cnt) from BD_11_RESERV where fk_poluchatel is null and fk_bd_11=:fk_bd_11 and coalesce(type_doc,0)<>4),0); --увеличиваем остаток на резерв под данного получателя cnt_11=cnt_11+cnt_reserv_rec+cnt_reserv_pr; cnt_11_stock=cnt_11_stock+cnt_reserv_rec+cnt_reserv_pr; end -----------конец учета резервов if (cnt_11>=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; if (cnt_21<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_21*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (((cnt_ost-cnt_21)=0)and(summa_ost<>0)) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_21*cena_with_nds as decimal(15,3))+summa_ost; end if (cnt_21<>0) then insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds,fk_tovar_nabor_master, cnt_in_inplace, summa, SUM_INPUT_MAN_FLAG, akc_flag, sp_akc_flag,fk_bd_tovar_mod,fk_bd_order_out_11, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_21, :cena_with_nds, :cena_without_nds,:fk_tovar_nabor_master, :cnt_in_inplace, :summa_man, :man_flag, :akc_flag, :sp_akc_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim, :date_exp); cnt_ost=cnt_ost-cnt_21; --снимаем резерв по этой позиции if ((cnt_reserv_rec>0)and(cnt_11-cnt_reserv_reccnt_reserv_cancel) then begin update bd_11_reserv set cnt=cnt-:cnt_reserv_cancel where field_key=:fk_res; cnt_reserv_cancel=0; end else begin delete from bd_11_reserv where field_key=:fk_res; cnt_reserv_cancel=cnt_reserv_cancel-cnt_res; end if (cnt_reserv_cancel<=0) then break; end end --конец снятия резервов if (cnt_ost=0) then break; ----------------------------------конец работа с остатком партии end create_7_pr=0; if ((cnt_ost>0)/*and(CREATE_7=0)*/) then --не все распределилось по приходам-пытаемся произвести автопроизводством, если на остатках достаточно сырья begin cnt_pr_prod=0; FK_BD_Ttk_AVTOPR=null; select first 1 bd_calc.field_key from bd_calc where bd_calc.fk_bd_tovar=:fk_bd_tovar and bd_calc.valid_flag=1 and coalesce(bd_calc.is_sbor,0)=1 and coalesce(bd_calc.arhive_flag,0)=0 into :FK_BD_Ttk_AVTOPR; if ((FK_BD_Ttk_AVTOPR is not null)and(avtoPR_flag=1)) then begin create_7_pr=1; --проверяем остаток сырья cnt_avtopr=cnt_ost; for select sp.fk_bd_11, sp.cnt_11, sp.man_flag, sp.summa_man from sp_avtopr(:fk_bd_tovar, :FK_BD_Ttk_AVTOPR, :cnt_avtopr, :cnt_22, :fk_bd_firm, :fk_user, :lang, :FK_BD2, :date_rash, :summa_ost, :cena_with_nds) sp into :fk_bd_11, :cnt_11, :man_flag, :summa_man do begin --test insert into bd_dolgnost (name) values ('sp_avtopr('||:fk_bd_tovar||','||:FK_BD_Ttk_AVTOPR||','||:cnt_avtopr||','||:cnt_22||','||:fk_bd_firm|| --test ','||:fk_user||','|| :lang||','|| :FK_BD2||','|| :date_rash||','|| :summa_ost||','|| :cena_with_nds||') result ('||:fk_bd_11||','|| :cnt_11||','|| :man_flag||','|| :summa_man||')'); if (fk_bd_11 is not null) then begin if (cnt_11>cnt_avtopr) then cnt_avtopr=0; else cnt_avtopr=cnt_avtopr-cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost-:cnt_avtopr, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim, :date_exp); cnt_ost=:cnt_avtopr; end --(fk_bd_11 is not null) end end end --конец автопроизводства----------------------------------------------------------------------- if (cnt_ost>0) then --не все распределилось по приходам и автопроизводству begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ( ((create_7=1)or(create_7_pr=1)) and (fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then --если после автопроизводства все еще что-то не списалось begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по расходу №',:lang))||:nomer_rash, 1, :fk_user, 1, :fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, null, :cnt_ost, null, :track_22); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода if (cnt_ost<>cnt_22) then begin man_flag=0; summa_ost=summa_ost-cast(cnt_ost*cena_with_nds as decimal(15,2)); end else begin man_flag=1; summa_ost=0; end if (summa_ost<>0) then --если это последняя партия, и ей сумма вся не списывается, то прибавляем begin man_flag=1; summa_man=cast(cnt_ost*cena_with_nds as decimal(15,3))+summa_ost; end insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,AKC_FLAG, SP_AKC_FLAG, summa, SUM_INPUT_MAN_FLAG,fk_bd_tovar_mod,fk_bd_order_out_11, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:AKC_FLAG, :SP_AKC_FLAG,:summa_man, :man_flag,:fk_bd_mod,:fk_bd_order_out_11, :posprim, :date_exp); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||:result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках',:lang))||': '||(:cnt_11_stock+coalesce(:cnt_pr_prod,0))||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||:cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0)); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,(:cnt_11_stock+coalesce(:cnt_pr_prod,0)),(:cnt_22-:cnt_11_stock-coalesce(:cnt_pr_prod,0))); end end end else begin --возврат от получателя cnt_ost=cnt_22; cnt_11=0; --если в заголовке расхода есть ссылка на расход-основание, при проведении строки ищем, не превышено ли изначально отгруженное кол-во if ((fk_bd_rash_pol is not null)or(fk_bd_kassa is not null)or(checkstock7=1)) then begin if (fk_bd_rash_pol is not null) then begin CNT_FOR_VOZVRAT=coalesce((select sum(cnt+ --минус сумма уже возвращенных товаров (select coalesce(sum(cnt),0) from bd_21 join bd_2 on bd_2.FIELD_KEY=bd_21.FK_BD_2 where bd_21.FK_BD_TOVAR=:fk_bd_tovar and (:fk_bd_mod is null or fk_bd_tovar_mod=:fk_bd_mod) and bd_2.FK_BD_RASH_POL=:fk_bd_rash_pol) ) from bd_21 where bd_21.fk_bd_tovar=:fk_bd_tovar and fk_bd_2=:fk_bd_rash_pol),0); if (CNT_FOR_VOZVRAT=cnt_ost) then cnt_21=cnt_ost; else cnt_21=cnt_11; insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master,fk_bd_tovar_mod, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, (-1)*:cnt_21, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master,:fk_bd_mod, :posprim, :date_exp); cnt_ost=cnt_ost-cnt_21; if (cnt_ost=0) then break; end end -- (fk_bd_rash_pol is not null) if (cnt_ost>0) then --не все распределилось по приходам begin select coalesce(NO_IZLISH_FLAG,0) from bd_tovar where field_key=:fk_bd_tovar into :NO_IZLISH_FLAG; if ((CREATE_7=1)and(fk_22_11 is null) and ((:ignore_no_izlish_flag=1) or (:no_izlish_flag=0)) ) then begin --создаем излишки if (fk_bd_1_new is null) then begin --заголовок прихода fk_bd_1_new=gen_id(gen_bd_1_id,1); INSERT INTO BD_1 (field_key, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, TIME_PRIH, NOMER_NAKL, date_nakl, FK_SUPPLIER, COD_PRIH, COMM, VALID_FLAG, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_2_7, fk_selful) VALUES (:fk_bd_1_new, :fk_bd_firm,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:fk_bd_firm), :date_rash,:time_rash, (select TR_NAME from SP_TRANSLATE('ИЗЛИШКИ',:lang)), :date_rash, :fk_bd_firm, 7, (select TR_NAME from SP_TRANSLATE('Излишки по возврату №',:lang))||:nomer_rash, 1, :fk_user, 1,:fk_bd2, (select fk_selful from bd_firm where field_key=:fk_bd_firm)); insert into BD_2_1_IZL(fk_bd_1,fk_bd_2,id_trans,ts) values (:fk_bd_1_new, :fk_bd2, current_transaction, current_timestamp); end --срок годности - копируем из последнего прихода date_save=null; date_make=null; select first 1 date_save, date_make from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:fk_bd_tovar order by date_prih desc, fk_bd_1 desc, bd_11.field_key into :date_save, :date_make; date_make=current_date; if (date_save is null) then date_save=current_date+coalesce((select day_save from bd_tovar where field_key=:fk_bd_tovar),0); --создаем строку прихода fk_bd_11=gen_id(gen_bd_11_id,1); EXECUTE PROCEDURE SP_ADD_BD_11(:FK_BD_1_new, :FK_BD_11, :FK_BD_TOVAR, :fk_bd_mod, :cena_with_nds, 0, :cnt_ost); update bd_11 set date_save=:date_save, date_make=:date_make where field_key=:fk_bd_11; --привязываем к ней строку расхода insert into bd_21(fk_bd_2,fk_bd_11,fk_bd_22,cnt,cena_with_nds, cena_without_nds, fk_tovar_nabor_master, cnt_in_inplace,fk_bd_tovar_mod, prim, date_exp) values (:fk_bd2, :fk_bd_11, :fk_bd_22, :cnt_ost, :cena_with_nds, :cena_without_nds, :fk_tovar_nabor_master, :cnt_in_inplace,:fk_bd_mod, :posprim, :date_exp); end else begin select trim(name) from bd_tovar where field_key=:fk_bd_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('доступно для возврата',:lang))||': '||(cnt_11_stock)||', '||(select TR_NAME from SP_TRANSLATE('требуется',:lang))||': '||cnt_22||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||(cnt_22-cnt_11_stock); INSERT INTO BD_2_RESULTPROV (FK_BD_2, TXT_MSG, FK_BD_TOVAR, FK_BD_MOD, FK_BD_11, CNT_22, CNT_11, CNT_MINUS) VALUES (:FK_BD2,:result_txt,:FK_BD_TOVAR,:FK_BD_MOD,:fk_22_11,:CNT_22,:cnt_11_stock,(:cnt_22-:cnt_11_stock)); end end end fk_tovar_nabor_master=null; end --если расход в приходных ценах и это не возврат, меняем 22 на 21 if ((1 in (in_prih_cena,in_115_cena))and(coalesce(cod_rash,0)<>5)and (not exists(select * from bd_2_resultprov where fk_bd_2=:fk_bd2))) then begin if (exists(select field_key from bd_22 where fk_bd_2=:fk_bd2 and fk_bd_11 is not null)) then execute procedure SP_22_BY_21(:fk_bd2,1); else execute procedure SP_22_BY_21(:fk_bd2,0); end --работа с излишками - если после проведения расхода остались излишки с кол-вом>0 и остатком>0, то либо удаляем, либо распроводим позицииэ for select fk_bd_1 from BD_2_1_IZL where fk_bd_2=:fk_bd2 into :fk_bd_1 do begin update bd_11 set summa_with_nds=(cnt-stock)*cena_pr_with_nds, summa_without_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=(cnt-stock)*cena_pr_with_nds/(100.00+nds)*nds, cnt=(cnt-stock) where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt>=stock; update bd_11 set summa_with_nds=0*cena_pr_with_nds, summa_without_nds=0*cena_pr_with_nds/(100.00+nds)*100.00, summa_nds=0*cena_pr_with_nds/(100.00+nds)*nds, cnt=0 where fk_bd_1=:fk_bd_1 and cod_prih=7 and cnt>0 and stock>0 and cnt0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; --cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END^ SET TERM ; ^oldkey_str18.6.4.1SP_GET_CURRSTATE_FOR_ZAKPOL   kK m!CSET TERM ^ ; CREATE OR ALTER procedure SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, IN_PRIH_PRICE integer, ID_CENA integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME char(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, STOCK decimal(7,3), INS integer, FK_BD_11 integer, FULLNAME char(200), INPLACE decimal(7,3), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, SELF_STOCK decimal(7,3), AKC integer, ED_IZM_NAME char(30), OLDKEY type of column BD_TOVAR.OLDKEY_STR, PRIM11 varchar(200), TRACK_11 type of column BD_11.TRACK_11, REZERV decimal(7,3)) as declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); declare variable CURR_RESERV decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.00) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey_str, coalesce(bd_11.REZERV,0), track_11 from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey, :rezerv, :track_11 do BEGIN prim11=null decimal(7,2); declare variable HAS_STOCK integer; BEGIN ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey_str from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey_str from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; -- select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; /* if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end*/ stock=0; has_stock=0; rezerv=0; track_11=null; fk_bd_11=null; --остаток по партиям for select field_key, coalesce(stock,0)-coalesce(rezerv,0), coalesce(rezerv,0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into :fk_bd_11, :stock, :rezerv, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end --end for if (has_stock=0) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end end end END^ SET TERM ; ^oldkey_str18.6.4.1SP_GET_SPR_FOR_ZAKPOL  O =E+SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_U큍gN %_?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varM M/)UPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('razrub_cost_basic', '0', 'Себестоимость разруба пропорциональна базовой цене') MATCHING (PARAMNAME);razrub_cost_basic18.6.4.1GLOBAL_OPTIONS|L !7SET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY_STR, PRIM11 varchar(200), TRACK_11 varchar(30), REZERV decimal(7,3)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNTchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); declare variable NORMA_MIN decimal(15,4); declare variable FK_CENA_BASIC integer; declare variable SUMMA_1 decimal(14,4); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa_nds+doprash); --/iif(cnt_all>0,:cnt_all,1); select bd_calc.norma_min from bd_calc where field_key=:fk_ttk into :norma_min; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=coalesce((select first 1 (bd_22.cena_with_nds) from bd_22 where fk_bd_2=:fk_2),0); --cena_nds=:cena_prod/:norma_min; --/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END if (coalesce((select first 1 paramvalue from global_options where paramname='razrub_cost_basic'),0)=1) then begin select bd_firm.fk_bd_cena_basic from bd_firm where field_key=:id_skl into :fk_cena_basic; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.nds from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_bd_tovar, :nds do begin cena_nds=coalesce((select first 1 (bd_cpr_now.cena) from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena_basic),0); cena=:cena_nds/(100+:nds)*100; if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end update bd_11 set bd_11.cena_pr_with_nds=:cena_nds, bd_11.cena_pr_without_nds=:cena, bd_11.summa_with_nds=:summa_with_nds, bd_11.summa_without_nds=:summa_without_nds, bd_11.summa_nds=:summa_with_nds-:summa_without_nds where field_key=:fk_11; end select bd_1.sum_with_nds from bd_1 where bd_1.field_key=:fk_1 into :summa_1; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.nds, bd_11.cena_pr_with_nds from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_bd_tovar, :nds, :cena_nds do begin if (summa_1>0) then begin cena_nds=:cena_nds/:summa_1*:summa_nds; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=0; cena=0; end if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end update bd_11 set bd_11.cena_pr_with_nds=:cena_nds, bd_11.cena_pr_without_nds=:cena, bd_11.summa_with_nds=:summa_with_nds, bd_11.summa_without_nds=:summa_without_nds, bd_11.summa_nds=:summa_with_nds-:summa_without_nds where field_key=:fk_11; end end update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^учет Себестоимость разруба пропорциональна базовой цене18.6.12.1SP_CREATE_BY_PR_TTKRAZBORSER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 and bd_11.date_prih<=:dat order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^перекомпиляция18.6.12.1SP_CREATE_BY_PR_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB decimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); declare variable NORMA_MIN decimal(15,4); declare variable FK_CENA_BASIC integer; declare variable SUMMA_1 decimal(14,4); BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc from BD_pr where field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa_nds+doprash); --/iif(cnt_all>0,:cnt_all,1); select bd_calc.norma_min from bd_calc where field_key=:fk_ttk into :norma_min; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=coalesce((select first 1 (bd_22.cena_with_nds) from bd_22 where fk_bd_2=:fk_2),0); --cena_nds=:cena_prod/:norma_min; --/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END if (coalesce((select first 1 paramvalue from global_options where paramname='razrub_cost_basic'),0)=1) then begin select bd_firm.fk_bd_cena_basic from bd_firm where field_key=:id_skl into :fk_cena_basic; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.nds, bd_11.cnt from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_bd_tovar, :nds, :cnt do begin cena_nds=coalesce((select first 1 (bd_cpr_now.cena) from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena_basic),0); cena=:cena_nds/(100+:nds)*100; if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end update bd_11 set bd_11.cena_pr_with_nds=:cena_nds, bd_11.cena_pr_without_nds=:cena, bd_11.summa_with_nds=:summa_with_nds, bd_11.summa_without_nds=:summa_without_nds, bd_11.summa_nds=:summa_with_nds-:summa_without_nds where field_key=:fk_11; end select bd_1.sum_with_nds from bd_1 where bd_1.field_key=:fk_1 into :summa_1; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.nds, bd_11.cena_pr_with_nds, bd_11.cnt from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_bd_tovar, :nds, :cena_nds, :cnt do begin if (summa_1>0) then begin cena_nds=:cena_nds/:summa_1*:summa_nds; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=0; cena=0; end if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end update bd_11 set bd_11.cena_pr_with_nds=:cena_nds, bd_11.cena_pr_without_nds=:cena, bd_11.summa_with_nds=:summa_with_nds, bd_11.summa_without_nds=:summa_without_nds, bd_11.summa_nds=:summa_with_nds-:summa_without_nds where field_key=:fk_11; end end update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^Исправления18.6.15.1SP_CREATE_BY_PR_TTKRAZBOR  2@S S_E"CREATE TRIGGER TR_BD_CENA_AD FOR BD_CENA ACTIVE AFTER DELETE POSITION 0 AS BEGIN delete from BD_GRT_TOVAR_PRICE_DEF d where d.FK_BD_CENA=old.FIELD_KEY; ENDочистка цен по умолчанию на группу при удалении вида цены18.6.18.1CREATE TRIGGER TR_BD_CENA_AD2R } S!ALTER TRIGGER TR_BD_11_RESERV_STOCK ACTIVE BEFORE INSERT OR UPDATE POSITION 0 AS declare variable stock_11 decimal(8,3); declare variable cnt_old_reserv decimal(8,3); BEGIN if ((inserting or updating)and(new.type_doc=4) and(old.CNT is distinct from new.cnt)and( (inserting) or (old.fk_bd_11=new.fk_bd_11) )) then --проверка на превышение остатка по партии, если меняется количество begin stock_11=coalesce((select stock from bd_11 where field_key=new.FK_BD_11),0); cnt_old_reserv=coalesce((select sum(cnt) from BD_11_RESERV where fk_bd_11=new.fk_bd_11 and type_doc=4 and field_key<>new.FIELD_KEY),0); if (new.cnt>stock_11+cnt_old_reserv) then exception E_RESERV_11; end END18.6.18.1ALTER TRIGGER TR_BD_11_RESERV_STOCKQ =E+ SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_U5P i9?SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_INSER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 and bd_11.date_prih<=:dat order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, :date_make, iif(:day_save=0,null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^перекомпиляция18.6.15.1SP_CREATE_BY_PR 8 8W E&ALTER TABLE BD_FIRM ADD NOT_INSERT_DATESAVE_FLAG BOOLFIELD DEFAULT 0 ;ADD NOT_INSERT_DATESAVE_FLAG18.6.22.1BD_FIRM.V w Q%SET TERM ^ ; ALTER PROCEDURE SP_EXP_ZAK_TO_PRIH ( ID_ZAKAZ Varchar(1000), FK_FIRM Integer ) AS declare variable FKSUPP integer; declare variable DATE_PRIH date; declare variable FK_SPS1 integer; declare variable COD_PRIH varchar(1); declare variable DAY_CONS_PRIH integer; declare variable NDS_IN_PRICE_FLAG integer; declare variable FKTOV integer; declare variable CENANDS decimal(12,5); declare variable CENA_SPEC decimal(12,5); declare variable CENANONDS decimal(12,5); declare variable NDS decimal(4,2); declare variable IN_11 decimal(7,3); declare variable CNT_IN_11 decimal(7,3); declare variable YES_IN_11 decimal(7,3); declare variable FK1 integer; declare variable DAY_SAVE integer; declare variable INPLACE decimal(7,2); declare variable FK_USER integer; declare variable NPRIH integer; declare variable FK_ORDER_IN_1 integer; declare variable FK_PFIRM integer; declare variable SUM_TOV_11 decimal(7,3); declare variable SUM_TOV_O11 decimal(7,3); declare variable FK_BD_DOGOVOR integer; declare variable FK_SELFUL integer; begin if (id_zakaz is null) then exit; select first 1 field_key from bd_users where upper(login)=upper(current_user) into :fk_user; if (fk_firm is null) then select fk_bd_firm from bd_order_in_1 where field_key = :id_zakaz into :fk_firm; fk1=null; nprih=null; select coalesce(max(nomer_prih)+1,1) from bd_1 where (fk_bd_firm=:fk_firm) into :nprih; for select bd_order_in_11.fk_bd_tovar,bd_order_in_11.cena_pr_with_nds,bd_order_in_11.cena_pr_without_nds, bd_order_in_11.cnt, bd_order_in_11.IN_11, bd_tovar.nds, bd_order_in_1.date_delivery, bd_order_in_1.fk_supplier, bd_order_in_1.fk_pfirm_supplier, bd_tovar.day_save,bd_order_in_11.inplace, bd_order_in_1.field_key, (select sum(bd_order_in_11.in_11) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_ORDER_IN_1=bd_order_in_1.FIELD_KEY), BD_ORDER_IN_1.fk_bd_dogovor, bd_order_in_1.fk_selful from bd_order_in_11 join bd_order_in_1 on (bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1) MU  CA$INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('zaktoprih.notonlysps', '0', 'При переводе заказа поставщика в приход если в спец цены не заданы, брать по последней');При переводе заказа поставщика в приход если в спец цены не заданы, брать по последне18.6.18.1INSERT INTO GLOBAL_OPTIONS3T 3WS#ALTER TRIGGER TR_BD_TOVAR_AI ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS declare variable fk_bd_cena integer; declare variable cena DEC82; declare variable cur_cena DEC82; declare variable fk_user integer; BEGIN if ((inserting)or((updating) and (old.fk_grt is distinct from new.fk_grt))) then begin fk_user=(select field_key from bd_users where upper(login)=upper(current_user)); for select a.fk_bd_cena, a.cena from BD_GRT_TOVAR_PRICE_DEF a join bd_cena on bd_cena.FIELD_KEY=a.FK_BD_CENA where a.FK_BD_GRT_TOVAR=new.FK_GRT and coalesce(a.cena,0)>0 into :fk_bd_cena, :cena do begin if (updating) then cur_cena=coalesce((select a.cena from BD_CPR_NOW a where fk_bd_tovar=new.FIELD_KEY and fk_bd_cena=:fk_bd_cena),0); else cur_cena=0; if (cur_cena is distinct from :CENA) then insert into bd_cpr (fk_bd_tovar, fk_bd_cena, cena, last_date, last_time, operator, workplace, start_date, cena_pr, end_date, start_time, fk_bd_operation) values (new.FIELD_KEY, :fk_bd_cena, :CENA, current_date, current_time, :fk_user, 'cena_g',current_date,0,null, current_time, 0); end end ENDзаполняем только цены из списка существующих типов цен18.6.18.1ALTER TRIGGER TR_BD_TOVAR_AI ACTIVE join bd_tovar on (bd_tovar.field_key=bd_order_in_11.fk_bd_tovar) where (bd_order_in_11.fk_bd_order_in_1=:id_zakaz) and (bd_order_in_11.cnt>0) into :fktov, :cenands, :cenanonds, :cnt_in_11, :in_11, :nds, :date_prih, :fksupp, :fk_pfirm, :day_save, :inplace, :fk_order_in_1, :yes_in_11, :fk_bd_dogovor, :fk_selful do begin sum_tov_11=0; sum_tov_o11=0; select sum(bd_11.cnt) from bd_11 join bd_1 on (bd_1.field_key=bd_11.fk_bd_1) where bd_1.fk_order_in=:id_zakaz and bd_11.fk_bd_tovar=:fktov into :sum_tov_11; select sum(bd_order_in_11.cnt) from bd_order_in_11 where fk_bd_order_in_1=:id_zakaz and fk_bd_tovar=:fktov into :sum_tov_o11; sum_tov_11=coalesce(:sum_tov_11,0); sum_tov_o11=coalesce(:sum_tov_o11,0); -- if (coalesce(yes_in_11,0)=0) then in_11=cnt_in_11; -- yes_in_11=0; if ((sum_tov_o11-sum_tov_11)>0) then in_11=sum_tov_o11-sum_tov_11; cena_spec=0; /* select first 1 bd_sps1.field_key, coalesce(bd_sps1.cod_prih,2),coalesce(bd_sps1.day_cons_prih,0), coalesce(bd_sps1.nds_in_price_flag,0), BD_SPS11.CENA_PR from bd_sps1 join bd_sps11 on (bd_sps11.fk_bd_sps1=bd_sps1.field_key) where (bd_sps1.valid_flag=1) and (bd_sps1.fk_supplier=:fksupp) and (bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:fk_firm)) and (bd_sps11.fk_bd_tovar=:fktov) into :fk_sps1, :cod_prih, :day_cons_prih, :nds_in_price_flag, :cena_spec; */ if ((select max(coalesce(g.PARAMVALUE,0)) from GLOBAL_OPTIONS g where g.PARAMNAME='zaktoprih.notonlysps')='1') then select cena_pr_with_nds from SP_GET_TOV_CENA_PR(:fksupp,:fk_firm,:fktov,:fk_bd_dogovor,0,0) into :cena_spec; else select cena_pr_with_nds from SP_GET_TOV_CENA_PR(:fksupp,:fk_firm,:fktov,:fk_bd_dogovor,0,1) into :cena_spec; if (cena_spec>0) then begin cenands=cena_spec; cenanonds=cena_spec*100.00/(100+nds); end if (fk1 is null) then /*update or*/ insert into bd_1 (FK_BD_FIRM,NOMER_PRIH,DATE_NAKL,TIME_PRIH,NOMER_NAKL,DATE_PRIH,NOMER_SF,FK_SUPPLIER,FK_FACE,COD_PRIH,DAY_CONS_PRIH, COMM,DATE_SF,POST_FLAG,EXPORT_FLAG,VALID_FLAG,FK_BD_PFIRM,FK_BD_USERS,PRICE_NDS_FLAG,FK_BD_SF_IN,FK_SPS1,fk_order_in, elorin_flag, fk_selful) values (:fk_firm,:nprih ,:date_prih,current_time,null,current_date,null, :fksupp,null, coalesce(:cod_prih,2),coalesce(:day_cons_prih,0), 'Эксп. из заказа '||:id_zakaz,null,1,0,0,:fk_pfirm,:fk_user, :nds_in_price_flag,null, :fk_sps1, :fk_order_in_1, 5, :fk_selful) /*matching (FK_BD_FIRM,DATE_PRIH,FK_SUPPLIER,COD_PRIH,DAY_CONS_PRIH,FK_SPS1,fk_order_in)*/ returning (field_key) into :fk1; if (in_11>0) then insert into bd_11 (FK_BD_1,FK_BD_TOVAR,PRIORITY,NDS,DATE_SAVE,GTD,CENA_PR_WITH_NDS,CENA_PR_WITHOUT_NDS, CNT,SUMMA_WITH_NDS,SUMMA_WITHOUT_NDS,REZERV,INPLACE,/*STOCK,*/ARTICUL,FK_ZAKAZ_OUT, summa_nds) values (:fk1,:fktov,5,:nds,(case when (coalesce(:day_save,0)=0) then null else dateadd(DAY, coalesce(:day_save,0), current_date) end),null,:cenands,:cenanonds, :in_11,(:cenands*:in_11),cast((:cenands*:in_11*100.00/(100.00+:nds)) as decimal(15,2)),0,:inplace,/*:in_11,*/null,null, (:cenands*:in_11)-cast((:cenands*:in_11*100.00/(100.00+:nds)) as decimal(15,2))); end if (not exists(select bd_11.field_key from bd_11 where fk_bd_1=:fk1)) then delete from bd_1 where field_key=:fk1; if ((select sum(bd_11.cnt) from bd_11 join bd_1 on (bd_1.field_key=bd_11.fk_bd_1) where bd_1.fk_order_in=:id_zakaz)= (select sum(bd_order_in_11.cnt) from bd_order_in_11 where fk_bd_order_in_1=:id_zakaz) ) then update bd_order_in_1 set close_flag=1, valid_flag=1 where field_key =:id_zakaz; end^ SET TERM ; ^18.6.22.1ALTER PROCEDURE SP_EXP_ZAK_TO_PRIH MM/X #%'SET TERM ^ ; CREATE OR ALTER procedure SP_ADD_BD_11 ( FK_BD_1 integer, FK_BD_11 integer, FK_BD_TOVAR integer, FK_BD_TOVAR_MOD integer, CENA_PR_WITH_NDS decimal(12,5), CNT decimal(7,3), STOCK decimal(7,3), TRACK varchar(30) = null) as declare variable NDS type of column BD_11.NDS; declare variable DATE_SAVE type of column BD_11.DATE_SAVE; declare variable GTD type of column BD_11.GTD; declare variable CENA_PR_WITHOUT_NDS type of column BD_11.CENA_PR_WITHOUT_NDS; declare variable SUMMA_WITH_NDS type of column BD_11.SUMMA_WITH_NDS; declare variable SUMMA_WITHOUT_NDS type of column BD_11.SUMMA_WITHOUT_NDS; declare variable INPLACE type of column BD_11.INPLACE; declare variable ARTICUL type of column BD_11.ARTICUL; declare variable SUMMA_NDS type of column BD_11.SUMMA_NDS; declare variable DATE_MAKE type of column BD_11.DATE_MAKE; declare variable DAY_SAVE type of column BD_TOVAR.DAY_SAVE; declare variable FK_BD_FIRM integer; declare variable NO_DATESAVE integer; BEGIN for select nds, coalesce(day_save,0), gtd, inplace, articul from bd_tovar where field_key=:fk_bd_tovar into :nds, :day_save, :gtd, :inplace, :articul do begin date_save=current_date+day_save; date_make=current_date; select bd_1.fk_bd_firm, coalesce(bd_firm.not_insert_datesave_flag,0) from bd_1 join bd_firm on bd_1.fk_bd_firm=bd_firm.field_key where bd_1.field_key=:FK_BD_1 into :fk_bd_firm, :no_datesave; if (no_datesave=1) then begin date_save=null; date_make=null; end if (coalesce(CENA_PR_WITH_NDS,0)=0) then begin --находим приходную цену - последнюю приходную на складе, или на любом складе select first 1 cena_pr_with_nds from bd_11 where fk_bd_firm=:fk_bd_firm and fk_bd_tovar=:FK_BD_TOVAR and (:FK_BD_TOVAR_MOD is null or fk_bd_tovar_mod=:FK_BD_TOVAR_MOD) and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :cena_pr_with_nds; if (coalesce(CENA_PR_WITH_NDS,0)=0) then select first 1 cena_pr_with_nds from bd_11 where fk_bd_tovar=:FK_BD_TOVAR and (:FK_BD_TOVAR_MOD is null or fk_bd_tovar_mod=:FK_BD_TOVAR_MOD) and valid_flag=1 order by date_prih desc, fk_bd_1 desc, field_key desc into :cena_pr_with_nds; if (coalesce(CENA_PR_WITH_NDS,0)=0) then select first 1 bd_sps11.CENA_PR from bd_sps11 join bd_sps1 on bd_sps1.field_key=BD_SPS11.FK_BD_SPS1 join BD_GRT_FIRM_WEB on BD_GRT_FIRM_WEB.FK_BD_GRT_FIRM=BD_SPS1.FK_BD_GRT_FIRM and BD_GRT_FIRM_WEB.FK_BD_FIRM=:fk_bd_firm where fk_bd_tovar=:fk_bd_tovar and (:FK_BD_TOVAR_MOD is null or fk_bd_tovar_mod=:FK_BD_TOVAR_MOD) and valid_flag=1 order by nomer_spec into :cena_pr_with_nds; end if (coalesce(nds,0)=0) then nds=18; summa_with_nds=cena_pr_with_nds*cnt; summa_nds=summa_with_nds*nds/(100+nds); summa_without_nds=summa_with_nds-summa_nds; cena_pr_without_nds=cena_pr_with_nds*100/(100+nds); stock=coalesce(stock,cnt); INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, DATE_SAVE, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, INPLACE, ARTICUL, SUMMA_NDS, DATE_MAKE, FK_BD_TOVAR_MOD, stock, track_11) VALUES (:fk_bd_11,:fk_bd_1,:FK_BD_TOVAR,5,:NDS,:DATE_SAVE,:GTD,:CENA_PR_WITH_NDS,:CENA_PR_WITHOUT_NDS,:summa_with_nds,:SUMMA_WITHOUT_NDS, :CNT,:INPLACE,:ARTICUL,:SUMMA_NDS,:DATE_MAKE,:FK_BD_TOVAR_MOD, :stock, :track); end END^ SET TERM ; ^NO_DATESAVE18.6.22.1SP_ADD_BD_11ecimal(7,3); declare variable CENA_PROD decimal(12,5); declare variable SUM_PROC_SEB decimal(7,3); declare variable NORMA_MIN decimal(15,4); declare variable FK_CENA_BASIC integer; declare variable SUMMA_1 decimal(14,4); declare variable NO_DATESAVE integer; BEGIN lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, coalesce(bd_firm.not_insert_datesave_flag,0) from BD_pr left join bd_firm on bd_pr.fk_bd_firm=bd_firm.field_key where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :no_datesave; -- razborTTK track_variant: 0 Товар не прослеживается, 1 Создать новый трек, 2 Использовать трек сырья, 3 Наследовать трек сырья summa=0; summa_nds=0; if (exists (select bd_pr_product.FK_BD_TOVAR --списание по производству from bd_pr_product where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select bd_pr_product.FK_BD_TOVAR, bd_pr_product.norma, field_key --недостачи from bd_pr_product where bd_pr_product.FK_PR=:id_pr and coalesce(bd_pr_product.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, bd_11.STOCK, coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN  BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, bd_11.STOCK, bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 order by bd_1.DATE_PRIH, bd_11.PRIORITY, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); cnt_all=coalesce((select sum(bd_22.cnt) from bd_22 where fk_bd_2=:fk_2),0); if ((select count(*) from bd_21 where fk_bd_2=:fk_2)=1) then select track_21 from bd_21 where fk_bd_2=:fk_2 into :track_prod; else track_prod=null; if (fk_ttk is not null) then begin -- select last_cena_pr from bd_tovar join bd_calc on bd_calc.fk_bd_tovar=bd_tovar.field_key where bd_calc.field_key=:fk_ttk into :cena_prod; cena_prod=(summa_nds+doprash); --/iif(cnt_all>0,:cnt_all,1); select bd_calc.norma_min from bd_calc where field_key=:fk_ttk into :norma_min; select sum(coalesce(procent_seb,0)) from bd_calc_component where fk_calc=:fk_ttk into :sum_proc_seb; end if (exists (select bd_pr_component.FK_BD_TOVAR --оприходование from bd_pr_component where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару for select fk_bd_tovar, coalesce(sum(norma),0) from bd_pr_component main where fk_pr=:id_pr group by 1 into :fk_tov_comp, :cnt_all do for select BD_PR_COMPONENT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,BD_PR_COMPONENT.inplace), BD_PR_COMPONENT.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_COMPONENT join bd_tovar on bd_tovar.field_key=BD_PR_COMPONENT.FK_BD_TOVAR where fk_pr=:id_pr and bd_pr_component.fk_bd_tovar=:fk_tov_comp and coalesce (BD_PR_COMPONENT.NORMA,0)>0 group by BD_PR_COMPONENT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, BD_PR_COMPONENT.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN if (fk_ttk is not null) then begin select track_variant, coalesce(procent_seb,0) from bd_calc_component where fk_calc=:fk_ttk and fk_bd_tovar=:fk_tov_comp into :track_variant, :procent_seb; if (sum_proc_seb=0) then begin cena_nds=coalesce((select first 1 (bd_22.cena_with_nds) from bd_22 where fk_bd_2=:fk_2),0); --cena_nds=:cena_prod/:norma_min; --/:cnt; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=(:cena_prod*:procent_seb/100.00)/:cnt; cena=:cena_nds/(100+:nds)*100; end end else track_variant=0; --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (by_nds='1') then begin summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, iif(:no_datesave=1,null,:date_make), iif((:day_save=0)or(:no_datesave=1),null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=:cnt-:inplace; end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, iif(:no_datesave=1,null,:date_make), iif((:day_save=0)or(:no_datesave=1),null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); cnt=0; end end end else begin if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, iif(:no_datesave=1,null,:date_make), iif((:day_save=0)or(:no_datesave=1),null,:date_make +:day_save), iif(:track_variant=3,:track_prod,null), iif(:track_variant=2,:track_prod,null)); end END if (coalesce((select first 1 paramvalue from global_options where paramname='razrub_cost_basic'),0)=1) then begin select bd_firm.fk_bd_cena_basic from bd_firm where field_key=:id_skl into :fk_cena_basic; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.nds, bd_11.cnt from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_bd_tovar, :nds, :cnt do begin cena_nds=coalesce((select first 1 (bd_cpr_now.cena) from bd_cpr_now where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena_basic),0); cena=:cena_nds/(100+:nds)*100; if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end update bd_11 set bd_11.cena_pr_with_nds=:cena_nds, bd_11.cena_pr_without_nds=:cena, bd_11.summa_with_nds=:summa_with_nds, bd_11.summa_without_nds=:summa_without_nds, bd_11.summa_nds=:summa_with_nds-:summa_without_nds where field_key=:fk_11; end select bd_1.sum_with_nds from bd_1 where bd_1.field_key=:fk_1 into :summa_1; for select bd_11.field_key, bd_11.fk_bd_tovar, bd_11.nds, bd_11.cena_pr_with_nds, bd_11.cnt from bd_11 where fk_bd_1=:fk_1 into :fk_11, :fk_bd_tovar, :nds, :cena_nds, :cnt do begin if (summa_1>0) then begin cena_nds=:cena_nds/:summa_1*:summa_nds; cena=:cena_nds/(100+:nds)*100; end else begin cena_nds=0; cena=0; end if (by_nds='1') then begin summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); end update bd_11 set bd_11.cena_pr_with_nds=:cena_nds, bd_11.cena_pr_without_nds=:cena, bd_11.summa_with_nds=:summa_with_nds, bd_11.summa_without_nds=:summa_without_nds, bd_11.summa_nds=:summa_with_nds-:summa_without_nds where field_key=:fk_11; end end update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; SUSPEND; END^ SET TERM ; ^NO_DATESAVE18.6.22.1SP_CREATE_BY_PR_TTKRAZBOR X\ W'*execute block AS DECLARE VARIABLE fk_r integer; DECLARE VARIABLE fk_user integer; BEGIN fk_r=(select field_key from BD_USERS_RIGHTS_NAME n where n.NAME_VAR='com_add'); for SELECT a.FIELD_KEY FROM BD_USERS a where not exists(select 1 from BD_USERS_RIGHTS b where b.TYPEOFRIGHTS='R' and b.TYPEOFRECORD='U' and b.FK_BD_USERSORGRT=a.field_key and b.FK_RIGHTS=:fk_r) into :fk_user do begin INSERT INTO BD_USERS_RIGHTS (FK_BD_USERSORGRT, TYPEOFRECORD, TYPEOFRIGHTS, FK_RIGHTS) VALUES (:fk_user, 'U', 'R', :fk_r); end ENDоткрываем права на создание приходов18.6.25.1execute blockL[ Eka+update or INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Создание прихода', 'com_add', (select field_key from bd_users_rights_name where name_var='comming')) matching (name_var);права на создание прихода18.6.25.1update or INSERT INTO BD_USERS_RIGHTS_NAMEEZ 3#+(SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7aY W#?)SET TERM ^ ; CREATE OR ALTER procedure SP_CREATE_BY_PR_TTKRAZBOR ( ID_PR integer, CREATE_7 integer = 0, BY_NDS char(1) = '') returns ( FK_1 integer, FK_2 integer, RES varchar(100)) as declare variable DAT date; declare variable FK_BD_TOVAR integer; declare variable CENA decimal(8,2); declare variable CENA_NDS decimal(8,3); declare variable SUMMA_WITHOUT_NDS decimal(8,2); declare variable SUMMA_WITH_NDS decimal(8,2); declare variable CNT decimal(9,3); declare variable ID_SKL integer; declare variable ID_USER integer; declare variable FK_FACE integer; declare variable NDS integer; declare variable GTD varchar(26); declare variable ARTICUL varchar(20); declare variable INPLACE decimal(7,3); declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable FK_TOV_COMP integer; declare variable PROCENT_SEB d,3); declare variable SUMMA_NDS decimal(15,2); declare variable SUMMA decimal(15,2); declare variable DOPRASH decimal(15,2); declare variable CNT_ALL decimal(7,3); declare variable KOEF_ZAMENA type of column BD_TOVAR_ZAMENA.KOEF; declare variable FK_ZAMENA integer; declare variable DAY_SAVE integer; declare variable DATE_MAKE date; declare variable PO_TOVARU varchar(200); declare variable NE_HVATAET varchar(200); declare variable PROIZVODSTVO varchar(200); declare variable LANG varchar(2); declare variable FK_SMENA integer; declare variable NUM_OF_PACKAGES decimal(12,3); declare variable PRIM_PR type of column BD_PR.NAME_PR; declare variable FK_TTK integer; declare variable TRACK_VARIANT integer; declare variable FK_CMP integer; declare variable TRACK_PARENT varchar(30); declare variable FK_TOV_WITH_TRACK integer; declare variable CNT_IN_TRACK decimal(14,4); declare variable TRACK varchar(30); declare variable FK_11_TRACK_IN_BD_22 integer; declare variable TRACK_PROD varchar(30); declare variable PROSLEJ_TOVAR integer; declare variable UNITAR_TOVAR integer; declare variable TTK_IS_SBOR integer; declare variable NO_DATESAVE integer; BEGIN update bd_pr set valid_flag=1 where field_key=:id_pr; --ставим флаг Проведено у акта пр, это снимает по нему резервы, чтобы сырье могло списаться lang=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname = 'language'),'RU'); po_tovaru=(select TR_NAME from SP_TRANSLATE(' - по товару ',:lang)); ne_hvataet=(select TR_NAME from SP_TRANSLATE(' - не хватает: ',:lang)); proizvodstvo=(select TR_NAME from SP_TRANSLATE('Производство',:lang)); track_parent=null; date_make=coalesce((select max(date_make) from BD_PR_ZAKAZ join BD_PR_ZAKAZ_PR on BD_PR_ZAKAZ_PR.FK_BD_PR_ZAKAZ=BD_PR_ZAKAZ.FIELD_KEY and BD_PR_ZAKAZ_PR.FK_BD_PR=:id_pr),current_date); delete from bd_pr_resultprov where fk_bd_pr=:id_pr; res=''; select bd_pr.date_pr, bd_pr.fk_bd_firm, bd_pr.FK_BD_USERS, coalesce(bd_pr.DOPRASH,0), fk_bd_smena, name_pr, bd_pr.fk_bd_calc, bd_pr.pr_is_sbor, coalesce(bd_firm.not_insert_datesave_flag,0) from BD_pr left join bd_calc on bd_calc.field_key=bd_pr.fk_bd_calc left join bd_firm on bd_pr.fk_bd_firm=bd_firm.field_key where bd_pr.field_key=:id_pr into :dat, :id_skl, :id_user, :doprash, :fk_smena, :prim_pr, :fk_ttk, :ttk_is_sbor, :no_datesave; -- if (ttk_is_sbor=0) then begin for select fk_1, fk_2, res from sp_create_by_pr_ttkrazbor(:id_pr, :create_7, :by_nds) into :fk_1, :fk_2, :res do suspend; exit; end -- if (fk_ttk is not null) then begin select first 1 fk_bd_tovar, track_flag from bd_calc_component where fk_calc=:fk_ttk and track_variant is not null into :fk_tov_with_track, :track_variant; track_variant=coalesce(:track_variant,0); end else track_variant=0; -- sborTTK track_variant: 0 = генерация нового трека; 1 = продолжение трека; 2 = наследование трека summa=0; summa_nds=0; if (exists (select BD_PR_COMPONENT.FK_BD_TOVAR --списание по производству from BD_PR_COMPONENT where fk_pr=:id_pr)) THEN BEGIN fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_smena) VALUES (:fk_2,:proizvodstvo,(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_skl),Null, :dat,:id_skl,:fk_face,9, null, :id_user, :prim_pr, 0, null, null, null, :id_skl, null, 0, null, null,0,:fk_smena); END for select BD_PR_COMPONENT.FK_BD_TOVAR, norma, field_key --недостачи from BD_PR_COMPONENT where BD_PR_COMPONENT.FK_PR=:id_pr and coalesce(BD_PR_COMPONENT.NORMA,0)>0 into :fk_bd_tovar, :ost_rash, :fk_cmp do BEGIN ------- track inject ----->>-- if (exists(select field_key from bd_pr_component_track where bd_pr_component_track.fk_cmp=:fk_cmp)) then begin if (:fk_bd_tovar=:fk_tov_with_track) then begin if((select count(*) from bd_pr_component_track where fk_cmp=:fk_cmp)>1) then track_parent=null; else select first 1 bd_pr_component_track.track from bd_pr_component_track where fk_cmp=:fk_cmp into :track_parent; end for select track, cnt from bd_pr_component_track where fk_cmp=:fk_cmp into :track, :cnt_in_track do begin if (ost_rash<>0) then begin ost_rash=:ost_rash-:cnt_in_track; select first 1 field_key from bd_11 where fk_bd_firm=:id_skl and track_11=:track into :fk_11_track_in_bd_22; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT, fk_bd_11) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :cnt_in_track, :fk_11_track_in_bd_22); end else if (ost_rash<0) then ost_rash=0; end end --<<------ track inject ----- for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), coalesce(bd_11.CENA_PR_WITH_NDS,0), coalesce(bd_11.CENA_PR_WITHOUT_NDS,0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_bd_tovar and bd_11.PRIORITY>0 order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash>=ost) THEN BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost; end ELSE begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, fk_bd_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); summa=summa+ost_rash*cena; summa_nds=summa_nds+ost_rash*cena_nds; ost_rash=0; END end END for select fk_bd_tovar_zamena, koef from BD_TOVAR_ZAMENA join bd_11 on bd_11.FK_BD_TOVAR=BD_TOVAR_ZAMENA.FK_BD_TOVAR_ZAMENA and fk_bd_firm=:id_skl and bd_11.STOCK>0 and bd_11.VALID_FLAG=1 where fk_bd_tovar_in_calc=:fk_bd_tovar group by fk_bd_tovar_zamena, koef, BD_TOVAR_ZAMENA.PRIORITY order by BD_TOVAR_ZAMENA.PRIORITY desc into :fk_zamena, :koef_zamena do begin if (ost_rash<>0) then begin for select bd_11.field_key, coalesce(/*iif((stock-coalesce(REZERV,0)<0),0,*/stock/*-coalesce(rezerv,0))*/,0), bd_11.CENA_PR_WITH_NDS, bd_11.CENA_PR_WITHOUT_NDS from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where bd_1.VALID_FLAG<>0 and stock>0 and bd_1.FK_BD_FIRM=:id_skl and bd_11.FK_BD_TOVAR=:fk_zamena and bd_11.PRIORITY>0 and bd_11.date_prih<=:dat order by bd_11.PRIORITY desc, bd_1.DATE_PRIH, bd_1.FIELD_KEY, bd_11.FIELD_KEY into :fk_11, :ost, :cena_nds, :cena do BEGIN if (ost_rash<>0) then begin if (ost_rash/koef_zamena>=ost) THEN --в приходе остаток меньше или равен, чем нам требуется BEGIN INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost); summa=summa+ost*cena; summa_nds=summa_nds+ost*cena_nds; ost_rash=ost_rash-ost*koef_zamena; end ELSE begin --иначе если в приходе остаток больше, чем нам требуется INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_zamena, :ost_rash/:koef_zamena); summa=summa+ost_rash*cena/koef_zamena; summa_nds=summa_nds+ost_rash*cena_nds/koef_zamena; ost_rash=0; END end END end --закончили перебирать партии на остатках для одной замены end --если приходы кончились, а провели еще не все, то выдаем исключение и откатываем все назад if (ost_rash>0) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_tovar, CNT) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_bd_tovar, :ost_rash); ost_rash=0; end END -- execute procedure SP_BD2_PROV(:fk_2,:lang,:create_7,:id_user); update bd_21 set bd_21.CENA_WITH_NDS=cena_pr, bd_21.SUMMA=cnt*cena_pr, bd_21.CENA_WITHOUT_NDS=(bd_21.SUMMA*100/(100+nds))/cnt where fk_bd_2=:fk_2; execute procedure sp_22_by_21(:fk_2,1); summa_nds=coalesce((select sum(bd_22.SUMMA) from bd_22 where fk_bd_2=:fk_2),0); summa=coalesce((select sum(bd_22.SUMMA*100.00/(100+nds)) from bd_22 where fk_bd_2=:fk_2),0); if (exists (select BD_PR_PRODUCT.FK_BD_TOVAR --оприходование from BD_PR_PRODUCT where fk_pr=:id_pr)) THEN BEGIN fk_1=gen_id(GEN_BD_1_ID,1); INSERT INTO BD_1 (FIELD_KEY, FK_BD_FIRM, NOMER_PRIH, DATE_PRIH, NOMER_NAKL, DATE_NAKL, NOMER_SF, FK_SUPPLIER, FK_FACE, COD_PRIH, DAY_CONS_PRIH, COMM, DATE_SF, POST_FLAG, EXPORT_FLAG, VALID_FLAG, FK_BD_PFIRM, FK_BD_USERS, PRICE_NDS_FLAG, fk_bd_smena) VALUES (:fk_1,:id_skl,(select coalesce(max(bd_1.nomer_prih)+1,1) from bd_1 where bd_1.fk_bd_firm=:id_skl), :dat, :proizvodstvo, null, null, :id_skl, :fk_face, 8, null, :prim_pr, null, 0, 0, 0, null, :id_user, 1, :fk_smena); END --общая сумма --находим сумму последних приходных цен по каждому товару select coalesce(sum(norma),0) from BD_PR_PRODUCT main where fk_pr=:id_pr into :cnt_all; if (:track_variant=0) then begin track_parent=null; track_prod=null; end else if (:track_variant=1) then begin track_prod=:track_parent; track_parent=null; end if (:track_variant=2) then begin track_prod=null; end for select BD_PR_PRODUCT.FK_BD_TOVAR, sum(coalesce(norma,0)), --излишки BD_TOVAR.NDS, gtd, articul, iif(coalesce(bd_tovar.trace_unitar_flag,0)=1,1,bd_pr_product.inplace), bd_pr_product.number_of_packages, coalesce(BD_TOVAR.DAY_SAVE,0), coalesce(bd_tovar.trace_proslej_flag,0), coalesce(bd_tovar.trace_unitar_flag,0) from BD_PR_PRODUCT join bd_tovar on bd_tovar.field_key=BD_PR_PRODUCT.FK_BD_TOVAR where fk_pr=:id_pr and coalesce(BD_PR_PRODUCT.NORMA,0)>0 group by BD_PR_PRODUCT.FK_BD_TOVAR,BD_TOVAR.NDS, gtd, articul, 6, bd_pr_product.number_of_packages, BD_TOVAR.DAY_SAVE, bd_tovar.trace_proslej_flag, bd_tovar.trace_unitar_flag into :fk_bd_tovar, :cnt, :NDS, :gtd, :articul, :inplace, :num_of_packages, :day_save, :proslej_tovar, :unitar_tovar do BEGIN --заполняем приход --находим цену if (((proslej_tovar=1)or(unitar_tovar=1))and(cnt>:inplace)) then begin while (cnt>0) do begin if (cnt>:inplace) then begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*inplace; summa_without_nds=cena*inplace; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*inplace; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/inplace; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :inplace, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, iif(:no_datesave=1,null,:date_make), iif((:day_save=0)or(:no_datesave=1),null,:date_make +:day_save), :track_parent, :track_prod); cnt=:cnt-:inplace; end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds,iif(:no_datesave=1,null,:date_make), iif((:day_save=0)or(:no_datesave=1),null,:date_make +:day_save), :track_parent, :track_prod); cnt=0; end end end else begin if (cnt_all<>0) THEN --цена у каждой позиции будет своя с учетом пропорции приходных цен BEGIN --находим коэффициент пропорции по прих ценам if (by_nds='1') then begin cena_nds=(summa_nds+doprash)/cnt_all; cena=cena_nds*100/(100+nds); summa_with_nds=cena_nds*cnt; summa_without_nds=cena*cnt; end else begin cena=(summa+doprash)/cnt_all; summa_without_nds=cena*cnt; summa_with_nds=summa_without_nds/100.00*(100+nds); cena_nds=summa_with_nds/cnt; end END ELSE BEGIN cena_nds=0; cena=0; END INSERT INTO BD_11 (FIELD_KEY, FK_BD_1, FK_BD_TOVAR, PRIORITY, NDS, GTD, CENA_PR_WITH_NDS, CENA_PR_WITHOUT_NDS, SUMMA_WITH_NDS, SUMMA_WITHOUT_NDS, CNT, REZERV, INPLACE, /*STOCK,*/ ARTICUL, summa_nds, date_make, date_save, parent_track, track_11) VALUES (gen_id(GEN_BD_11_ID,1), :fk_1, :FK_BD_TOVAR, 5, :nds, --date_save ? :GTD, :cena_nds, :cena, :summa_with_nds, :summa_without_nds, :cnt, 0, :INPLACE, /*:cnt,*/ :ARTICUL, :summa_with_nds-:summa_without_nds, iif(:no_datesave=1,null,:date_make), iif((:day_save=0)or(:no_datesave=1),null,:date_make +:day_save), :track_parent, :track_prod); end END update bd_pr set fk_bd_1=:fk_1, fk_bd_2=:fk_2, valid_flag=1 where field_key=:id_pr; update bd_1 set valid_flag=1 where field_key=:fk_1; execute procedure sp_set_cena155(:fk_1); SUSPEND; END^ SET TERM ; ^NO_DATESAVE18.6.22.1SP_CREATE_BY_PR TZETL` 5W0SET TERM ^ ; ALTER PROCEDURE SP_CH_AND_DISC_REPORT ( IDCARD Varchar(30), DAT1 Date, DAT2 Date ) RETURNS ( LAST_MONTH Varchar(30), LAST_MONTH_SUM Decimal(15,2), VIEW_MONTH Varchar(30), DAT1B Date, DAT2B Date, VIEW_SUM Decimal(15,2), DETAIL_DATE Date, DETAIL_TIME Time, DETAIL_MAG Varchar(100), DETAIL_KASSA Char(20), DETAIL_BONUS Decimal(15,2), TOTAL_LAST_MONTH_SUM Decimal(15,2), TOTAL_VIEW_SUM _ M'/GRANT EXECUTE ON PROCEDURE sp_get_dolg_sf_frm TO "PUBLIC";права на хранимку18.7.14.1GRANT EXECUTE ^ 'e.SET TERM ^ ; CREATE or alter PROCEDURE sp_get_dolg_sf_frm ( fk_selful integer, fk_bd_firm integer, fk_bd_2 integer ) RETURNS ( summa_dolg decimal(15,2)) AS BEGIN if ((fk_bd_firm is null)and(fk_bd_2 is not null)) then select first 1 bd_2.fk_recipient, bd_firm.FK_SELFUL from bd_2 join bd_firm on bd_firm.FIELD_KEY=bd_2.FK_BD_FIRM where bd_2.FIELD_KEY=:fk_bd_2 into :fk_bd_firm, :fk_selful; for select ( coalesce(( select sum(summa_dolg) from bd_1 where fk_supplier=:fk_bd_firm and fk_selful=:fk_selful and fk_selful_from is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and coalesce(bd_1.cod_prih,0)<>9 ),0)-coalesce(( select sum(summa_dolg) from bd_2 where bd_2.fk_recipient=:fk_bd_firm and fk_selful=:fk_selful and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=5 ) ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:fk_bd_firm and KS_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=0 ),0))-(coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=:fk_bd_firm and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash not in (5,7)) ),0)-coalesce(( select sum(summa_dolg) from bd_2 where fk_recipient=:fk_bd_firm and fk_selful=:fk_selful and fk_selful2 is null and summa_dolg<>0 and dolgfromdate<='01.01.2099' and (cod_rash=7) ),0)-coalesce(( select sum(summa_dolg) from ks_1 where ks_1.valid_flag=1 and fk_bd_firm=:fk_bd_firm and ks_1.fk_selful=:fk_selful and summa_dolg<>0 and prih=1 ),0) ) from RDB$DATABASE into :summa_dolg do begin suspend; end END^ SET TERM ; ^хранимка по долгам контрагентов18.7.14.1CREATE or alter PROCEDURE sp_get_dolg_sf_frm"] Ia,update or INSERT INTO BD_USERS_RIGHTS_NAME (NAME, NAME_VAR, PARENT) VALUES ('Игнорировать фильтр по контрагенту', 'oplata_allrec', (select field_key from bd_users_rights_name where name_var='oplata')) matching (name_var);право игнорировать фильтр по контрагенту в оплатах18.7.6.1update or INSERT INTO BD_USERS_RIGHTS_NAMEDecimal(15,2), DETAIL_ENTER_TYPE Varchar(5), ID_CARD Varchar(30), DETAIL_NOMER_SH Char(20), DETAIL_FK_CH Integer ) AS declare variable DAT1A date; declare variable DAT2A date; declare variable bonus_percent integer; begin if (CHAR_LENGTH(:IDCARD)<7) then begin IDCARD='27000'||LPAD(:IDCARD, 7, '0'); end if (CHAR_LENGTH(:IDCARD)<12) then begin IDCARD='27000'||RIGHT(:IDCARD, 7); end ID_CARD=:IDCARD; TOTAL_LAST_MONTH_SUM=0; TOTAL_VIEW_SUM=0; --цикл с шагом по месяцам, на выходе дата первого и последнего дня месяца for select CAST ('01.'||EXTRACT(MONTH FROM d.dat)||'.'||EXTRACT(year FROM d.dat) AS date), DATEADD(day,-1,DATEADD(month,1,CAST('01.'||EXTRACT(MONTH FROM d.dat)||'.'||EXTRACT(year FROM d.dat) AS date))) from sp_get_period_true(:DAT1,:DAT2) d group by 1,2 into :DAT1A,:DAT2A do begin --название: месяц год за который начислено select NAME||' '||EXTRACT(year FROM :DAT2A) from SP_MES_NAME where SP_MES_NAME.field_key=EXTRACT(MONTH FROM :DAT1A) into :LAST_MONTH; bonus_percent=coalesce((select paramvalue from GLOBAL_OPTIONS where paramname='bonus_percent'),1); --сумма начисленных бонусов за месяц select coalesce(sum(bd_ch2.summa),0)/:bonus_percent from bd_ch2 where bd_ch2.idcard=:IDCARD and bd_ch2.date_close>=:DAT1A and bd_ch2.date_close<=:DAT2A into :last_month_sum; TOTAL_LAST_MONTH_SUM=:TOTAL_LAST_MONTH_SUM+:last_month_sum; --название: месяц год за который выводим сколько использовано select NAME||' '||EXTRACT(year FROM DATEADD(MONTH,1,:DAT1A)) from SP_MES_NAME where SP_MES_NAME.field_key=EXTRACT(MONTH FROM DATEADD(MONTH,1,:DAT1A)) into :VIEW_MONTH; --период дат за который считаем потраченные бонусы DAT1B=CAST('20.'||EXTRACT(MONTH FROM DATEADD(MONTH,1,:DAT1A))||'.'||EXTRACT(YEAR FROM DATEADD(MONTH,1,:DAT1A)) as DATE); DAT2B=CAST('19.'||EXTRACT(MONTH FROM DATEADD(MONTH,2,:DAT1A))||'.'||EXTRACT(year FROM DATEADD(MONTH,2,:DAT1A)) as DATE); --сумма за этот период VIEW_SUM=0; select coalesce(sum(bd_ch2.summa_bonus),0) from bd_ch2 where bd_ch2.idcard=:IDCARD and bd_ch2.date_close>=:DAT1B and bd_ch2.date_close<=:DAT2B into :VIEW_SUM; TOTAL_VIEW_SUM=:TOTAL_VIEW_SUM+:VIEW_SUM; for select bd_ch2.date_close,bd_ch2.time_close,bd_ch2.field_key,bd_ch2.nomer_sh, coalesce(BD_CH2.MANUALLY_DISCOUNT_INPUT,0),bd_firm.name,bd_kassa.name, coalesce(sum(bd_ch2.summa_bonus),0) from bd_ch2 left join bd_firm on bd_firm.field_key=bd_ch2.fk_bd_firm left join bd_kassa on bd_kassa.field_key=bd_ch2.fk_bd_kassa where bd_ch2.idcard=:IDCARD and bd_ch2.summa_bonus>0 and bd_ch2.date_close>=:DAT1B and bd_ch2.date_close<=:DAT2B group by 1,2,3,4,5,6,7 order by 1 into :detail_date, :detail_time,:DETAIL_FK_CH, :detail_nomer_sh, :detail_enter_type, :detail_mag, :detail_kassa, :detail_bonus do begin if (:detail_enter_type='0') then detail_enter_type=''; if (:detail_enter_type='1') then detail_enter_type='X'; suspend; end detail_date=null; detail_time=null; detail_mag='-'; detail_kassa=null; detail_bonus=null; detail_enter_type='-'; detail_nomer_sh=''; DETAIL_FK_CH=-1; if (:VIEW_SUM=0) then suspend; end end^ SET TERM ; ^процент бонусов для отчета брать из настройки18.7.14.1ALTER PROCEDURE SP_CH_AND_DISC_REPORT  s?d 7;4ALTER TABLE BD_FIRM ADD zakpost_by_currskl_flag BOOLFIELD;при заказе на этот склад всегда отображать ТСС18.7.18.1ALTER TABLE BD_FIRM ADD5c _G=3CREATE VIEW V_KS_SCHET_C ( FIELD_KEY, BEZNAL_FLAG, GRAY_FLAG, NAME, FK_SELFUL, RS, DEF, OLDKEY, FK_BD_BANK, N_PKO, N_RKO, N_PLP, IS_ARH_FLAG, FIO_KASSIR) AS SELECT a.FIELD_KEY, a.BEZNAL_FLAG, a.GRAY_FLAG, a.NAME, a.FK_SELFUL, a.RS, a.DEF, a.OLDKEY, a.FK_BD_BANK, a.N_PKO, a.N_RKO, a.N_PLP, a.IS_ARH_FLAG, a.FIO_KASSIR FROM KS_SCHET a join BD_USERS_RIGHTS r on a.FIELD_KEY=r.FK_RIGHTS and coalesce(r.TYPEOFRECORD,'')='U' and coalesce(r.TYPEOFRIGHTS,'')='C' and r.userLOGIN=current_user;доступные счета18.7.14.1CREATE VIEW V_KS_SCHET_C7b _K=2CREATE VIEW V_KS_SCHET_R ( FIELD_KEY, BEZNAL_FLAG, GRAY_FLAG, NAME, FK_SELFUL, RS, DEF, OLDKEY, FK_BD_BANK, N_PKO, N_RKO, N_PLP, IS_ARH_FLAG, FIO_KASSIR) AS SELECT a.FIELD_KEY, a.BEZNAL_FLAG, a.GRAY_FLAG, a.NAME, a.FK_SELFUL, a.RS, a.DEF, a.OLDKEY, a.FK_BD_BANK, a.N_PKO, a.N_RKO, a.N_PLP, a.IS_ARH_FLAG, a.FIO_KASSIR FROM KS_SCHET a join BD_USERS_RIGHTS r on a.FIELD_KEY=r.FK_RIGHTS and coalesce(r.TYPEOFRECORD,'')='U' and coalesce(r.TYPEOFRIGHTS,'')='E' and r.userLOGIN=current_user;счета-получатели18.7.14.1CREATE VIEW V_KS_SCHET_Ra yo;1CREATE VIEW V_BD_SELFUL ( FIELD_KEY, OW_RNKOD, OW_INN, OW_NAME, OW_ADRES, OW_DIR, OW_BUH, OW_PHONE, OW_LCREG, OW_LCSER, OW_LCNUM, OW_LCDATE, OW_LCEND, OW_LCORG, KPP, OGRN, OKPO, OKONH, KPP_STRUCT, N_SCHET_FACT, RS, FK_BD_BANK, N_PKO, N_RKO, N_PLP, OW_DIRDOLGNOST, OLDKEY, KS, PREFIX_DOGOVOR, OW_FACTADRES, NAME, KLADR_STRANA, KLADR_INDEX, KLADR_RGKOD, KLADR_RAYON, KLADR_NASPUNKT, KLADR_ULICA, KLADR_DOM, KLADR_KORPUS, KLADR_LITERA, KLADR_KVARTIRA, DIR_F, DIR_I, DIR_O, BUH_F, BUH_I, BUH_O, KLADR_GOROD, FULLNAME, FK_FORMA_BD9ACT, N_RASH_NAKL, PLAT_NDS_FLAG) AS SELECT a.FIELD_KEY, a.OW_RNKOD, a.OW_INN, a.OW_NAME, a.OW_ADRES, a.OW_DIR, a.OW_BUH, a.OW_PHONE, a.OW_LCREG, a.OW_LCSER, a.OW_LCNUM, a.OW_LCDATE, a.OW_LCEND, a.OW_LCORG, a.KPP, a.OGRN, a.OKPO, a.OKONH, a.KPP_STRUCT, a.N_SCHET_FACT, a.RS, a.FK_BD_BANK, a.N_PKO, a.N_RKO, a.N_PLP, a.OW_DIRDOLGNOST, a.OLDKEY, a.KS, a.PREFIX_DOGOVOR, a.OW_FACTADRES, a.NAME, a.KLADR_STRANA, a.KLADR_INDEX, a.KLADR_RGKOD, a.KLADR_RAYON, a.KLADR_NASPUNKT, a.KLADR_ULICA, a.KLADR_DOM, a.KLADR_KORPUS, a.KLADR_LITERA, a.KLADR_KVARTIRA, a.DIR_F, a.DIR_I, a.DIR_O, a.BUH_F, a.BUH_I, a.BUH_O, a.KLADR_GOROD, a.FULLNAME, a.FK_FORMA_BD9ACT, a.N_RASH_NAKL, a.PLAT_NDS_FLAG FROM BD_SELFUL a join BD_USERS_RIGHTS r on a.FIELD_KEY=r.FK_RIGHTS and coalesce(r.TYPEOFRECORD,'')='U' and coalesce(r.TYPEOFRIGHTS,'')='U' and r.userLOGIN=current_user;вьюшка на доступные юрлица18.7.14.1CREATE VIEW V_BD_SELFUL n_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0), coalesce(bd_firm.zakpost_by_currskl_flag,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit, :zakpost_by_currskl_flag; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm =:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15,16 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (b d_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; track_11=null; stock=null; has_stock=0; fk_bd_11=null; if (sklad=1) then --транзитный склад begin maxcnt_ost=maxcnt; for select field_key, coalesce(stock-coalesce(rezerv,0),0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 into :fk_bd_11, :stock, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; suspend; end end --end for end if ((sklad=0)or(has_stock=0)) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end cnt=null; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; suspend; end END end end -- suspend; end ^ SET TERM ; ^ТСС независимо от транзитности склада-поставщика18.7.18.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK !<k Q;SET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTjwGI:ALTER TABLE BD_ORDER_IN_11 ADD track_11 Varchar(30);заказанный трек18.7.23.1ALTER TABLE BD_ORDER_IN_11 ADDi 7U9update or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('zakaz_by_track', '0', 'Заказ по треку') matching (paramname)объединение партий по треку (при заказе)18.7.23.1update or INSERT INTO GLOBAL_OPTIONS h}Y78ALTER TABLE BD_OPERAT ALTER "PASSWORD" TYPE Varchar(11);пароль кассира текст18.7.23.1ALTER TABLE BD_OPERATTg 1U7update or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ( 'tovar.add.def.matrix', '0', 'При создании товара автоматом помещаем его в матрицу текущего склада' ) matching (paramname)настройка18.7.18.1update or INSERT INTO GLOBAL_OPTIONSef A+U6update or INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ( 'tovar.add.in_price_flag', '0', 'Флажок "В прайсе" при создании ассортимента' ) matching (PARAMNAME)Флажок "В прайсе" при создании ассортимента18.7.18.1update or INSERT INTO GLOBAL_OPTIONSYe CQ5SET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30), TRACK_11 Varchar(30) ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; declare variable has_stock integer; declare variable zakpost_by_currskl_flag integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_i OCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30), TRACK_11 Varchar(30) ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; declare variable has_stock integer; declare variable zakpost_by_currskl_flag integer; declare variable zakaz_by_track integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0), coalesce(bd_firm.zakpost_by_currskl_flag,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit, :zakpost_by_currskl_flag; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15,16 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; track_11=null; stock=null; has_stock=0; fk_bd_11=null; if (sklad=1) then --транзитный склад begin maxcnt_ost=maxcnt; if (zakaz_by_track=1) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end for select sum(coalesce(stock-coalesce(rezerv,0),0)), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 group by bd_11.TRACK_11 into :stock, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select first 1 BD_ORDER_IN_11.cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and coalesce(BD_ORDER_IN_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; suspend; end end --end for end else begin for select field_key, coalesce(stock-coalesce(rezerv,0),0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 into :fk_bd_11, :stock, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; suspend; end end --end for end end --конец транзитного склада if ((sklad=0)or(has_stock=0)) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end cnt=null; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; suspend; end END end end -- suspend; end ^ SET TERM ; ^группировка по треку в подборе по транзитному складу (по настройке)18.7.23.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK  t mn  uS>SET TERM ^ ; ALTER PROCEDURE SP_SET_RESERV_BY_OO ( FK_ORDER_OUT Integer ) RETURNS ( FK_TOVAR Integer, NAME_TOVAR Char(100), CNT_ZAKAZ Decimal(15,3), CNT_STOCK Decimal(15,3), CNT_MINUS Decimal(15,3) ) AS DECLARE VARIABLE fk_rec integer; DECLARE VARIABLE fk_bd_firm integer; DECLARE VARIABLE rez_allow integer; DECLARE VARIABLE z_rez_flag integer; DECLARE VARIABLE lastdate date; DECLARE VARIABLE fk_oo11 integer; DECLARE VARIABLE fk_11 integer; DECLARE VARIABLE cnt_ost decimal(15,3); DECLARE VARIABLE curr_cnt_rezerv decimal(15,3); DECLARE VARIABLE fk_bd_11 integer; DECLARE VARIABLE fk_res integer; DECLARE VARIABLE cnt_res decimal(15,3); DECLARE VARIABLE track_11 varchar(30); declare variable zakaz_by_track integer; BEGIN select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); if (zakaz_by_track=1) then begin^m oyK=SET TERM ^ ; ALTER PROCEDURE SP_SEND_ZAKPOST ( ID_ZAKAZ Integer, LANG Varchar(2) DEFAULT 'RU' ) AS declare variable FK integer; declare variable FK_ZAK integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable FK_POST integer; declare variable DATE_ZAK date; declare variable DATE_DEL date; declare variable TIME_ZAK time; declare variable FK_TOVAR integer; declare variable KOLVO decimal(7,3); declare variable CENA_NDS decimal(lyGK0 and bd_11.PRIORITY>0 and valid_flag=1 and ((:fk_11 is null) or (:fk_11=field_key)) --либо конкретная партия не задана, либо если указана, берем только ее and ((:track_11='-1') or (coalesce(:track_11,'')=coalesce(track_11,''))) --либо не ищем по треку, либо если указан, берем только его order by date_prih, fk_bd_1 into :fk_bd_11, :stock do begin if (cnt_ost>0) then begin if (stock>cnt_ost) then begin INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,fk_poluchatel) VALUES (:fk_bd_11, :fk_o_11,:cnt_ost, 4, :fk, :fk_zak); cnt_ost=0; end else begin cnt_ost=cnt_ost-stock; INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,fk_poluchatel) VALUES (:fk_bd_11, :fk_o_11,:stock, 4, :fk, :fk_zak); end end end if (cnt_ost>0) then --Не все распределилось по приходам begin --сохраняем запись select trim(name) from bd_tovar where field_key=:fk_tovar into :result_txt; result_txt=(select TR_NAME from SP_TRANSLATE(' - по товару',:lang))||' '||result_txt||' - '||(select TR_NAME from SP_TRANSLATE('на остатках на базе с учетом резервов',:lang))||': '||(:kolvo-:cnt_ost)||', '||(select TR_NAME from SP_TRANSLATE(' в заказе',:lang))||': '||kolvo||', '||(select TR_NAME from SP_TRANSLATE('не хватает',:lang))||': '||cnt_ost; INSERT INTO BD_order_in_RESULTSEND (FK_BD_order_in_1, TXT_MSG, FK_BD_TOVAR, CNT_order_in, CNT_11, CNT_MINUS) VALUES (:ID_ZAKAZ,:result_txt,:FK_TOVAR,:kolvo,(:kolvo+:cnt_ost),:cnt_ost); end end END update bd_order_in_1 set SEND_FLAG=1, received_flag=1 where field_key=:id_zakaz; END END ^ SET TERM ; ^пересылка трека при заказе, резерв по треку если стоит настройка18.7.23.1ALTER PROCEDURE SP_SEND_ZAKPOST --проверяем совпадение установленных резервов с заказанными треками delete from BD_11_RESERV r where fk_doc=:FK_ORDER_OUT and not((select track_11 from bd_11 where field_key=r.FK_BD_11)=(select track_11 from BD_ORDER_OUT_11 o11 where field_key=r.fk_bd_order_out_11)); end --проверки на необходимость резервирования --if (exists(select first 1 field_key from BD_11_RESERV r where r.TYPE_DOC=4 and r.FK_DOC=:fk_order_out)) then exit; select oo.FK_RECIPIENT, oo.DATE_DELIVERY, coalesce(p.REZERV_ALLOW_FLAG,0), coalesce(f.ZAYAVKA_RESERV_FLAG,0), oo.FK_BD_FIRM from BD_ORDER_OUT_1 oo join bd_firm p on p.FIELD_KEY=oo.FK_RECIPIENT join bd_firm f on f.FIELD_KEY=oo.FK_BD_FIRM where oo.FIELD_KEY=:fk_order_out into :fk_rec, :lastdate, :rez_allow, :z_rez_flag, :fk_bd_firm; if (rez_allow=0) then exit; if (z_rez_flag=0) then exit; --резервируем for SELECT field_key, fk_bd_tovar, cnt, fk_bd_11, coalesce(cnt_reserv,0), track_11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_OUT_1=:fk_order_out INTO :fk_oo11, :fk_tovar, :cnt_zakaz, :fk_11, :curr_cnt_rezerv, :track_11 do BEGIN if (curr_cnt_rezerv0 and bd_11.PRIORITY>0 and valid_flag=1 order by date_prih, fk_bd_1 into :fk_bd_11, :cnt_stock do begin if (cnt_ost>0) then begin if (cnt_stock>cnt_ost) then begin INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,lastdate) VALUES (:fk_bd_11, :fk_oo11,:cnt_ost, 4, :fk_order_out, :lastdate); cnt_ost=0; end else begin cnt_ost=cnt_ost-cnt_stock; INSERT INTO BD_11_RESERV (FK_BD_11, FK_BD_ORDER_OUT_11, CNT, type_doc, fk_doc,lastdate) VALUES (:fk_bd_11, :fk_oo11,:cnt_stock, 4, :fk_order_out, :lastdate); end if (fk_11 is not null) then update BD_ORDER_OUT_11 set fk_bd_11_rezerv=:fk_11 where field_key=:fk_oo11; end end if (cnt_ost>0) then --Не все распределилось по приходам begin --сохраняем запись cnt_stock=coalesce(cnt_stock,0); select trim(name) from bd_tovar where field_key=:fk_tovar into :name_tovar; cnt_minus=cnt_ost; suspend; end end else begin --количество в заказе меньше, чем зарезервировано cnt_ost=curr_cnt_rezerv-cnt_zakaz; for select field_key, cnt from BD_11_RESERV r where r.fk_bd_order_out_11=:fk_oo11 into :fk_res, :cnt_res do begin if (cnt_ost>0) then begin if (cnt_res>cnt_ost) then begin update BD_11_RESERV set cnt=cnt-:cnt_ost where field_key=:fk_res; cnt_ost=0; end else begin delete from BD_11_RESERV where field_key=:fk_res; cnt_ost=cnt_ost-cnt_res; end end end end END END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE SP_SET_RESERV_BY_OO TO SYSDBA;перерезервирование по треку18.7.23.1ALTER PROCEDURE SP_SET_RESERV_BY_OOENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_sklad), null, :date_delivery, :id_rec, :fk_face, :cod_r, :d_cod_r, :fk_user, :prim, 0, null, null, null, :id_sklad, null, 0, :FK_PFIRM_REC, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_snoop_dogg); --перебираем все строки заказа --сначала переводим в расход строки с резервом cnt_so=0; rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, coalesce(r11.fk_bd_11,BD_ORDER_OUT_11.fk_bd_11), r11.fk_bd_11, bd_tovar.nds, bd_order_out_11.inplace, coalesce(bd_order_out_11.CNT_RASH,0), BD_ORDER_OUT_11.track_11 from BD_ORDER_OUT_11 left join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) left join BD_11_RESERV r11 on r11.FK_BD_ORDER_OUT_11=BD_ORDER_OUT_11.FIELD_KEY where fk_bd_out_1=:id_zakaz --and fk_bd_11_rezerv is null into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :rez, :nds, :inplace, :cnt_rash_cash, :track_11 do BEGIN --ost_rash - ищем, сколько уже отгружено по данной позиции cnt_otgr=0; if (withcnt=1) then /* select sum(cnt) from BD_22 where bd_22.fk_bd_order_out_11=:fk_o11 into :*/cnt_otgr=cnt_rash_cash; cnt_otgr=coalesce(cnt_otgr,0); ost_rash=ost_rash-cnt_otgr; --проверяем по остаткам если нехватает, проверим замены select sum(stock) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and stock>0 into :stock_tovar; if (coalesce(:stock_tovar,0)<:ost_rash) then begin for select sp.fk_tovar_zamena, sp.cnt_tovar_zamena, sp.koef, t.nds, t.inplace from sp_create_rash_checktov_zamena(:id_zakaz,:fk_o11,:ost_rash-coalesce(:stock_tovar,0)) sp join bd_tovar t on t.field_key=sp.fk_tovar_zamena into :fk_zamena, :cnt_zamena, :koef, :nds_z, :inplace_z do begin cena_z=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_zamena and fk_bd_cena=:fk_cena into :cena_z; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, null , :cena_z, :cena_z/(1+(coalesce(:nds_z,0)/100)), :cnt_zamena, :fk_o11, :fk_zamena, :inplace_z, :nds_z); cnt_so=cnt_so+cnt_zamena; ost_rash=:ost_rash-(:cnt_zamena*:koef); end if ((SET_CNT_BY_STOCK=1)and(ost_rash>coalesce(stock_tovar,0))) then ost_rash=coalesce(stock_tovar,0); end --актуализируем цены --только для расходных цен if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (rez is not null) then begin update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; end else begin fk_11_rezerv=null; end --заполняем расход -- 1. Rezerv or position from fk_bd_11 if ((withcnt=0)or(ost_rash>0)) then begin if ((fk_11_rezerv is not null)or(track_11 is null)) then --если стоят резервы, или трек партии не указан begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); cnt_so=cnt_so+ost_rash; ost_rash=0; delete from bd_11_reserv where bd_11_reserv.FK_BD_ORDER_OUT_11=:fk_o11; end else begin --track is null и резервы не стоят --перебор партий с указанным треком for select field_key, stock-coalesce(rezerv,0) from bd_11 a where fk_bd_firm=:id_sklad and valid_flag=1 and fk_bd_tovar=:fk_bd_tovar and track_11=:track_11 and stock>0 order by a.DATE_PRIH desc into :fk_11, :stock_11 do begin if (ost_rash>0) then begin if (stock_11>=ost_rash) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11 , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds); ost_rash=0; end else begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11 , :cena, :cena/(1+(coalesce(:nds,0)/100)), :stock_11, :fk_o11, :fk_bd_tovar, :inplace, :nds); ost_rash=ost_rash-stock_11; end end end end end rez=null; END if ((withcnt=0)or(cnt_so>0)) THEN BEGIN -- update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz; if (prov_bd_2_flag=1) then begin execute procedure sp_bd2_prov(:fk_2,'RU',coalesce(:tsd_check,0),:fk_user); if ((select count(*) from bd_2_resultprov r where r.fk_bd_2=:fk_2)>0) then begin delete from bd_21 where fk_bd_2=:fk_2; update bd_2 set valid_flag=0 where field_key=:fk_2; end end -- execute procedure sp_22_by_21(:fk_2,0); update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); -- END ELSE delete from BD_2 where field_key=:fk_2; --делаем разнесение --находим сумму расхода select sum(summa) from bd_21 where fk_bd_2=:fk_2 into :sum_doc; for select fk_ks_1, sum(summa) from ks_11 where fk_ks_1 is not null and coalesce(fo_order_out,0)=:ID_ZAKAZ group by fk_ks_1 into :fk_ks1, :sumraznes do BEGIN --находим сколько можем разнести по этой оплате select main.summa-coalesce((select sum(ks_11.summa) from ks_11 where ks_11.fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null and coalesce(ks_11.fk_bd_2,0)<>:fk_2),0) from ks_1 main where main.field_key=:fk_ks1 group by main.summa into :sum_ok; --сравниваем суммы sumraznes=minvalue(sumraznes,sum_ok,sum_doc); if (sumraznes>0) THEN BEGIN --создаем разнесение в этой же оплате по этому же расходу INSERT INTO KS_11 (FIELD_KEY, FK_KS_1, FK_BD_2, SUMMA) VALUES (gen_id(GEN_KS_11_ID,1), :FK_KS1, :FK_2, :sumraznes); sum_doc=sum_doc-sumraznes; END END END ^ SET TERM ; ^учет конретной партии резерва при переводе в расход, учет конкретного трека без установки резерва18.7.26.1ALTER PROCEDURE SP_CREATE_RASH 0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; -- select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; /* if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end*/ stock=0; has_stock=0; rezerv=0; track_11=null; fk_bd_11=null; --остаток по партиям if (zakaz_by_track=1) then------------------------------------------- begin--заказ по треку if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds); end for select sum(coalesce(stock-coalesce(rezerv,0),0)), sum(coalesce(rezerv,0)), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 group by bd_11.TRACK_11 into :stock, :rezerv, :track_11 do begin --контроль отображения остатка has_stock=1; cnt=null; select first 1 BD_ORDER_OUT_11.cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and coalesce(BD_ORDER_OUT_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; suspend; end --end for end else ------------------------------------------------------------------- begin for select field_key, coalesce(stock,0)-coalesce(rezerv,0), coalesce(rezerv,0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into :fk_bd_11, :stock, :rezerv, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end --end for end if (has_stock=0) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end end end END ^ SET TERM ; ^группировка по треку по настройке18.7.26.1ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOL GG)p g W@SET TERM ^ ; ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ Integer, ID_SKLAD Integer, ID_POL Integer, ID_PPOL Integer, ID_DOG Integer DEFAULT null ) RETURNS ( FK_BD_TOVAR Integer, NAME Varchar(100), CNT Float, CENA_NDS Float, CENA_NOT_NDS Float, SUMMA_NDS Float, SUMMA_NOT_NDS Float, INS Integer, STOCK Decimal(7,3), FK_BD_11 Integer, SELF_STOCK Decimal(7,3), FULLNAME Varchar(200), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, INPLACE Decimal(7,3), OLDKEY Integer, PRIM11 Varchar(200), TRACK_11 Varchar(30), REZERV Decimal(7,3) ) AS declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNT decimal(7,2); declare variable HAS_STOCK integer; declare variable zakaz_by_track integer; BEGIN select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), returning (field_key) into :fkaudit; if (old.fk_bd_firm is distinct from new.fk_bd_firm) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table) values (:fkaudit,'FK_BD_FIRM',old.FK_BD_FIRM,new.FK_BD_FIRM,'KS_1',:fk); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt, tablename, fk_table) values (:fkaudit,'FK_BD_FIRM',(select name from BD_FIRM where field_key=old.FK_BD_FIRM),(select name from BD_FIRM where field_key=new.FK_BD_FIRM),'Контрагент','KS_1',:fk); end if (old.FK_SELFUL is distinct from new.FK_SELFUL) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table) values (:fkaudit,'FK_SELFUL',old.FK_SELFUL,new.FK_SELFUL,'KS_1',:fk); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt, tablename, fk_table) values (:fkaudit,'FK_SELFUL',(select name from BD_SELFUL where field_key=old.FK_SELFUL),(select name from BD_SELFUL where field_key=new.FK_SELFUL),'Организация','KS_1',:fk); end if (old.FK_SELFUL2 is distinct from new.FK_SELFUL2) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table) values (:fkaudit,'FK_SELFUL2',old.FK_SELFUL2,new.FK_SELFUL2,'KS_1',:fk); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt, tablename, fk_table) values (:fkaudit,'FK_SELFUL2',(select name from BD_SELFUL where field_key=old.FK_SELFUL2),(select name from BD_SELFUL where field_key=new.FK_SELFUL2),'Организация - получатель платежа','KS_1',:fk); end if (old.PRIH is distinct from new.PRIH) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'PRIH',old.PRIH,new.PRIH,'KS_1',:fk,'Направление платежа'); /*if (old.prih=1) then oldprihstr='Приход'; if (old.prih=0) then oldprihstr='Расход'; if (old.prih=2) then oldprihstr='Внутренний'; if (new.prih=1) then newprihstr='Приход'; if (new.prih=0) then newprihstr='Расход'; if (new.prih=2) then newprihstr='Внутренний'; insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'PRIH',:oldprihstr,:newprihstr,'KS_1',:fk,'Направление платежа'); */ end if (old.DATE_CREATE is distinct from new.DATE_CREATE) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'DATE_CREATE',old.DATE_CREATE,new.DATE_CREATE,'KS_1',:fk,'Дата оплаты'); end if (old.summa is distinct from new.summa) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table, fieldnametxt) values (:fkaudit,'SUMMA',old.summa,new.summa,'KS_1',:fk,'Сумма оплаты'); end if (old.fk_ks_schet is distinct from new.fk_ks_schet) then begin insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue, tablename, fk_table) values (:fkaudit,'FK_KS_SCHET',old.fk_ks_schet,new.fk_ks_schet,'KS_1',:fk); insert into bd_audit_fields (fk_bd_audit, fieldname, oldvalue, newvalue,fieldnametxt, tablename, fk_table) values (:fkaudit,'SCHET',(select name from ks_schet where field_key=old.fk_ks_schet),(select name from ks_schet where field_key=new.fk_ks_schet),'Счет','KS_1',:fk); end end^ SET TERM ; ^fk_ks_schet18.7.26.1ks_1_audit1  tq ##ASET TERM ^ ; CREATE OR ALTER trigger ks_1_audit1 for ks_1 active after insert or update or delete position 31000 AS declare variable fkaudit type of column bd_audit_1.field_key; declare variable operation varchar(1); declare variable fk integer; declare variable gen_upd integer; declare variable cpr integer; declare variable oldprihstr varchar(50); declare variable newprihstr varchar(50); begin if (inserting) then begin operation='I'; fk=new.field_key; end if (updating) then begin operation='U'; fk=new.field_key; end if (deleting) then begin operation='D'; fk=old.field_key; end if ((operation='U')and (not((old.fk_bd_firm is distinct from new.fk_bd_firm)or(old.FK_SELFUL is distinct from new.FK_SELFUL)or (old.FK_SELFUL2 is distinct from new.FK_SELFUL2)or(old.PRIH is distinct from new.PRIH) or (old.DATE_CREATE is distinct from new.DATE_CREATE)or (old.summa is distinct from new.summa)or (old.fk_ks_schet is distinct from new.fk_ks_schet) ))) then exit; insert into bd_audit_1 (tablename, fk_table, operation, login, date_change, time_change) values ('KS_1',:fk,:operation,current_user,current_date,current_time) ) kontr, coalesce(f_schet.oldvalue,f_schet.newvalue) schet, coalesce(f_prih.oldvalue,f_prih.newvalue) prih FROM BD_AUDIT_1 left join BD_AUDIT_FIELDS on BD_AUDIT_FIELDS.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY left join BD_AUDIT_FIELDS f_sum on f_sum.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_sum.fieldname='SUMMA' left join BD_AUDIT_FIELDS f_kontr on f_kontr.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_kontr.fieldname=iif(:tablename='BD_1','SUPPLIER',IIF(:tablename='BD_2','RECIPIENT','FK_BD_FIRM'))and(f_kontr.fieldnametxt is not null) left join BD_AUDIT_FIELDS f_schet on f_schet.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_schet.fieldname='SCHET' left join BD_AUDIT_FIELDS f_prih on f_prih.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_prih.fieldname='PRIH' where BD_AUDIT_1.TABLENAME=:tablename and (coalesce(:fk_bd_firm,0) = (iif(coalesce(:fk_bd_firm,0)=0,coalesce(:fk_bd_firm,0),bd_audit_1.fk_main_field))) and date_change between :date_start and :date_end order by date_change+time_change desc, operation desc into :fk_table, :operation, :login, :date_edit, :dbtype, :summanew, :summaold, :kontr, :schet, :prih do suspend; end if ((date_start_copydb is not null)and(date_end_copydb>=date_start_copydb)) then begin /* отбор из архивной базы */ if (pass is not null) then begin FOR EXECUTE STATEMENT (:select_sql) (tablename:=:tablename, fk_bd_firm:=:fk_bd_firm, date_start:=:date_start_copydb, date_end:=:date_end_copydb) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :fk_table, :operation, :login, :date_edit, :dbtype, :summanew, :summaold, :kontr, :schet, :prih do suspend; end end end else begin if (date_end>=date_start) then begin /* отбор из рабочей базы */ FOR SELECT distinct BD_AUDIT_1.fk_table, case operation when 'I' then 1 when 'U' then 2 else 3 end as operation, login, date_change+time_change as date_edit, 1 as dbtype, f_sum.newvalue summanew, f_sum.oldvalue summaold, coalesce(f_kontr.oldvalue,f_kontr.newvalue) kontr, coalesce(f_schet.oldvalue,f_schet.newvalue) schet, coalesce(f_prih.oldvalue,f_prih.newvalue) prih FROM BD_AUDIT_1 left join BD_AUDIT_FIELDS on BD_AUDIT_FIELDS.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY left join BD_AUDIT_FIELDS f_sum on f_sum.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_sum.fieldname='SUMMA' left join BD_AUDIT_FIELDS f_kontr on f_kontr.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_kontr.fieldname=iif(:tablename='BD_1','SUPPLIER',IIF(:tablename='BD_2','RECIPIENT','FK_SELFUL2')) left join BD_AUDIT_FIELDS f_schet on f_schet.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_schet.fieldname='SCHET' left join BD_AUDIT_FIELDS f_prih on f_prih.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_prih.fieldname='PRIH' where BD_AUDIT_1.TABLENAME=:tablename and (coalesce(:fk_bd_firm,0) = (iif(coalesce(:fk_bd_firm,0)=0,coalesce(:fk_bd_firm,0),bd_audit_1.fk_main_field))) and date_change between :date_start and :date_end order by date_change+time_change desc, operation desc into :fk_table, :operation, :login, :date_edit, :dbtype, :summanew, :summaold, :kontr, :schet, :prih do suspend; end end when any do begin suspend; end end^ SET TERM ; ^вывод сумм18.7.26.1SP_AUDIT_ARHLOG_DATA ))Kr '35BSET TERM ^ ; CREATE OR ALTER procedure SP_AUDIT_ARHLOG_DATA ( DATE_START date, DATE_END date, TABLENAME varchar(31), FK_BD_FIRM integer, USERNAME char(31), PASS char(31)) returns ( FK_TABLE integer, OPERATION integer, LOGIN char(31), DATE_EDIT timestamp, DBTYPE integer, SUMMANEW varchar(250), SUMMAOLD varchar(250), KONTR varchar(250), SCHET varchar(250), PRIH varchar(250)) as declare variable DATE_END_FOR_PACK date; declare variable DATE_START_COPYDB date; declare variable DATE_END_COPYDB date; declare variable SELECT_SQL varchar(1000); declare variable CONNECT_STRING varchar(501); declare variable DB_SERVER varchar(250); declare variable DB_NAME varchar(250); begin if (exists(select paramname from global_options where upper(paramname)='DATE_PACK_AUDIT')) then begin date_end_for_pack=cast((select paramvalue from global_options where upper(paramname)='DATE_PACK_AUDIT') as date); date_start_copydb=null; date_end_copydb=null; if (username is null) then username=current_user; select paramvalue from global_options where upper(paramname)='SERVER_AUDIT_REZERV' into :db_server; if (db_server is null) then db_server='192.168.0.6'; select paramvalue from global_options where upper(paramname)='DBNAME_AUDIT_REZERV' into :db_name; if (db_name is null) then db_name='/home/mercury_audit_arh/mercury_audit.fdb'; connect_string = db_server||':'||db_name; select_sql = ' SELECT distinct BD_AUDIT_1.fk_table, case operation when ''I'' then 1 when ''U'' then 2 else 3 end as operation, login, date_change+time_change as date_edit, 1 as dbtype, f_sum.newvalue summanew, f_sum.oldvalue summaold, coalesce(f_kontr.oldvalue,f_kontr.newvalue) kontr, coalesce(f_schet.oldvalue,f_schet.newvalue) schet, coalesce(f_prih.oldvalue,f_prih.newvalue) prih FROM BD_AUDIT_1 left join BD_AUDIT_FIELDS on BD_AUDIT_FIELDS.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY left join BD_AUDIT_FIELDS f_sum on f_sum.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_sum.fieldname=''SUMMA'' left join BD_AUDIT_FIELDS f_kontr on f_kontr.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_kontr.fieldname=iif(:tablename=''BD_1'',''SUPPLIER'',IIF(:tablename=''BD_2'',''RECIPIENT'',''FK_SELFUL2'')) left join BD_AUDIT_FIELDS f_schet on f_schet.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_schet.fieldname=''SCHET'' left join BD_AUDIT_FIELDS f_prih on f_prih.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_prih.fieldname=''PRIH'' where BD_AUDIT_1.TABLENAME=:tablename and (coalesce(:fk_bd_firm,0) = (iif(coalesce(:fk_bd_firm,0)=0,coalesce(:fk_bd_firm,0),bd_audit_1.fk_main_field))) and date_change between :date_start and :date_end order by date_change+time_change desc, operation desc '; if (date_start<=:date_end_for_pack) then begin date_start_copydb=:date_start; date_start=:date_end_for_pack+1; end if (date_end<=:date_end_for_pack) then date_end_copydb=:date_end; else date_end_copydb=:date_end_for_pack; if (date_end>=date_start) then begin /* отбор из рабочей базы */ FOR SELECT distinct BD_AUDIT_1.fk_table, case operation when 'I' then 1 when 'U' then 2 else 3 end as operation, login, date_change+time_change as date_edit, 1 as dbtype, f_sum.newvalue summanew, f_sum.oldvalue summaold, coalesce(f_kontr.oldvalue,f_kontr.newvalue!r; if (db_server is null) then db_server='192.168.0.6'; select paramvalue from global_options where upper(paramname)='DBNAME_AUDIT_REZERV' into :db_name; if (db_name is null) then db_name='/home/mercury_audit_arh/mercury_audit.fdb'; connect_string = db_server||':'||db_name; sql_nomervalue='select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamenomer order by bd_audit_fields.field_key desc'; sql_datevalue=' select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamedate order by bd_audit_fields.field_key desc'; if (tablename='BD_1') then begin fnamenomer='NOMER_PRIH'; fnamedate='DATE_PRIH'; end if (tablename='BD_2') then begin fnamenomer='NOMER_RASH'; fnamedate='DATE_RASH'; end if (tablename='BD_9') then begin fnamenomer='NOMER_REV'; fnamedate='DATE_REV'; end if (tablename='BD_SPS1') then begin fnamenomer='NOMER_SPEC'; fnamedate='DATE_SPEC'; end select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamenomer order by bd_audit_fields.field_key desc into :NOMERVALUE; if (nomervalue is not null) then select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamedate order by bd_audit_fields.field_key desc into :DATEVALUE; /* if (nomervalue is null) then begin EXECUTE STATEMENT (:sql_nomervalue) (tablename:=:tablename, fk_doc:=:fk_doc, cod_operation:=:cod_operation, fnamenomer:=:fnamenomer) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :nomervalue; if (nomervalue is not null) then EXECUTE STATEMENT (:sql_datevalue) (tablename:=:tablename, fk_doc:=:fk_doc, cod_operation:=:cod_operation, fnamedate:=:fnamedate) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :datevalue; end */ if (nomervalue is not null) then begin result=:nomervalue||' от '||lpad(EXTRACT(DAY FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(MONTH FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(YEAR FROM :datevalue),4,'0'); nomer_doc=:nomervalue; date_doc=lpad(EXTRACT(DAY FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(MONTH FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(YEAR FROM :datevalue),4,'0'); suspend; end when any do begin -- result=select sp_translate 'Данные не найдены'; suspend; end end^ SET TERM ; ^nomer_doc date_doc18.7.26.1SP_AUDIT_DEL_DOC_DATA  u '7ESET TERM ^ ; CREATE OR ALTER procedure SP_AUDIT_DEL_DOC_DATA ( TABLENAME char(31), FK_DOC integer, USERNAME char(31), PASS varchar(31)) returns ( RESULT varchar(250), NOMER_DOC varchar(250), DATE_DOC varchar(250), KONTR varchar(250), PRIH varchar(250), SCHET varchar(250)) as declare variable DB_NAME varchar(250); declare variable DB_SERVER varchar(250); declare variable CONNECT_STRING varchar(501); declare variable FNAMENOMER char(31); declare variable FNAMEDATE char(31); declare variable COD_OPERATION char(1); declare variable NOMERVALUE integer; declare variable DATEVALUE date; declare variable SQL_NOMERVALUE varchar(1000); declare variable SQL_DATEVALUE varchar(1000); declare variable FNAMEKONTR varchar(10); declare variable FNAMEPRIH varchar(10); declare variable FNAMESCHET varchar(10); begin cod_operation='D'; if (username is null) then username=current_user; select paramvalue from global_options where upper(paramname)='SERVER_AUDIT_REZERV' into :db_server; if (db_server is null) then db_server='192.168.0.6'; select paramvalue from global_options where upper(paramname)='DBNAME_AUDIT_REZERV' into :db_name; if (db_name is null) then db_name='/home/mercury_audit_arh/mercury_audit.fdb'; connect_string = db_server||':'||db_name; sql_nomervalue='select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamenomer order by bd_audit_fields.field_key desc'; sql_datevalue=' select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamedate order by bd_audit_fields.field_key desc'; if (tablename='BD_1') then begin fnamenomer='NOMER_PRIH'; fnamedate='DATE_PRIH'; fnamekontr='SUPPLIER'; end if (tablename='BD_2') then begin fnamenomer='NOMER_RASH'; fnamedate='DATE_RASH'; fnamekontr='RECIPIENT'; 't ;)5DSET TERM ^ ; CREATE OR ALTER procedure SP_AUDIT_ARHLOG_DATA ( DATE_START date, DATE_END date, TABLENAME varchar(31), FK_BD_FIRM integer, USERNAME char(31), PASS char(31)) returns ( FK_TABLE integer, OPERATION integer, LOGIN char(31), DATE_EDIT timestamp, DBTYPE integer, SUMMANEW varchar(250), SUMMAOLD varchar(250), KONTR varchar(250), SCHET varchar(250), PRIH varchar(250)) as declare varia%bs U17CSET TERM ^ ; CREATE OR ALTER procedure SP_AUDIT_DEL_DOC_DATA ( TABLENAME char(31), FK_DOC integer, USERNAME char(31), PASS varchar(31)) returns ( RESULT varchar(250), NOMER_DOC varchar(250), DATE_DOC varchar(250)) as declare variable DB_NAME varchar(250); declare variable DB_SERVER varchar(250); declare variable CONNECT_STRING varchar(501); declare variable FNAMENOMER char(31); declare variable FNAMEDATE char(31); declare variable COD_OPERATION char(1); declare variable NOMERVALUE integer; declare variable DATEVALUE date; declare variable SQL_NOMERVALUE varchar(1000); declare variable SQL_DATEVALUE varchar(1000); begin cod_operation='D'; if (username is null) then username=current_user; select paramvalue from global_options where upper(paramname)='SERVER_AUDIT_REZERV' into :db_serve#&ble DATE_END_FOR_PACK date; declare variable DATE_START_COPYDB date; declare variable DATE_END_COPYDB date; declare variable SELECT_SQL varchar(1000); declare variable CONNECT_STRING varchar(501); declare variable DB_SERVER varchar(250); declare variable DB_NAME varchar(250); begin if (exists(select paramname from global_options where upper(paramname)='DATE_PACK_AUDIT')) then begin date_end_for_pack=cast((select paramvalue from global_options where upper(paramname)='DATE_PACK_AUDIT') as date); date_start_copydb=null; date_end_copydb=null; if (username is null) then username=current_user; select paramvalue from global_options where upper(paramname)='SERVER_AUDIT_REZERV' into :db_server; if (db_server is null) then db_server='192.168.0.6'; select paramvalue from global_options where upper(paramname)='DBNAME_AUDIT_REZERV' into :db_name; if (db_name is null) then db_name='/home/mercury_audit_arh/mercury_audit.fdb'; connect_string = db_server||':'||db_name; select_sql = ' SELECT distinct BD_AUDIT_1.fk_table, case operation when ''I'' then 1 when ''U'' then 2 else 3 end as operation, login, date_change+time_change as date_edit, 1 as dbtype, f_sum.newvalue summanew, f_sum.oldvalue summaold, coalesce(f_kontr.oldvalue,f_kontr.newvalue) kontr, coalesce(f_schet.oldvalue,f_schet.newvalue) schet, coalesce(f_prih.oldvalue,f_prih.newvalue) prih FROM BD_AUDIT_1 left join BD_AUDIT_FIELDS on BD_AUDIT_FIELDS.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY left join BD_AUDIT_FIELDS f_sum on f_sum.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_sum.fieldname=''SUMMA'' left join BD_AUDIT_FIELDS f_kontr on f_kontr.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_kontr.fieldname=iif(:tablename=''BD_1'',''SUPPLIER'',IIF(:tablename=''BD_2'',''RECIPIENT'',''FK_BD_FIRM'')) left join BD_AUDIT_FIELDS f_schet on f_schet.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_schet.fieldname=''SCHET'' left join BD_AUDIT_FIELDS f_prih on f_prih.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_prih.fieldname=''PRIH'' where BD_AUDIT_1.TABLENAME=:tablename and (coalesce(:fk_bd_firm,0) = (iif(coalesce(:fk_bd_firm,0)=0,coalesce(:fk_bd_firm,0),bd_audit_1.fk_main_field)))and(f_kontr.fieldnametxt is not null) and date_change between :date_start and :date_end order by date_change+time_change desc, operation desc '; if (date_start<=:date_end_for_pack) then begin date_start_copydb=:date_start; date_start=:date_end_for_pack+1; end if (date_end<=:date_end_for_pack) then date_end_copydb=:date_end; else date_end_copydb=:date_end_for_pack; if (date_end>=date_start) then begin /* отбор из рабочей базы */ FOR SELECT distinct BD_AUDIT_1.fk_table, case operation when 'I' then 1 when 'U' then 2 else 3 end as operation, login, date_change+time_change as date_edit, 1 as dbtype, f_sum.newvalue summanew, f_sum.oldvalue summaold, coalesce(f_kontr.oldvalue,f_kontr.newvalue) kontr, coalesce(f_schet.oldvalue,f_schet.newvalue) schet, coalesce(f_prih.oldvalue,f_prih.newvalue) prih FROM BD_AUDIT_1 left join BD_AUDIT_FIELDS on BD_AUDIT_FIELDS.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY left join BD_AUDIT_FIELDS f_sum on f_sum.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_sum.fieldname='SUMMA' left join BD_AUDIT_FIELDS f_kontr on f_kontr.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_kontr.fieldname=iif(:tablename='BD_1','SUPPLIER',IIF(:tablename='BD_2','RECIPIENT','FK_BD_FIRM'))and(f_kontr.fieldnametxt is not null) left join BD_AUDIT_FIELDS f_schet on f_schet.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_schet.fieldname='SCHET' left join BD_AUDIT_FIELDS f_prih on f_prih.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_prih.fieldname='PRIH' where BD_AUDIT_1.TABLENAME=:tablename and (coalesce(:fk_bd_firm,0) = (iif(coalesce(:fk_bd_firm,0)=0,coalesce(:fk_bd_firm,0),bd_audit_1.fk_main_field))) and date_change between :date_start and :date_end order by date_change+time_change desc, operation desc into :fk_table, :operation, :login, :date_edit, :dbtype, :summanew, :summaold, :kontr, :schet, :prih do suspend; end if ((date_start_copydb is not null)and(date_end_copydb>=date_start_copydb)) then begin /* отбор из архивной базы */ if (pass is not null) then begin FOR EXECUTE STATEMENT (:select_sql) (tablename:=:tablename, fk_bd_firm:=:fk_bd_firm, date_start:=:date_start_copydb, date_end:=:date_end_copydb) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :fk_table, :operation, :login, :date_edit, :dbtype, :summanew, :summaold, :kontr, :schet, :prih do suspend; end end end else begin if (date_end>=date_start) then begin /* отбор из рабочей базы */ FOR SELECT distinct BD_AUDIT_1.fk_table, case operation when 'I' then 1 when 'U' then 2 else 3 end as operation, login, date_change+time_change as date_edit, 1 as dbtype, f_sum.newvalue summanew, f_sum.oldvalue summaold, coalesce(f_kontr.oldvalue,f_kontr.newvalue) kontr, coalesce(f_schet.oldvalue,f_schet.newvalue) schet, coalesce(f_prih.oldvalue,f_prih.newvalue) prih FROM BD_AUDIT_1 left join BD_AUDIT_FIELDS on BD_AUDIT_FIELDS.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY left join BD_AUDIT_FIELDS f_sum on f_sum.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_sum.fieldname='SUMMA' left join BD_AUDIT_FIELDS f_kontr on f_kontr.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_kontr.fieldname=iif(:tablename='BD_1','SUPPLIER',IIF(:tablename='BD_2','RECIPIENT','FK_BD_FIRM'))and(f_kontr.fieldnametxt is not null) left join BD_AUDIT_FIELDS f_schet on f_schet.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_schet.fieldname='SCHET' left join BD_AUDIT_FIELDS f_prih on f_prih.FK_BD_AUDIT=BD_AUDIT_1.FIELD_KEY and f_prih.fieldname='PRIH' where BD_AUDIT_1.TABLENAME=:tablename and (coalesce(:fk_bd_firm,0) = (iif(coalesce(:fk_bd_firm,0)=0,coalesce(:fk_bd_firm,0),bd_audit_1.fk_main_field))) and date_change between :date_start and :date_end order by date_change+time_change desc, operation desc into :fk_table, :operation, :login, :date_edit, :dbtype, :summanew, :summaold, :kontr, :schet, :prih do suspend; end end when any do begin suspend; end end^ SET TERM ; ^ks_1 konragent18.7.27.1SP_AUDIT_ARHLOG_DATA end if (tablename='BD_9') then begin fnamenomer='NOMER_REV'; fnamedate='DATE_REV'; end if (tablename='BD_SPS1') then begin fnamenomer='NOMER_SPEC'; fnamedate='DATE_SPEC'; end if (tablename='KS_1') then begin fnamekontr='FK_BD_FIRM'; fnameprih='PRIH'; fnameschet='SCHET'; select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnameprih order by bd_audit_fields.field_key desc into :prih; select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnameschet order by bd_audit_fields.field_key desc into :schet; end select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamenomer order by bd_audit_fields.field_key desc into :NOMERVALUE; if (nomervalue is not null) then select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamedate order by bd_audit_fields.field_key desc into :DATEVALUE; if (fnamekontr is not null) then select first 1 coalesce(bd_audit_fields.newvalue,bd_audit_fields.oldvalue) from bd_audit_fields join bd_audit_1 on (bd_audit_1.field_key=bd_audit_fields.fk_bd_audit) where bd_audit_1.tablename=:tablename and bd_audit_1.fk_table=:fk_doc and bd_audit_1.operation=:cod_operation and bd_audit_fields.fieldname=:fnamekontr order by bd_audit_fields.field_key desc into :kontr; /* if (nomervalue is null) then begin EXECUTE STATEMENT (:sql_nomervalue) (tablename:=:tablename, fk_doc:=:fk_doc, cod_operation:=:cod_operation, fnamenomer:=:fnamenomer) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :nomervalue; if (nomervalue is not null) then EXECUTE STATEMENT (:sql_datevalue) (tablename:=:tablename, fk_doc:=:fk_doc, cod_operation:=:cod_operation, fnamedate:=:fnamedate) ON EXTERNAL connect_string AS USER :username PASSWORD :pass into :datevalue; end */ if (nomervalue is not null) then begin result=:nomervalue||' от '||lpad(EXTRACT(DAY FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(MONTH FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(YEAR FROM :datevalue),4,'0'); nomer_doc=:nomervalue; date_doc=lpad(EXTRACT(DAY FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(MONTH FROM :datevalue),2,'0')||'.'||lpad(EXTRACT(YEAR FROM :datevalue),4,'0'); suspend; end when any do begin -- result=select sp_translate 'Данные не найдены'; suspend; end end^ SET TERM ; ^deleted KONTR18.7.27.1SP_AUDIT_DEL_DOC_DATA)imal(15,2); declare variable SUM_OPL2 decimal(15,2); BEGIN ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=coalesce(:sum_opl1,0); if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; date_oper=null; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))|| nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; suspend; END --обороты за период --select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); if (kredit=0) then kredit=null; date_oper=null; suspend; --считаем итоговое сальдо razn=-coalesce((coalesce(:sum_opl1,0))+(abs(coalesce(:summa_real,0))-abs(coalesce(:summa_opl,0))),0); name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); date_oper=null; -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org||' '||RAZN||' руб.'; end ELSE txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org_client||' '||RAZN||' руб.'; id=null; date_oper=null; suspend; END^ SET TERM ; ^руб18.7.27.2SP_ACT_SVERKI { Bd2{3|  9LALTER TABLE BD_CH21 ADD SPEC_DISCOUNT_FLAG BOOLFIELD; ALTER TABLE BD_CH21 ALTER COLUMN SPEC_DISCOUNT_FLAG SET DEFAULT 0 ;#ADD SPEC_DISCOUNT_FLAG18.8.30.1BD_CH21{ qKALTER TABLE BD_TOVAR ADD SPIS DECIMAL(5,2); COMMENT ON COLUMN BD_TOVAR.SPIS IS 'Процент усушки';"SPIS18.8.8.2BD_TOVARz k5JALTER TABLE KS_1 ADD fk_bd_dogovor_dop Integer;!Доп договор для учета по проектам18.8.8.1ALTER TABLE KS_1 ADD y ;eI update bd_firm set fk_selful=null where coalesce(sklad,0)=0 and fk_selful is not null!set fk_selful=null where coalesce(sklad,0)=018.8.8.1bd_firm x kSQHSET TERM ^ ; ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30), TRACK_11 Varchar(30) ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD integer; declare variable ID_SE2dw %GQG ALTER PROCEDURE SP_GET_TOV_FOR_ZAK ( ID_ZAKAZ Integer, BY_MAX_NORM Integer DEFAULT 0 ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Decimal(7,3), CENA_NDS Decimal(12,5), CENA_NOT_NDS Decimal(12,5), SUMMA_NDS Decimal(12,5), SUMMA_NOT_NDS Decimal(12,5), STOCK Decimal(7,3), SELF_STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, ED_IZM_NAME Varchar(30), DATE_SAVE Date, NEXT_AKC Integer, SOLD Decimal(7,3), PRIH_CNT Decimal(7,3), LAST_PRIH_CNT Decimal(7,3), FACE_NAME Varchar(200), DATE_START_SPS1 Date, DATE_END_SPS1 Date, AKC Integer, DAY_ORDER Integer, LAST_ORDER_CNT Decimal(7,3), SCANCOD_MAIN Varchar(30), OLDKEY_STR Varchar(30), TRACK_11 Varchar(30) ) AS declare variable ID_DOGOVOR integer; declare variable ID_SKLAD inte+.v 'FSET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date, DATE_OPER date) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); declare variable SUM_OPL1 dec(,ger; declare variable ID_SELF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; declare variable has_stock integer; declare variable zakpost_by_currskl_flag integer; declare variable zakaz_by_track integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0), coalesce(bd_firm.zakpost_by_currskl_flag,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit, :zakpost_by_currskl_flag; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd-_tovar.scancod_main, bd_tovar.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5, 7,8,9,10,11,12,13 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end /* select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; */ cnt=null; select first 1 BD_ORDER_IN_11.cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and coalesce(BD_ORDER_IN_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 /join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin ------------------------------------------------------------ for select bd_tovar.inplace,bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, bd_11.field_key, bd_11.cena_pr_with_nds, bd_11.cena_pr_without_nds, ed_izm_name, date_save, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, scancod_main,oldkey_str, bd_11.TRACK_11, sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), --bd_tovar.field_key (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15,16 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_n0ds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxc1nt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; track_11=null; stock=null; has_stock=0; fk_bd_11=null; if (sklad=1) then --транзитный склад begin maxcnt_ost=maxcnt; if (zakaz_by_track=1) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end for select sum(coalesce(stock-coalesce(rezerv,0),0)), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 group by bd_11.TRACK_11 into :stock, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select first 1 BD_ORDER_IN_11.cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and coalesce(BD_ORDER_IN_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; suspend; end end --end for end else begin for select field_key, coalesce(stock-coalesce(rezerv,0),0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 into :fk_bd_11, :stock, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; suspend; end end --end for end end --конец транзитного склада if ((sklad=0)or(has_stock=0)) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end cnt=null; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; suspend; end END end end -- suspend; end группировка по треку при заказе только по остаткам18.7.30.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK3LF integer; declare variable CNTSPS integer; declare variable SKLAD integer; declare variable SPECPRIH integer; declare variable REZERV_ALLOW integer; declare variable TRANSIT integer; declare variable IFMINTHENMAX integer; declare variable SKL_LIT varchar(56); declare variable DAY_TORG_MANUALLY integer; declare variable fk_tovar_old integer; declare variable MAXCNT_OST decimal(7,3); declare variable fk_bd_cena integer; declare variable in_prih_price integer; declare variable nds integer; declare variable has_stock integer; declare variable zakpost_by_currskl_flag integer; declare variable zakaz_by_track integer; begin ifminthenmax=0; select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='ifminthenmax' into :ifminthenmax; ifminthenmax=coalesce(ifminthenmax,0); select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); ins=0; select bd_order_in_1.fk_bd_firm, bd_order_in_1.fk_supplier, bd_order_in_1.FK_BD_DOGOVOR, bd_firm.LITERAS, bd_order_in_1.day_torg_manually from bd_order_in_1 join bd_firm on bd_firm.FIELD_KEY=BD_ORDER_IN_1.FK_BD_FIRM where bd_order_in_1.field_key=:id_zakaz into :id_self, :id_sklad, :id_dogovor, :skl_lit, :day_torg_manually; select coalesce(bd_firm.sklad,0), coalesce(bd_firm.specprihod_flag,0), coalesce(bd_firm.rezerv_allow_flag,0), coalesce(bd_firm.TRANSIT_FLAG,0), coalesce(bd_firm.zakpost_by_currskl_flag,0) from bd_firm where field_key=:id_sklad into :sklad, :specprih, :rezerv_allow, :transit, :zakpost_by_currskl_flag; fk_bd_cena=null; select first 1 d.FK_BD_CENA_RASH, d.USE_PRIH_CENA from BD_DOGOVOR d where fk_recipient=:id_self and d.fk_bd_grt_firm in (select fk_bd_grt_firm from BD_GRT_FIRM_WEB w where w.FK_BD_FIRM=:id_sklad) and d.valid_flag=1 into :fk_bd_cena, :in_prih_price; if ((coalesce(in_prih_price,0)<>1)and(fk_bd_cena is null)) then in_prih_price=1; else in_prih_price=0; if (id_dogovor is not null) then --договор указан - спецухи без договора и по этому договору begin select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации ((fk_bd_dogovor=:id_dogovor) or (fk_bd_dogovor is null)) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) and (bd_sps1.valid_flag=1) into :cntsps; end else begin --договор не указан - спецухи все select count(*) from bd_sps1 join bd_sps11 on BD_SPS11.FK_BD_SPS1=bd_sps1.FIELD_KEY where (bd_sps1.fk_supplier=:id_sklad) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) -- and --если в заказе указан договор, то спецификации берем только по договору. иначе берем все спецификации -- ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null)) and (bd_sps1.valid_flag=1) --and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) into :cntsps; end if ((cntsps>0)) then begin --если в спецификации есть позиции, то разрешаем добавлять только из них for select bd_sps11.fk_bd_tovar, bd_tovar.name,fullname, cena_pr, cena_pr_without_nds,inplace, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, bd_tovar.scancod_main, bd_tova4r.oldkey_str, bd_tovar.nds from BD_SPS11 join bd_sps1 on bd_sps1.FIELD_KEY=BD_SPS11.fk_bd_sps1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_SPS11.FK_BD_TOVAR -- left join bd_11 on bd_11.FK_BD_FIRM=:id_self and bd_11.FK_BD_TOVAR=bd_sps11.FK_BD_TOVAR and bd_11.stock>0 and bd_11.VALID_FLAG=1 where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and((fk_supplier=:id_sklad) and ((fk_bd_dogovor=:id_dogovor) or (:id_dogovor is null) or (fk_bd_dogovor is null)) and ((bd_sps1.fk_bd_grt_firm in (select fk_bd_grt_firm from bd_grt_firm_web where fk_bd_firm=:id_self)) or (bd_sps1.fk_bd_grt_firm is null)) and (bd_sps1.valid_flag=1))and(coalesce(bd_sps11.STOP_ZAKAZ_FLAG,0)=0) order by bd_tovar.name into :fk_bd_tovar, :name,:fullname, :CENA_NDS, :CENA_not_NDS, :inplace, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc, :scancod_main,:oldkey_str, :nds do BEGIN cnt=0; self_stock=0; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select sum(coalesce(stock,0)), max(bd_11.date_save) from bd_11 where (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :self_stock, :date_save; if (sklad=1) then select sum(coalesce(stock,0)-coalesce(rezerv,0)) from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and (bd_11.valid_flag=1) and bd_11.PRIORITY>0 into :stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --акция наступит через три дня next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; --корректируем отображаемый остаток на базе согласно правам пользователя на заказ не более макс нормы if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5, 7,8,9,10,11,12,13 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end /* select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; */ cnt=null; select first 1 BD_ORDER_IN_11.cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and coalesce(BD_ORDER_IN_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIE6LD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end else begin ------------------------------------------------------------ for select bd_tovar.inplace,bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, bd_11.field_key, bd_11.cena_pr_with_nds, bd_11.cena_pr_without_nds, ed_izm_name, date_save, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc, scancod_main,oldkey_str, bd_11.TRACK_11, sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), --bd_tovar.field_key (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and valid_flag=1 and bd_11.PRIORITY>0) group by 1,2,3, 4, 5,6 ,7,8,9,10,11,12,13,14,15,16 order by 3,2 into :inplace, :fk_bd_tovar, :name,:fullname, :fk_bd_11,:cena_nds,:cena_not_nds, :ed_izm_name, :date_save, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :track_11, :stock, :self_stock, :nds do begin if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end select sum(cnt) from BD_ORDER_IN_11 where (BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar)and(bd_order_in_11.fk_bd_11=:fk_bd_11) and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; summa_nds=cnt*cena_nds; summa_n7ot_nds=cnt*cena_not_nds; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)) then begin if (fk_bd_tovar is distinct from fk_tovar_old) then begin --начался новый товар maxcnt_ost=maxcnt; end if (coalesce(maxcnt_ost,0)0) then suspend; end end end else begin for select bd_tovar.inplace, bd_tovar.field_key, bd_tovar.name, bd_tovar.fullname, ed_izm_name, bd_tovar.face_name, bd_tovar.date_start_sps1, bd_tovar.date_end_sps1, bd_tovar.akc,scancod_main,oldkey_str, min(bd_11.DATE_SAVE), sum(bd_11.stock-abs(coalesce(bd_11.REZERV,0))), (select sum(stock) from bd_11 where bd_11.fk_bd_firm=:id_self and bd_11.fk_bd_tovar=bd_tovar.field_key and stock>0 and valid_flag=1), max(bd_tovar.nds) from bd_11 join bd_tovar on (bd_tovar.field_key=bd_11.fk_bd_tovar) where (coalesce(:skl_lit,'')='' or exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=bd_tovar.field_key and mf.fk_bd_firm=:id_self join bd_matrix m on m.ZAKAZ_FLAG=1) /*:skl_lit containing BD_TOVAR.LITERA or BD_TOVAR.LITERA is null*/)and(bd_11.fk_bd_firm=:id_sklad and bd_11.fk_bd_tovar=bd_tovar.field_key and (bd_11.stock-abs(coalesce(bd_11.REZERV,0)))>0 and bd_11.VALID_FLAG=1 and bd_11.PRIORITY>0) group by 1,2,3,4,5,6,7,8,9,10,11 order by 3 into :inplace, :fk_bd_tovar, :name,:fullname, :ed_izm_name, :face_name, :date_start_sps1, :date_end_sps1, :akc,:scancod_main,:oldkey_str, :date_save, :stock, :self_stock, :nds do begin select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; select first 1 current_date-bd_order_in_1.date_order, cnt from BD_ORDER_IN_11 join bd_order_in_1 on bd_order_in_1.field_key=bd_order_in_11.fk_bd_order_in_1 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1<:id_zakaz and bd_order_in_1.fk_bd_firm=:id_self and bd_order_in_1.valid_flag=1 order by bd_order_in_1.date_order desc into :day_order, :last_order_cnt; cena_nds=0; cena_not_nds=0; if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dn8ey_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; --self_stock=0; next_akc=0; if (exists(select BD_SPS11.SET_AKC_FLAG from BD_SPS1 join bd_sps11 on BD_SPS1.FIELD_KEY=BD_SPS11.FK_BD_SPS1 where BD_SPS11.FK_BD_TOVAR=:fk_bd_tovar and BD_SPS11.SET_AKC_FLAG=1 and (current_date+1) between BD_SPS1.DATE_START and BD_SPS1.DATE_END and coalesce(bd_sps1.IS_ARH_SPEC,0)=0)) then next_akc=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt,0)0 and valid_flag=1 into self_stock; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; select minstock,mincnt,avgcnt,maxcnt,avtozak,avgrash,dney_torg,dney_last, sold, prih_cnt, last_prih_cnt from sp_getkoeftovar_new(:fk_bd_tovar, :id_self, :id_sklad, :self_stock, :ifminthenmax, :day_torg_manually) into :minstock,:mincnt,:avgcnt,:maxcnt,:avtozak,:avgrash,:dney_torg,:dney_last, :sold, :prih_cnt, :last_prih_cnt; if (coalesce(:day_torg_manually,0)>0) then avgrash=coalesce(:sold,0)/:day_torg_manually; track_11=null; stock=null; has_stock=0; fk_bd_11=null; if (sklad=1) then --транзитный склад begin maxcnt_ost=maxcnt; if (zakaz_by_track=1) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end for select sum(coalesce(stock-coalesce(rezerv,0),0)), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 group by bd_11.TRACK_11 into :stock, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select first 1 BD_ORDER_IN_11.cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and coalesce(BD_ORDER_IN_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; suspend; end end --end for end else begin for select field_key, coalesce(stock-coalesce(rezerv,0),0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 into :fk_bd_11, :stock, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if ((by_max_norm=1)and(coalesce(maxcnt,0)>0)and(coalesce(maxcnt_ost,0)0) then begin cnt=null; select cnt from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; suspend; end end --end for end end --конец транзитного склада if ((sklad=0)or(has_stock=0)) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_self) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_bd_cena),0)*(100-nds); end cnt=null; select sum(cnt) from BD_ORDER_IN_11 where BD_ORDER_IN_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_IN_11.FK_BD_ORDER_IN_1=:id_zakaz into :cnt; suspend; end END end end -- suspend; end^ SET TERM ; ^!корректировка по макс норме - отдельно к каждой партии18.8.8.1ALTER PROCEDURE SP_GET_TOV_FOR_ZAK:з приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2 into :cnt, :prim11 do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey_str from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; -- select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; /* if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end*/ stock=0; has_stock=0; rezerv=0; track_11=null; fk_bd_11=null; --остаток по партиям if (zakaz_by_track=1) then------------------------------------------- begin--заказ по треку if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds); end for select sum(coalesce(stock-coalesce(rezerv,0),0)), sum(coalesce(rezerv,0)), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 group by bd_11.TRACK_11 into :stock, :rezerv, :track_11 do begin --контроль отображения остатка has_stock=1; cnt=null; select first 1 BD_ORDER_OUT_11.cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and coalesce(BD_ORDER_OUT_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt; suspend; end --end for end else ------------------------------------------------------------------- begin for select field_key, coalesce(stock,0)-coalesce(rezerv,0), coalesce(rezerv,0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into :fk_bd_11, :stock, :rezerv, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select cnt from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end --end for end if (has_stock=0) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select sum(cnt) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz into :cnt; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; end end end END^ SET TERM ; ^$oldkey18.9.26.1SP_GET_SPR_FOR_ZAKPOL ii} 57MSET TERM ^ ; CREATE OR ALTER procedure SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ integer, ID_SKLAD integer, ID_POL integer, ID_PPOL integer, ID_DOG integer = null) returns ( FK_BD_TOVAR integer, NAME varchar(100), CNT float, CENA_NDS float, CENA_NOT_NDS float, SUMMA_NDS float, SUMMA_NOT_NDS float, INS integer, STOCK decimal(7,3), FK_BD_11 integer, SELF_STOCK decimal(7,3), FULLNAME varchar(200), MINSTOCK decimal(7,3), MINCNT decimal(7,3), AVGCNT decimal(7,3), MAXCNT decimal(7,3), AVTOZAK decimal(7,3), AVGRASH decimal(7,3), DNEY_TORG integer, DNEY_LAST integer, INPLACE decimal(7,3), OLDKEY type of column BD_TOVAR.OLDKEY_STR, PRIM11 varchar(200), TRACK_11 varchar(30), REZERV decimal(7,3)) as declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNT decimal(7,2); declare variable HAS_STOCK integer; declare variable ZAKAZ_BY_TRACK integer; BEGIN select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey_str from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество и9 OO-~ 3i7NSET TERM ^ ; CREATE OR ALTER procedure SP_GET_DOLG_UL_KONTR2 ( FK_SELFUL integer, DATE_DOLG date, FK_FIRM integer) returns ( SUMMA decimal(15,2)) as declare variable ID integer; declare variable DAT date; declare variable NOMER varchar(50); declare variable TYP_DOC integer; declare variable NAME_OPER varchar(200); declare variable RAZN decimal(15,2); declare variable DEBET decimal(15,2); declare variable KREDIT decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable SUMMA_REAL decimal(15,2); declare variable FK_DOC integer; declare variable DATE_OPER date; BEGIN for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))|| nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (bd_2.date_nakl < :date_dolg) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create < :date_dolg group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (bd_1.date_nakl < :date_dolg) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.cod_prih<>9 and bd_1.valid_flag=1 group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create < :date_dolg group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=coalesce(summa_opl,0)+coalesce(razn,0); end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; -- suspend; END name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); if (kredit=0) then kredit=null; date_oper=null; summa=:debet-:kredit; suspend; END^ SET TERM ; ^$исключить бонусный товар18.9.26.1SP_GET_DOLG_UL_KONTR2> ddog='all'; date_do=dat_do; dat_do_s=dat_do; select trim(BD_SELFUL.ow_name), BD_SELFUL.OW_BUH from BD_SELFUL where field_key=:fk_selful into :org, :fio_buh; select trim(bd_firm.NAME) from BD_FIRM where field_key=:fk_firm into :org_client; --остаток на начало и на конец -- сальдо --находим дебет - все расходы на начало /* select coalesce(sum(coalesce(bd_2.summa,0)),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_2.date_nakl<:dat_ot and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm into :summa_real; --находим кредит select coalesce(sum(coalesce(bd_11.SUMMA_WITH_NDS,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and bd_1.date_nakl<:dat_ot and bd_1.fk_selful=:fk_selful and bd_11.valid_flag=1 and bd_1.FK_supplier=:fk_firm into :summa_post; --находим разницу между входящими и исходящими оплатами select coalesce(sum(case when (prih=1) then coalesce(summa,0) else (-1)*coalesce(summa,0) end),0) from ks_1 where ks_1.prih in (1,0) and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) and fk_bd_firm=:fk_firm and ks_1.date_create<:dat_ot and FK_SELFUL=:fk_selful into :summa_opl; summa_opl=summa_real-summa_post+summa_opl;*/ select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:dat_ot, :fk_firm) into :sum_opl1; summa_opl=coalesce(:sum_opl1,0); if (summa_opl>0) then BEGIN debet=summa_opl; debet_n=summa_opl; kredit=0; END ELSE BEGIN kredit=(-1)*summa_opl; kredit_n=-summa_opl; debet=0; END summa_opl=0; date_oper=null; name_oper='Сальдо на '||SUBSTRING(dat_ot from 9 for 2)||'.'||SUBSTRING(dat_ot from 6 for 2)||'.'||SUBSTRING(dat_ot from 1 for 4); suspend; for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))|| nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key --join bd_firm on bd_firm.field_key=bd_2.fk_bd_firm where (bd_2.date_nakl between :dat_ot and :dat_do) and bd_2.fk_selful=:fk_selful and bd_2.FK_RECIPIENT=:fk_firm and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and (:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key --join bd_firm on bd_firm.field_key=bd_1.fk_bd_firm where (bd_1.date_nakl between :dat_ot and :dat_do) and bd_1.fk_selful=:fk_selful and bd_1.FK_supplier=:fk_firm and bd_1.cod_prih<>9 and bd_1.valid_flag=1 and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ks_1.FK_BD_FIRM=:fk_firm and date_create BETWEEN :dat_ot and :dat_do and(:ddog='all' or :ddog=coalesce(nomer_spec, '')||' от '||coalesce(EXTRACT(day from date_spec)||'.'|| EXTRACT(MONTH from date_spec)||'.'||EXTRACT(year from date_spec),'''')) group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=summa_opl+razn; end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; suspend; END --обороты за период --select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:dat_do, :fk_firm) into :sum_opl2; name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); if (kredit=0) then kredit=null; date_oper=null; suspend; --считаем итоговое сальдо razn=-coalesce((coalesce(:sum_opl1,0))+(abs(coalesce(:summa_real,0))-abs(coalesce(:summa_opl,0))),0); name_oper='Сальдо на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4); date_oper=null; -- razn=COALESCE(summa_opl,0)-coalesce(debet_n,0)-COALESCE(summa_real,0)+coalesce(kredit_n,0); if (razn>0) THEN BEGIN debet=null; kredit=RAZN; end ELSE BEGIN if (razn=0) THEN debet=null; ELSE debet=-razn; kredit=null; END -- suspend; --итоговая строка typ_doc=null; if (razn=0) THEN txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность отсутствует'; ELSE if (razn<0) then begin razn=-razn; txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org||' '||RAZN||' руб.'; end ELSE txt_itogo='на '||SUBSTRING(dat_do from 9 for 2)||'.'||SUBSTRING(dat_do from 6 for 2)||'.'||SUBSTRING(dat_do from 1 for 4)||' задолженность в пользу '||org_client||' '||RAZN||' руб.'; id=null; date_oper=null; suspend; END^ SET TERM ; ^$исключить бонусный товар18.9.26.1SP_ACT_SVERKI  c MC/PSET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_EGAIS_MARKCODE_ID; CREATE TABLE BD_EGAIS_MARKCODE ( FIELD_KEY INTEGER NOT NULL, FK_EDOCS INTEGER, ALCCODE VARCHAR(64), BREG_ID VARCHAR(50), MARKCODE VARCHAR(64), FSRAR_ID VARCHAR(50), SCANNED SMALLINT DEFAULT 0, NOT_EGAIS_MARKCODE SMALLINT DEFAULT 0 ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_EGAIS_MARKCODE ADD CONSTRAINT PK_BD_EGAIS_MARKCODE PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX BD_EGAIS_MARKCODE_IDX1 ON BD_EGAIS_MARKCODE (FK_EDOCS); CREATE INDEX BD_EGAIS_MARKCODE_IDX2 ON BD_EGAIS_MARKCODE (ALCCODE); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_EGAIS_MARKCODE_BI */ CREATE OR ALTER TRIGGER BD_EGAIS_MARKCODE_BI FOR BD_EGAIS_MARKCODE ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_egais_markcode_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_EGAIS_MARKCODE TO PUBLIC;%Акцизные марки18.10.5.1BD_EGAIS_MARKCODEk =i'OSET TERM ^ ; CREATE OR ALTER procedure SP_ACT_SVERKI ( FK_SELFUL integer, FK_FIRM integer, DAT_OT date, DAT_DO date) returns ( ORG varchar(100), FIO_BUH varchar(150), ORG_CLIENT varchar(100), NAME_OPER varchar(100), DEBET decimal(15,2), KREDIT decimal(15,2), TXT_ITOGO varchar(500), TXT_COMM varchar(1000), ID integer, TYP_DOC integer, FK_DOC integer, DATE_DO date, DATE_OPER date) as declare variable SUMMA_REAL decimal(15,2); declare variable SUMMA_POST decimal(15,2); declare variable SUMMA_OPL decimal(15,2); declare variable RAZN decimal(15,2); declare variable DAT date; declare variable NOMER varchar(50); declare variable DEBET_N decimal(15,2); declare variable KREDIT_N decimal(15,2); declare variable DAT_OT_S varchar(10); declare variable DAT_DO_S varchar(10); declare variable DDOG varchar(20); declare variable SUM_OPL1 decimal(15,2); declare variable SUM_OPL2 decimal(15,2); BEGIN =   r SU!1TSET TERM ^ ; CREATE trigger bd_91_bi0_cena_cpr for bd_91 active before insert position 0 AS declare variable id_cena integer; declare variable cena decimal(8,2); begin select bd_firm.fk_bd_cena_basic from bd_9 join bd_firm on bd_firm.field_key=bd_9.fk_bd_firm where bd_9.field_key=new.fk_bd_9 into :id_cena; select bd_cpr_now.cena from bd_cpr_now where fk_bd_cena=:id_cena and fk_bd_tovar=new.fk_bd_tovar into :cena; new.cena_cpr=:cena; end^ SET TERM ; ^'установка расх.цены (кеш) при вставке позиции в ревизию18.10.22.1bd_91_bi0_cena_cprVi%!SALTER TABLE BD_91 ADD CENA_CPR DECIMAL(15,2);'ADD CENA_CPR18.10.22.1BD_91u +5Rupdate bd_users_rights_name set parent=(select field_key from bd_users_rights_name where name_var='menu_retail') where name_var='restoran_menu'; update or insert into bd_users_rights_name (name,name_var,parent) values ('Меню ресторона (редактирование)','restoran_menu_edit',(select parent from bd_users_rights_name where name_var='restoran_menu')) matching(name_var);&Меню ресторона (редактирование)18.10.9.1bd_users_rights_name 5G/QSET TERM ^ ; CREATE OR ALTER trigger bd_egais_docs_ad0 for bd_egais_docs active after delete position 0 AS begin delete from bd_egais_doc_replies where fk_edocs=old.field_key; delete from bd_egais_formb_regs where fk_edocs=old.field_key; delete from bd_egais_nakl_facts where fk_edocs=old.field_key; delete from bd_egais_doc_rash_tovar where fk_edocs=old.field_key; delete from bd_egais_markcode where fk_edocs=old.field_key; end^ SET TERM ; ^%delete from bd_egais_markcode18.10.5.1bd_egais_docs_ad0 < 5!7VSET TERM ^ ; CREATE OR ALTER procedure SP_GET_DOLG_UL_KONTR2 ( FK_SELFUL integer, DATE_DOLG date, FK_FIRM integer) returns ( SUMMA decimal(15,2)) as declare variable ID integer; declare variable DAT date; declare variable NOMER varchar(50); declare variable TYP_DOC integer; declare variable NAME_OPER varchar(200); declare variable RAZN decimal(15,2); declare variable DEBET decimal(15,2); declare variable KREDIT decimal(15,2); declare variaB+ /g!5USET TERM ^ ; create or alter procedure SP_AKT_REV_SCHET_OST ( ID_REV integer, BEZNAL_FLAG smallint) returns ( SUMMA decimal(15,2)) as declare variable TO_DATE date; declare variable ID_SKL integer; declare variable SUM_PRIH decimal(15,2); declare variable SUM_RASH decimal(15,2); declare variable SUM_PRIH_SELF decimal(15,2); declare variable SUM_RASH_SELF decimal(15,2); begin select bd_9.date_rev, bd_9.fk_bd_firm from bd_9 where field_key=:id_rev into :to_date, :id_skl; select coalesce(sum(case when (prih=1) then summa else 0 end),0), coalesce(sum(case when (prih=0) then summa else 0 end),0) from ks_1 join bd_firm on bd_firm.field_key=ks_1.fk_sklad and bd_firm.field_key=:id_skl join ks_schet on ks_schet.field_key=ks_1.fk_ks_schet and ks_schet.fk_selful=bd_firm.fk_selful and ((coalesce(ks_schet.beznal_flag,0)=:beznal_flag)or(coalesce(:beznal_flag,2)=2)) where ks_1.DATE_CREATE<=:to_date and prih in (1,0) and ks_1.VALID_FLAG=1 into :sum_prih, :sum_rash; select coalesce(sum(summa),0) from ks_1 join bd_firm on bd_firm.field_key=ks_1.fk_sklad and bd_firm.field_key=:id_skl join ks_schet on ks_schet.field_key=ks_1.fk_ks_schet and ks_schet.fk_selful=bd_firm.fk_selful and ((coalesce(ks_schet.beznal_flag,0)=:beznal_flag)or(coalesce(:beznal_flag,2)=2)) where ks_1.DATE_CREATE<=:to_date and prih=2 and ks_1.VALID_FLAG=1 into :sum_rash_self; select coalesce(sum(summa),0) from ks_1 join bd_firm on bd_firm.field_key=ks_1.fk_sklad and bd_firm.field_key=:id_skl join ks_schet on ks_schet.field_key=ks_1.fk_ks_shet2 and ks_schet.fk_selful=bd_firm.fk_selful and ((coalesce(ks_schet.beznal_flag,0)=:beznal_flag)or(coalesce(:beznal_flag,2)=2)) where ks_1.DATE_CREATE<=:to_date and prih=2 and ks_1.VALID_FLAG=1 into :sum_prih_self; summa=sum_prih+sum_prih_self-sum_rash-sum_rash_self; suspend; end^ SET TERM ; ^ /* Following GRANT statetements are generated automatically */ GRANT SELECT ON BD_9 TO PROCEDURE SP_AKT_REV_SCHET_OST; GRANT SELECT ON KS_1 TO PROCEDURE SP_AKT_REV_SCHET_OST; GRANT SELECT ON BD_FIRM TO PROCEDURE SP_AKT_REV_SCHET_OST; GRANT SELECT ON KS_SCHET TO PROCEDURE SP_AKT_REV_SCHET_OST; /* Existing privileges on this procedure */ GRANT EXECUTE ON PROCEDURE SP_AKT_REV_SCHET_OST TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_AKT_REV_SCHET_OST TO SYSDBA;'процедура получения остатка на нал. счетах по ключю ревизии18.10.22.1SP_AKT_REV_SCHET_OSTble SUMMA_OPL decimal(15,2); declare variable SUMMA_REAL decimal(15,2); declare variable FK_DOC integer; declare variable DATE_OPER date; BEGIN for select bd_2.field_key, bd_2.date_nakl, cast(nomer_rash as VARCHAR(50)), '2', --расходы cast(iif(((bd_2.cod_rash=7) and (bd_21.summa>0)) or (bd_21.summa<0),'Возврат товаров от покупателя №',IIF(bd_2.cod_rash='5','Возврат поставщику №','Реализация товаров и услуг №'))|| nomer_rash||' от '||SUBSTRING(bd_2.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_2.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(iif((bd_2.cod_rash=7) and (bd_21.summa>0),-1*coalesce(bd_21.summa,0),coalesce(bd_21.summa,0))),0) from bd_2 join bd_21 on bd_21.fk_bd_2=bd_2.field_key where (bd_2.date_nakl < :date_dolg) and bd_2.fk_selful=:fk_selful and ((bd_2.FK_RECIPIENT=:fk_firm)or(coalesce(:fk_firm,0)=0)) group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '3', --оплаты входящие cast('Приходный кассовый ордер от '||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 join ks_schet on ks_schet.field_key=ks_1.FK_KS_SCHET where ks_1.prih=1 and KS_SCHET.FK_SELFUL=:fk_selful and ((ks_1.FK_BD_FIRM=:fk_firm)or(coalesce(:fk_firm,0)=0)) and date_create < :date_dolg group by 1,2,3,4,5 UNION --приходы select bd_1.field_key, coalesce(date_nakl, bd_1.date_nakl), cast(coalesce(nomer_nakl,nomer_prih) as varchar(50)) , '1', cast('Поступление товаров и услуг №'||nomer_prih||' от '||SUBSTRING(bd_1.date_nakl from 9 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 6 for 2)||'.'||SUBSTRING(bd_1.date_nakl from 1 for 4)||'' as VARCHAR(100)), coalesce(sum(coalesce(bd_11.summa_with_nds,0)),0) from bd_1 join bd_11 on bd_11.fk_bd_1=bd_1.field_key where (bd_1.date_nakl < :date_dolg) and bd_1.fk_selful=:fk_selful and ((bd_1.FK_supplier=:fk_firm)or(coalesce(:fk_firm,0)=0)) and bd_1.valid_flag=1 group by 1,2,3,4,5 UNION select ks_1.field_key, ks_1.date_create, cast(null as varchar(50)), '5', --оплаты исходящие cast('Расходный кассовый ордер от'||SUBSTRING(date_create from 9 for 2)||'.'||SUBSTRING(date_create from 6 for 2)||'.'||SUBSTRING(date_create from 1 for 4)||'' as VARCHAR(100)), coalesce(sum (coalesce (ks_1.summa,0)),0) from ks_1 where ks_1.prih=0 and FK_SELFUL=:fk_selful and ((ks_1.FK_BD_FIRM=:fk_firm)or(coalesce(:fk_firm,0)=0)) and date_create < :date_dolg group by 1,2,3,4,5 order by 2,3 into :id, :dat, :nomer, :typ_doc, :name_oper, :razn do BEGIN date_oper=:dat; if ((typ_doc=1)or(typ_doc=3)) THEN BEGIN debet=null; kredit=RAZN; summa_opl=coalesce(summa_opl,0)+coalesce(razn,0); end ELSE BEGIN debet=razn; kredit=null; summa_real=coalesce(summa_real,0)+coalesce(razn,0); END fk_doc=id; -- suspend; END name_oper='Обороты за период'; debet=/*abs(-coalesce(:sum_opl2,0)-coalesce(:sum_opl1,0)); --*/summa_real; --if (debet=0) then debet=null; kredit=abs(coalesce(:summa_opl,0)); --if (kredit=0) then kredit=null; date_oper=null; summa=:debet-:kredit; suspend; END^ SET TERM ; ^'чтобы можно было считать по всем контрагентам18.10.22.1SP_GET_DOLG_UL_KONTR2  t f u !CZALTER TABLE BD_ORDER_OUT_11 ADD cntinplace Integer;'18.10.22.1ALTER TABLE BD_ORDER_OUT_11]g !?YALTER TABLE BD_ED_IZM ADD calc_flag Integer;'18.10.22.1ALTER TABLE BD_ED_IZM ADD( q)!+XSET TERM ^ ; create or alter procedure SP_AKT_REV_DOLG ( ID_REV integer) returns ( SUMMA decimal(15,2)) as declare variable FK_SELFUL integer; declare variable ID_SKL integer; declare variable TO_DATE date; BEGIN select bd_9.date_rev+1, bd_9.fk_bd_firm, bd_firm.fk_selful from bd_9 join bd_firm on bd_firm.field_key=bd_9.fk_bd_firm where bd_9.field_key=:id_rev into :to_date, :id_skl, :fk_selful; select sum(summa) from sp_get_dolg_ul_kontr2(:fk_selful,:to_date, null) into :summa; suspend; END^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON BD_9 TO PROCEDURE SP_AKT_REV_DOLG; GRANT SELECT ON BD_FIRM TO PROCEDURE SP_AKT_REV_DOLG; GRANT EXECUTE ON PROCEDURE SP_GET_DOLG_UL_KONTR2 TO PROCEDURE SP_AKT_REV_DOLG; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE SP_AKT_REV_DOLG TO PROCEDURE SP_GET_NDS_GRP_TOVAR; GRANT EXECUTE ON PROCEDURE SP_AKT_REV_DOLG TO PROCEDURE SP_SPS_REPORT; GRANT EXECUTE ON PROCEDURE SP_AKT_REV_DOLG TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE SP_AKT_REV_DOLG TO SYSDBA;'долг по всем контрагентам по ключу ревизии18.10.22.1SP_AKT_REV_DOLG) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_not_nds; -- cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); -- cena_not_nds = coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); --находим количество из приходной накладной curr_reserv=coalesce((select cnt_reserv from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_11_REZERV=:fk_bd_11 and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz),0); stock=stock+curr_reserv; for select sum(cnt), BD_ORDER_OUT_11.prim11, BD_ORDER_OUT_11.cntinplace from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and fk_bd_11=:fk_bd_11 group by 2,3 into :cnt, :prim11, :cntinplace do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); END --если резерв по позиции заказа уже имеется, плюсуем его к остатку --если есть спецификация получателя, то цену берем из нее, и товар выводим только если он есть в спецификации if ((id_spr>0)) THEN BEGIN --находим цену на товар cena_nds=null; -- select cena from BD_SPR11 where fk_bd_tovar=:fk_bd_tovar and fk_bd_spr1=:id_spr into :cena_nds; select first 1 cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by bd_spr1.NOMER_CREATE into :cena_nds; if (cena_nds is not null) THEN BEGIN select cast(roundedcena as float) from round_rcena(:fk_bd_tovar, coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00)) into :cena_nds; --cena_nds = coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END END ELSE BEGIN --если берем приходную цену if (IN_PRIH_PRICE=1) THEN BEGIN summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; END ELSE BEGIN --иначе находим расходные цены -- if (opt=1) THEN -- BEGIN --берем цену из bd_115 -- cena_nds=null; -- select bd_115.cena_with_nds from bd_115 where fk_bd_11=:fk_bd_11 and fk_bd_cena=:id_cena into :cena_nds; -- cena_nds=coalesce(cena_nds,0)*nazskidka; -- cena_not_nds=cena_nds/(1+nds/100); -- summa_nds=cnt*cena_nds; -- summa_not_nds=cnt*cena_not_nds; -- suspend; -- end ELSE -- BEGIN --иначе берем цену из BD_CPR cena_nds=null; select bd_cpr.CENA from BD_CPR where bd_cpr.FK_BD_TOVAR=:fk_bd_tovar and BD_CPR.fk_bd_cena=:id_cena and current_timestamp between (start_date+start_time) and coalesce(end_date,current_timestamp+1) into :cena_nds; cena_nds=coalesce(cena_nds,0)*nazskidka; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; -- END END END END END ^ SET TERM ; ^'18.10.22.1ALTER PROCEDURE SP_GET_CURRSTATE_FOR_ZAKPOL   !c[SET TERM ^ ; ALTER PROCEDURE SP_GET_CURRSTATE_FOR_ZAKPOL ( ID_ZAKAZ Integer, ID_SKLAD Integer, ID_POL Integer, ID_PPOL Integer, IN_PRIH_PRICE Integer, ID_CENA Integer, ID_DOG Integer DEFAULT null ) RETURNS ( FK_BD_TOVAR Integer, NAME Char(100), CNT Float, CENA_NDS Float, CENA_NOT_NDS Float, SUMMA_NDS Float, SUMMA_NOT_NDS Float, STOCK Decimal(7,3), INS Integer, FK_BD_11 Integer, FULLNAME Char(200), INPLACE Decimal(7,3), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, SELF_STOCK Decimal(7,3), AKC Integer, ED_IZM_NAME Char(30), OLDKEY Integer, PRIM11 Varchar(200), TRACK_11 Varchar(30), REZERV Decimal(7,3), CNTINPLACE integer ) AS declare variable NDS integer; declare variable ID_SPR integer; declare variable OPT integer; declare variable SELF_SKLAD integer; declare variable NAZSKIDKA decimal(6,4); declare variable MARGIN decimal(7,3); declare variable DISCOUNT decimal(7,3); declare variable curr_reserv decimal(7,3); BEGIN --находим есть ли позиции в спецификации select count(*) from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) into :id_spr; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (id_spr=0) then select count(*) from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and BD_SPR1.VALID_FLAG=1 and ((bd_spr1.fk_bd_dogovor<>:id_dog)or(:id_dog is null)) into :id_spr; if (id_spr=0) THEN BEGIN --если спецификация не задана и цена не приходная, определяем тип цены nazskidka=1; select bd_firm.WHOLESALE, (1+coalesce(BD_ORDER_OUT_1.MARGIN,0)/100.00)*(1-coalesce(BD_ORDER_OUT_1.DISCOUNT,0)/100.00) from BD_FIRM join BD_ORDER_OUT_1 on BD_ORDER_OUT_1.FK_BD_FIRM=BD_FIRM.FIELD_KEY where BD_ORDER_OUT_1.FIELD_KEy=:id_zakaz into :opt, :nazskidka; END ELSE nazskidka=1; ins=0; for select fk_bd_tovar, name,fullname, bd_11.CENA_PR_WITH_NDS, cena_pr_without_nds, (stock-coalesce(bd_11.REZERV,0)), bd_11.FIELD_KEY, BD_TOVAR.NDS, bd_tovar.INPLACE, bd_tovar.akc, BD_TOVAR.ED_IZM_NAME, bd_tovar.oldkey, coalesce(bd_11.REZERV,0), track_11 from bd_1 join BD_11 on bd_1.FIELD_KEY=bd_11.FK_bd_1 join bd_tovar on BD_TOVAR.FIELD_KEY=BD_11.FK_BD_TOVAR where BD_1.FK_BD_FIRM=:id_sklad and stock>0 and (bd_1.valid_flag=1) order by name into :fk_bd_tovar, :name,:fullname ,:CENA_NDS, :CENA_not_NDS, :stock, :fk_bd_11, :nds, :inplace, :akc, :ed_izm_name, :oldkey, :rezerv, :track_11 do BEGIN prim11=null; cnt=0; select cast(roundedcena as floatDG END stock=0; select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; suspend; cntinplace=null; prim11=null; END end else -- нет спец. откр. весь ассортимент begin select o1.in_prih_price, o1.fk_bd_cena from bd_order_out_1 o1 where o1.field_key=:id_zakaz into :in_prih_price, :fk_cena; stock=0; for select t.field_key, t.name, t.nds, t.fullname, t.inplace, t.oldkey_str from bd_tovar t where t.in_price_flag=1 --матрицы and ((not exists(select first 1 field_key from bd_matrix_firm where fk_bd_firm=:id_sklad))or (exists(select 1 from bd_matrix_tovar mt join bd_matrix_firm mf on mf.fk_bd_matrix=mt.fk_bd_matrix and mt.fk_bd_tovar=t.field_key and mf.fk_bd_firm=:id_sklad join bd_matrix m on m.PRIHOD_FLAG=1))) order by t.name into :fk_bd_tovar, :name, :nds, :fullname, :inplace, :oldkey do begin cnt=0; prim11=null; -- select sum(o11.cnt) from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :cnt; --select sum(stock) from bd_11 where stock>0 and fk_bd_tovar=:fk_bd_tovar and fk_bd_firm=:id_sklad and valid_flag=1 into :stock; /* if (in_prih_price=1) then begin select cena_pr, cena_pr_wo_nds from sp_get_prih_cena(:fk_bd_tovar) into :cena_nds, :cena_not_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end else begin select first 1 c.cena from bd_cpr_now c where c.fk_bd_tovar=:fk_bd_tovar and c.fk_bd_cena=:fk_cena into :cena_nds; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=cena_nds/(1+nds/100); summa_nds=cnt*cena_nds; summa_not_nds=cnt*cena_not_nds; end*/ stock=0; has_stock=0; rezerv=0; track_11=null; fk_bd_11=null; --остаток по партиям if (zakaz_by_track=1) then------------------------------------------- begin--заказ по треку if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0); cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds); end for select sum(coalesce(stock-coalesce(rezerv,0),0)), sum(coalesce(rezerv,0)), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and (stock-coalesce(rezerv,0))>0 and valid_flag=1 group by bd_11.TRACK_11 into :stock, :rezerv, :track_11 do begin --контроль отображения остатка has_stock=1; cnt=null; select first 1 BD_ORDER_OUT_11.cnt, cntinplace, prim11 from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz and coalesce(BD_ORDER_OUT_11.TRACK_11,0)=coalesce(:track_11,0) into :cnt, :cntinplace, :prim11; suspend; cntinplace=null; prim11=null; end --end for end else ------------------------------------------------------------------- begin for select field_key, coalesce(stock,0)-coalesce(rezerv,0), coalesce(rezerv,0), coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0), bd_11.TRACK_11 from bd_11 where (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) and stock>0 and valid_flag=1 into :fk_bd_11, :stock, :rezerv, :cena_nds, :cena_not_nds, :track_11 do begin --контроль отображения остатка has_stock=1; if (in_prih_price=1) then begin cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select cnt, cntinplace from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz and fk_bd_11=:fk_bd_11 into :cnt, :cntinplace; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cena_nds=null; cntinplace=null; prim11=null; end --end for end if (has_stock=0) then begin if (in_prih_price=1) then begin select first 1 coalesce(bd_11.cena_pr_with_nds,0), coalesce(bd_11.cena_pr_without_nds,0) from bd_11 where (bd_11.valid_flag=1) and (bd_11.fk_bd_firm=:id_sklad) and (bd_11.fk_bd_tovar=:fk_bd_tovar) order by bd_11.date_prih desc into :cena_nds, :cena_not_nds; cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); end else begin cena_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0);--- cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce((select cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena),0)*(100-nds);--- end cnt=null; select sum(cnt),sum(cntinplace) from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.fk_bd_out_1=:id_zakaz into :cnt, :cntinplace; select first 1 prim11 from bd_order_out_11 o11 where o11.fk_bd_out_1=:id_zakaz and o11.fk_bd_tovar=:fk_bd_tovar into :prim11; suspend; cntinplace=null; prim11=null; cena_nds=null; end end end END ^ SET TERM ; ^ '18.10.22.1ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOL  = !W\SET TERM ^ ; ALTER PROCEDURE SP_GET_SPR_FOR_ZAKPOL ( ID_ZAKAZ Integer, ID_SKLAD Integer, ID_POL Integer, ID_PPOL Integer, ID_DOG Integer DEFAULT null ) RETURNS ( FK_BD_TOVAR Integer, NAME Varchar(100), CNT Float, CENA_NDS Float, CENA_NOT_NDS Float, SUMMA_NDS Float, SUMMA_NOT_NDS Float, INS Integer, STOCK Decimal(7,3), FK_BD_11 Integer, SELF_STOCK Decimal(7,3), FULLNAME Varchar(200), MINSTOCK Decimal(7,3), MINCNT Decimal(7,3), AVGCNT Decimal(7,3), MAXCNT Decimal(7,3), AVTOZAK Decimal(7,3), AVGRASH Decimal(7,3), DNEY_TORG Integer, DNEY_LAST Integer, INPLACE Decimal(7,3), OLDKEY Varchar(30), PRIM11 Varchar(200), TRACK_11 Varchar(30), REZERV Decimal(7,3), cntinplace integer) AS declare variable NDS integer; declare variable IN_PRIH_PRICE integer; declare variable FK_CENA integer; declare variable MARGIN decimal(7,2); declare variable DISCOUNT decimal(7,2); declare variable HAS_STOCK integer; declare variable ZAKAZ_BY_TRACK integer; BEGIN select first 1 GLOBAL_OPTIONS.PARAMVALUE from GLOBAL_OPTIONS where GLOBAL_OPTIONS.PARAMNAME='zakaz_by_track' into :zakaz_by_track; zakaz_by_track=coalesce(zakaz_by_track,0); ins=0; select margin, discount from bd_order_out_1 where field_key=:id_zakaz into :margin, :discount; if (exists (select bd_spr1.field_key from bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1)) then begin for select bd_spr11.fk_bd_tovar, bd_tovar.name, bd_tovar.nds, bd_tovar.fullname, bd_spr11.cena, bd_tovar.INPLACE, bd_tovar.oldkey_str from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_tovar on bd_tovar.FIELD_KEY=bd_spr11.FK_BD_TOVAR join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr1.valid_flag=1 and ((bd_spr1.fk_bd_dogovor=:id_dog)or(:id_dog is null)) order by name into :fk_bd_tovar, :name, :nds, :fullname, :cena_nds, :inplace, :oldkey do BEGIN select first 1 bd_spr11.cena from bd_spr1 join bd_spr11 on bd_spr1.field_key=bd_spr11.fk_bd_spr1 join bd_grt_firm_web on bd_grt_firm_web.fk_bd_grt_firm=bd_spr1.fk_bd_grt_firm where bd_spr1.fk_recipient=:id_pol /*and bd_spr1.fk_bd_pfirm=:id_ppol*/ and bd_grt_firm_web.fk_bd_firm=:id_sklad and bd_spr11.fk_bd_tovar=:fk_bd_tovar and bd_spr1.valid_flag=1 order by bd_spr1.NOMER_CREATE into :cena_nds; prim11=null; cnt=0; cena_nds=coalesce(:cena_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_nds) into :cena_nds; cena_not_nds=coalesce(:cena_not_nds,0)*(1+:margin/100.00)*(1-:discount/100.00); select roundedcena from round_rcena(:fk_bd_tovar, :cena_not_nds) into :cena_not_nds; --находим количество из приходной накладной for select sum(cnt), BD_ORDER_OUT_11.prim11, BD_ORDER_OUT_11.CNTINPLACE from BD_ORDER_OUT_11 where BD_ORDER_OUT_11.FK_BD_TOVAR=:fk_bd_tovar and BD_ORDER_OUT_11.FK_BD_OUT_1=:id_zakaz group by 2,3 into :cnt, :prim11, :cntinplace do BEGIN cena_nds=coalesce(cena_nds,0); cena_not_nds=coalesce(cena_not_nds,0); FJlare variable FK_CENA integer; declare variable IN_PRIH integer; declare variable FK_11 integer; declare variable OST_RASH decimal(7,3); declare variable OST decimal(7,3); declare variable CENA decimal(8,2); declare variable FK_BD_TOVAR integer; declare variable CNT decimal(7,3); declare variable REZ integer; declare variable CNT_OTGR decimal(7,3); declare variable FK_O11 integer; declare variable SUM_DOC decimal(8,2); declare variable SUM_OK decimal(8,2); declare variable SUMRAZNES decimal(8,2); declare variable FK_KS1 integer; declare variable CNT_SO decimal(8,3); declare variable FK_SELFUL integer; declare variable MARGIN decimal(3,2); declare variable DISCOUNT decimal(3,2); declare variable NOMER_SPEC varchar(20); declare variable DATE_SPEC date; declare variable FK_FACE integer; declare variable NDS integer; declare variable FK_11_REZERV integer; declare variable FK_ORDER_IN_1 integer; declare variable TSD_CHECK integer; declare variable FK_USER integer; declare variable NAME_IFS type of column BD_2.NAME_IFS; declare variable FK_REZ integer; declare variable FK_SNOOP_DOGG integer; declare variable STOCK_TOVAR decimal(12,3); declare variable FK_ZAMENA integer; declare variable CNT_ZAMENA decimal(12,3); declare variable KOEF decimal(12,3); declare variable INPLACE_Z decimal(12,3); declare variable NDS_Z decimal(12,3); declare variable CENA_Z decimal(12,3); declare variable DATE_DELIVERY date; declare variable PRIM varchar(200); declare variable cnt_rash_cash decimal(7,3); declare variable track_11 varchar(30); declare variable stock_11 decimal(7,3); declare variable PRIM11 type of column BD_ORDER_OUT_11.PRIM11; declare variable cnt_inplace type of column BD_ORDER_OUT_11.cntinplace; BEGIN /* создаем расход по заданному заказу */ --снимаем все резервы, какие были сделаны этим заказом by_currprice=coalesce(by_currprice,0); if (prov_bd_2_flag is null) then prov_bd_2_flag=1; if (withcnt=0) then prov_bd_2_flag=0; /* for SELECT a.FIELD_KEY FROM BD_order_out_11 a where FK_BD_OUT_1=:id_zakaz into :fk_rez do begin end*/ select field_key from bd_users where upper(login)=current_user into :fk_user; --заголовок расхода select fk_bd_firm, fk_recipient, cod_rash, FK_PFIRM_RECIPIENT, fk_bd_cena, coalesce(in_prih_price,0), fk_selful, margin, discount, nomer_spec, date_spec, BD_ORDER_OUT_1.FK_BD_FACE, bd_order_out_1.fk_bd_order_in_1, bd_order_out_1.tsd_check_flag, FK_BD_DOGOVOR, bd_order_out_1.date_delivery, bd_order_out_1.prim from BD_ORDER_OUT_1 where field_key=:id_zakaz into :id_sklad, :id_rec, :cod_r, :FK_PFIRM_REC, :fk_cena, :in_prih, :fk_selful , :margin, :discount,:nomer_spec,:date_spec, :fk_face, :fk_order_in_1, :tsd_check, :fk_snoop_dogg, :date_delivery, :prim; if (date_delivery is null) then date_delivery=current_date; if (coalesce(in_prih,0)=1) then NAME_IFS=(select TR_NAME from SP_TRANSLATE('В прих.ценах','RU')); else NAME_IFS=(select TR_NAME from SP_TRANSLATE('По цене ','RU'))||(select name from BD_CENA where field_key=:fk_cena); fk_2=gen_id(GEN_BD_2_ID,1); INSERT INTO BD_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1,fk_selful,margin, discount,nomer_spec,date_spec, NAME_IFS, fk_bd_dogovor) VALUES ( :fk_2,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:id_sklad), null, :date_delivery, :id_rec, :fk_face, :cod_r, :d_cod_r, :fk_user, :prim, 0, null, null, null, :id_sklad, null, 0, :FK_PFIRM_REC, :fk_cena, coalesce(:in_prih,0), null, null, :id_zakaz, :fk_selful,:margin,:discount , :NOMER_SPEC, :date_spec, :NAME_IFS, :fk_snoop_dogg); --перебираKм все строки заказа --сначала переводим в расход строки с резервом cnt_so=0; rez=null; for select BD_ORDER_OUT_11.FK_BD_TOVAR, iif(:withcnt=1,coalesce(BD_ORDER_OUT_11.cnt,0),0), BD_ORDER_OUT_11.cena_pr_with_nds, BD_ORDER_OUT_11.FIELD_KEY, coalesce(r11.fk_bd_11,BD_ORDER_OUT_11.fk_bd_11), r11.fk_bd_11, bd_tovar.nds, bd_order_out_11.inplace, coalesce(bd_order_out_11.CNT_RASH,0), BD_ORDER_OUT_11.track_11, prim11, cntinplace from BD_ORDER_OUT_11 left join bd_tovar on (bd_tovar.field_key=BD_ORDER_OUT_11.fk_bd_tovar) left join BD_11_RESERV r11 on r11.FK_BD_ORDER_OUT_11=BD_ORDER_OUT_11.FIELD_KEY where fk_bd_out_1=:id_zakaz --and fk_bd_11_rezerv is null into :fk_bd_tovar, :ost_rash, :cena, :fk_o11, :fk_11_rezerv, :rez, :nds, :inplace, :cnt_rash_cash, :track_11, :prim11, :cnt_inplace do BEGIN --ost_rash - ищем, сколько уже отгружено по данной позиции cnt_otgr=0; if (withcnt=1) then /* select sum(cnt) from BD_22 where bd_22.fk_bd_order_out_11=:fk_o11 into :*/cnt_otgr=cnt_rash_cash; cnt_otgr=coalesce(cnt_otgr,0); ost_rash=ost_rash-cnt_otgr; --проверяем по остаткам если нехватает, проверим замены select sum(stock) from bd_11 where fk_bd_firm=:id_sklad and fk_bd_tovar=:fk_bd_tovar and valid_flag=1 and stock>0 into :stock_tovar; if (coalesce(:stock_tovar,0)<:ost_rash) then begin for select sp.fk_tovar_zamena, sp.cnt_tovar_zamena, sp.koef, t.nds, t.inplace from sp_create_rash_checktov_zamena(:id_zakaz,:fk_o11,:ost_rash-coalesce(:stock_tovar,0)) sp join bd_tovar t on t.field_key=sp.fk_tovar_zamena into :fk_zamena, :cnt_zamena, :koef, :nds_z, :inplace_z do begin cena_z=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_zamena and fk_bd_cena=:fk_cena into :cena_z; INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds, prim, cnt_inplace) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, null , :cena_z, :cena_z/(1+(coalesce(:nds_z,0)/100)), :cnt_zamena, :fk_o11, :fk_zamena, :inplace_z, :nds_z, :prim11,:cnt_inplace); cnt_so=cnt_so+cnt_zamena; ost_rash=:ost_rash-(:cnt_zamena*:koef); end if ((SET_CNT_BY_STOCK=1)and(ost_rash>coalesce(stock_tovar,0))) then ost_rash=coalesce(stock_tovar,0); end --актуализируем цены --только для расходных цен if ((by_currprice=1)and(coalesce(in_prih,0)=0)) then begin cena=0; select first 1 cena from BD_CPR_NOW where fk_bd_tovar=:fk_bd_tovar and fk_bd_cena=:fk_cena into :cena; end if (rez is not null) then begin update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz and field_key=:fk_o11; end else begin fk_11_rezerv=null; end --заполняем расход -- 1. Rezerv or position from fk_bd_11 if ((withcnt=0)or(ost_rash>0)) then begin if ((fk_11_rezerv is not null)or(track_11 is null)) then --если стоят резервы, или трек партии не указан begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds, prim, cnt_inplace) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11_rezerv , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds, :prim11,:cnt_inplace); cnt_so=cnt_so+ost_rash; ost_rash=0; delete from bd_11_reserv where bd_11_reserv.FK_BD_ORDER_OUT_11=:fk_o11; end else begin --track is null и резервы не стоят --перебор партий с указанным треком for select field_key, stock-coalesce(rezerv,0) from bd_11 a where fk_bd_firm=:id_sklad and valid_flag=1 and fk_bd_tovar=:fk_bd_tovar and track_11=:track_11 and stock>0 order by a.DATE_PRIH desc into :fk_11, :stock_11 do begin if (ost_rash>0) then begin if (stock_11>=ost_rash) then begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds, prim, cnt_inplace) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11 , :cena, :cena/(1+(coalesce(:nds,0)/100)), :ost_rash, :fk_o11, :fk_bd_tovar, :inplace, :nds, :prim11, :cnt_inplace); ost_rash=0; end else begin INSERT INTO BD_22 (FIELD_KEY, FK_BD_2, FK_BD_11, CENA_WITH_NDS, CENA_WITHOUT_NDS, CNT, fk_bd_order_out_11, fk_bd_tovar, cnt_in_inplace, nds, prim, cnt_inplace) VALUES (gen_id(GEN_BD_22_ID,1), :fk_2, :fk_11 , :cena, :cena/(1+(coalesce(:nds,0)/100)), :stock_11, :fk_o11, :fk_bd_tovar, :inplace, :nds, :prim11, :cnt_inplace); ost_rash=ost_rash-stock_11; end end end end end rez=null; END if ((withcnt=0)or(cnt_so>0)) THEN BEGIN -- update BD_ORDER_OUT_11 set fk_bd_11_rezerv=null where fk_bd_out_1=:id_zakaz; if (prov_bd_2_flag=1) then begin execute procedure sp_bd2_prov(:fk_2,'RU',coalesce(:tsd_check,0),:fk_user); if ((select count(*) from bd_2_resultprov r where r.fk_bd_2=:fk_2)>0) then begin delete from bd_21 where fk_bd_2=:fk_2; update bd_2 set valid_flag=0 where field_key=:fk_2; end end -- execute procedure sp_22_by_21(:fk_2,0); update bd_order_in_1 set bd_order_in_1.close_flag=1 where field_key=:fk_order_in_1; suspend; execute procedure sp_refactor_rash_by_spec(:fk_2); -- END ELSE delete from BD_2 where field_key=:fk_2; --делаем разнесение --находим сумму расхода select sum(summa) from bd_21 where fk_bd_2=:fk_2 into :sum_doc; for select fk_ks_1, sum(summa) from ks_11 where fk_ks_1 is not null and coalesce(fo_order_out,0)=:ID_ZAKAZ group by fk_ks_1 into :fk_ks1, :sumraznes do BEGIN --находим сколько можем разнести по этой оплате select main.summa-coalesce((select sum(ks_11.summa) from ks_11 where ks_11.fk_ks_1=:fk_ks1 and ks_11.fk_bd_2 is not null and coalesce(ks_11.fk_bd_2,0)<>:fk_2),0) from ks_1 main where main.field_key=:fk_ks1 group by main.summa into :sum_ok; --сравниваем суммы sumraznes=minvalue(sumraznes,sum_ok,sum_doc); if (sumraznes>0) THEN BEGIN --создаем разнесение в этой же оплате по этому же расходу INSERT INTO KS_11 (FIELD_KEY, FK_KS_1, FK_BD_2, SUMMA) VALUES (gen_id(GEN_KS_11_ID,1), :FK_KS1, :FK_2, :sumraznes); sum_doc=sum_doc-sumraznes; END END END ^ SET TERM ; ^ '18.10.22.1ALTER PROCEDURE SP_CREATE_RASH    io!)^update or insert into global_options (paramvalue, paramname, info) values (0,'ch_to_rash_avgcena','Чеки в расход: вычислять среднюю цену для группировки товаров') matching (paramname);(Чеки в расход: вычислять среднюю цену для группировки товаров18.10.24.1global_optionsb c !I]SET TERM ^ ; ALTER PROCEDURE SP_CREATE_RASH ( ID_ZAKAZ Integer, BY_CURRPRICE Integer, PROV_BD_2_FLAG Integer, WITHCNT Smallint DEFAULT 1, SET_CNT_BY_STOCK Integer DEFAULT 0 ) RETURNS ( FK_2 Integer ) AS declare variable ID_SKLAD integer; declare variable ID_REC integer; declare variable INPLACE type of column BD_TOVAR.INPLACE; declare variable COD_R integer; declare variable D_COD_R integer; declare variable FK_PFIRM_REC integer; decINag,0)=0)) then update bd_ch2 set accept_flag=1 where field_key=:fk_ch2_tmp; end for select date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<=0) then 0 else 1 end,0), smena, fk_bd_2, coalesce(fk_bd_firm_kredit,2), sum(bd_ch2.SUMMA-coalesce(bd_ch2.SUMMA_KREDIT,0)) from bd_ch2 where (fk_bd_kassa=:fk_kassa) --and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(accept_flag,0)<>1) and coalesce(accept_flag,0)=0 and ((coalesce(summa_all,0)<>0)/*or(coalesce(summa_disc,0)=coalesce(summa_all,0))*/) and (date_close<=:withtoday) --and (fk_bd_2 is null) group by 1,2,3,4,5,6 order by date_close, coalesce(case when (summa<0) then 1 else 0 end,0), coalesce(case when (bank_card<=0) then 0 else 1 end,0), smena, fk_bd_2 into :date_close, :is_vozvrat, :is_bank, :smena, :fk_bd_2_ch, :fk_rec, :summa_opl do begin i=gen_id(gen_test1,1); if ((date_close<>olddate)or(is_vozvrat<>old_is_vozvrat)or(old_fk_kassa<>fk_kassa)or(old_is_bank<>is_bank)or(old_smena<>smena)or(old_fk_rec<>fk_rec)) then begin --создаем новый расход if (fk_bd_2_ch is null) then begin fk_bd_2new=gen_id(GEN_BD_2_ID,1); nomer_rash=(select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm); --сохраняем номер расхода в таблицу INSERT INTO BD_CH2_TO_RASH (ID_OPERATION, FK_BD_2,fk_bd_kassa, date_rash, nomer_rash) VALUES (:ID_OPERATION, :fk_bd_2new, :fk_kassa, :date_close, :nomer_rash); --помечаем чеки update bd_ch2 set fk_bd_2=:fk_bd_2new where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and coalesce(summa,0)<>0 and (date_close=:date_close) and is_vozvrat=:is_vozvrat and coalesce(case when (bank_card<=0) then 0 else 1 end,0)=:is_bank; --and fk_bd_2 is null; insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, COD_RASH, FK_BD_USERS, "COMMENT", FK_BD_FIRM, name_ifs, FK_CENA_RASH, IN_PRIH_CENA, fk_bd_kassa) VALUES (:fk_bd_2new,(select TR_NAME from SP_TRANSLATE('Касса ',:lang))||:kassaname, :nomer_rash, :date_close, :date_close, :fk_rec, iif((:is_vozvrat=0),iif(:is_bank=0,0,3) ,7), :fk_user, iif((:is_vozvrat=0), (select TR_NAME from SP_TRANSLATE('Чеки с кассы ',:lang)), (select TR_NAME from SP_TRANSLATE('Возвраты по кассе ',:lang)))||:kassaname, :fk_firm, (select TR_NAME from SP_TRANSLATE('По цене ',:lang))||:name_cena, :fk_cena_rash, 0, :fk_kassa); --создание оплаты if ((SUMMA_OPL>0)and(fk_rec<>2)) then begin INSERT INTO KS_1 (FK_KS_KODI, FK_KS_SCHET, DATE_CREATE, TIME_CREATE, OPER_CREATE, SUMMA, COMM, FK_BD_FIRM, PRIH, VALID_FLAG, OPL_FLAG, NOMER_CREATE,fk_sklad) VALUES ( 2, coalesce((select bd_firm.FK_KS_SHET from bd_firm where field_key=:fk_firm),(select first 1 field_key from KS_SCHET order by field_key)), :date_close, current_time, :fk_user, :SUMMA_OPL, null, :FK_REC, 1, 1, 0, (select coalesce(max(NOMER_CREATE)+1,1) from ks_1), :fk_firm ) returning (field_key) into :fk_ks_1; INSERT INTO KS_11 (FK_KS_1, FK_BD_2, SUMMA) VALUES (:FK_KS_1, :fk_bd_2new, :SUMMA_OPL); end --------- end else begin fk_bd_2new=:fk_bd_2_ch; update bd_ch2_to_rash set id_operation=:id_operation where fk_bd_2=:fk_bd_2_ch; O fk_bd_2_ch=null; end update bd_2 set nomer_nakl=:smena where field_key=:fk_bd_2new; olddate=date_close; old_is_vozvrat=is_vozvrat; old_fk_kassa=fk_kassa; old_is_bank=:is_bank; old_smena=:smena; old_fk_rec=:fk_rec; end if (coalesce((select paramvalue from global_options where paramname='ch_to_rash_avgcena'),0)=1) then begin --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then sum(bd_ch21.CENA*coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1)*bd_ch21.cnt)/sum(bd_ch21.cnt) else sum(bd_ch21.CENA*bd_ch21.cnt)/sum(bd_ch21.cnt) end, sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<=0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0)and(coalesce(bd_ch2.fk_bd_firm_kredit,2)=:fk_rec) group by fk_bd_tovar, /*(case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end),*/ BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот овар был не набор end end --закончили создание строки end else begin --создаем строки в BD_22 for select fk_bd_tovar, --bd_ch21.CENA, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), sum( case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then cast(cnt/coalesce(iif(BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) as decimal(7,3)) else cnt end ), sum(coalesce(bd_ch21.SUMPOS_WITH_DISCOUNT,0)),max(AKC_FLAG), max(SP_AKC_FLAG) from bd_ch21 join bd_ch2 on BD_CH2.FIELD_KEY=BD_CH21.FK_BD_CH2 join BD_TOVAR on BD_TOVAR.FIELD_KEY=bd_ch21.FK_BD_TOVAR where (BD_CH2.FK_BD_FIRM=:fk_firm)and(bd_ch2.DATE_CLOSE=:date_close)and(bd_ch2.FK_BD_KASSA=:fk_kassa)and(coalesce(bd_ch2.is_vozvrat,0)=:is_vozvrat) and(bd_ch2.smena=:smena)and(coalesce(case when (bank_card<=0) then 0 else 1 end,0)=:is_bank) and(coalesce(bd_ch21.accept_flag,0)<>1)and(coalesce(bd_ch21.canceled,0)=0)and(coalesce(bd_ch2.fk_bd_firm_kredit,2)=:fk_rec) group by fk_bd_tovar, (case when (coalesce(iif((coalesce(BD_TOVAR.EMKTOV,0)=0),1,BD_TOVAR.EMKTOV),1)<>1) then bd_ch21.CENA*coalesce(iif (BD_TOVAR.EMKTOV=0,1,BD_TOVAR.EMKTOV),1) else bd_ch21.CENA end), BD_TOVAR.EMKTOV --having (coalesce(case when (sum(cnt)<0) then 1 else 0 end,0)=:is_vozvrat) order by 2 desc into :fk_tovar, :cena, :cnt_ch22, :sumpos_ch22, :AKC_FLAG, :SP_AKC_FLAG do begin if (abs(cnt_ch22)>0) then --если позиция сторнировалась, то ее не заводим в расход begin -- cena=sumpos_ch22/cnt_ch22; cnt_bd22=abs(cnt_ch22); if (exists(select fk_bd_tovar_master from bd_tovar_nabor where fk_bd_tovar_master=:fk_tovar)) then begin for select n.fk_bd_tovar_dop, coalesce(n.cnt_dop,0), coalesce(n.koef_price,0) from bd_tovar_nabor n where n.fk_bd_tovar_master=:fk_tovar into :nabor_fk_tovar, :nabor_cnt_dop, :nabor_koef do begin -->-перебор набора nds=18; select first 1 nds from bd_tovar where bd_tovar.field_key=:fk_tovar into :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds,FK_TOVAR_NABOR_MASTER,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:nabor_fk_tovar, :cnt_bd22*:nabor_cnt_dop, (:cena*(1+(coalesce(:nabor_koef,0)/100)/coalesce(:nabor_cnt_dop,1))-:cena),:nds,:fk_tovar,:AKC_FLAG, :SP_AKC_FLAG); end --<-перебор набора end -- это был набор else begin -- это не набор -- emk=1; nds=18; select first 1 --bd_tovar.emktov, nds from bd_tovar where bd_tovar.field_key=:fk_tovar into --:emk, :nds; insert into bd_22 (fk_bd_2,fk_bd_tovar,cnt,cena_with_nds, nds, summa, SUM_INPUT_MAN_FLAG,AKC_FLAG, SP_AKC_FLAG) values (:fk_bd_2new,:fk_tovar, :cnt_bd22, :cena,:nds,abs(:sumpos_ch22),1,:AKC_FLAG, :SP_AKC_FLAG); end -- этот товар был не набор end end --закончили создание строки end end --закончили перебор чеков по кассе end --закончили перебор касс END^ SET TERM ; ^(чеки в расход с учетом нового параметра18.10.24.1SP_CH_TO_RASH_22_OP n !3_SET TERM ^ ; CREATE OR ALTER procedure SP_CH_TO_RASH_22_OP ( FK_FIRM integer, WITHTODAY date, ALLOWIZL integer, LANG varchar(2), ID_OPERATION integer) as declare variable OLDDATE date; declare variable FK_KASSA integer; declare variable KASSANAME type of column BD_KASSA.INAME; declare variable DATE_CLOSE date; declare variable FK_BD_2NEW integer; declare variable FK_USER integer; declare variable FK_TOVAR integer; declare variable FK_TOVAR_MOD integer; declare variable CNT_CH22 type of column BD_CH21.CNT; declare variable CENA type of column BD_21.CENA_WITH_NDS; declare variable EMK type of column BD_TOVAR.EMKTOV; declare variable NDS type of column BD_TOVAR.NDS; declare variable CNT_BD22 type of column BD_CH21.CNT; declare variable IS_VOZVRAT integer; declare variable OLD_IS_VOZVRAT integer; declare variable OLD_FK_KASSA integer; declare variable CHECK_TOVAR integer; declare variable CHECK_MOD integer; declare variable CHECK_CNT type of column BD_22.CNT; declare variable CHECK_CNT_21 type of column BD_21.CNT; declare variable NAME_CENA type of column BD_CENA.NAME; declare variable FK_CENA_RASH integer; declare variable NABOR_FK_TOVAR integer; declare variable NABOR_CNT_DOP decimal(7,3); declare variable NABOR_KOEF decimal(3,2); declare variable SUMPOS_CH22 decimal(3,2); declare variable I integer; declare variable FK_CH2 integer; declare variable NOMER_RASH type of column BD_2.NOMER_RASH; declare variable AKC_FLAG integer; declare variable SP_AKC_FLAG integer; declare variable IS_BANK integer; declare variable OLD_IS_BANK integer; declare variable SMENA integer; declare variable OLD_SMENA integer; declare variable FK_BD_2_CH integer; declare variable FK_CH2_TMP integer; declare variable FK_REC integer; declare variable OLD_FK_REC integer; declare variable SUMMA_OPL decimal(15,2); declare variable FK_KS_1 integer; BEGIN insert into BD_TIME_CHECKING(fk_bd_firm,ts_create,name) values (:fk_firm,current_timestamp,'чеки в расход: старт'); select first 1 bd_cena.FIELD_KEY, bd_cena.name from bd_cena join BD_FIRM on BD_FIRM.FK_BD_CENA_BASIC=BD_CENA.FIELD_KEY where BD_FIRM.FIELD_KEy=:FK_FIRM into :fk_cena_rash, :name_cena; update bd_ch2 set fk_bd_2 = null, accept_flag=0 where fk_bd_firm=:fk_firm and not exists(select field_key from bd_2 where field_key=bd_ch2.fk_bd_2); --сначала обычные расходы olddate='1.01.1900'; old_is_vozvrat=-1; old_fk_kassa=-1; old_is_bank=-100; old_smena=-100; old_fk_rec=2; if (withtoday is null) then withtoday=DATEADD(DAY, -1, current_date); select first 1 BD_USERS.FIELD_KEY from BD_USERS where upper(bd_users.LOGIN)=current_user into :fk_user; for select field_key, iname from bd_kassa where fk_bd_firm=:fk_firm order by field_key into :fk_kassa, :kassaname do begin fk_bd_2_ch=null; -- отменненые позиции ставим обработанными for select field_key from bd_ch2 where (fk_bd_kassa=:fk_kassa) and coalesce(accept_flag,0)=0 and (date_close<=:withtoday) and exists(select field_key from bd_ch21 where fk_bd_ch2=bd_ch2.field_key and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0) into :fk_ch2_tmp do begin update bd_ch21 set accept_flag=1 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.canceled,0)=1 and coalesce(bd_ch21.accept_flag,0)=0; if (not exists(select field_key from bd_ch21 where fk_bd_ch2=:fk_ch2_tmp and coalesce(bd_ch21.accept_flM b 5Sbp}?!iALTER TABLE BD_KASSA ADD FK_BD_KASSA_MENU_MAIN INTEGER;,ADD FK_BD_KASSA_MENU_MAIN18.11.12.1BD_KASSA{ ?!'hALTER TABLE BD_KASSA_MENU ADD FK_BD_KASSA_MENU_MAIN INTEGER;,ADD FK_BD_KASSA_MENU_MAIN18.11.12.1BD_KASSA_MENU^ _!!1gSET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_BD_KASSA_MENU_MAIN_ID; CREATE TABLE BD_KASSA_MENU_MAIN ( FIELD_KEY INTEGER NOT NULL, NAME VARCHAR(200) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE BD_KASSA_MENU_MAIN ADD CONSTRAINT PK_BD_KASSA_MENU_MAIN PRIMARY KEY (FIELD_KEY); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: BD_KASSA_MENU_MAIN_BI */ CREATE OR ALTER TRIGGER BD_KASSA_MENU_MAIN_BI FOR BD_KASSA_MENU_MAIN ACTIVE BEFORE INSERT POSITION 0 as begin if (new.field_key is null) then new.field_key = gen_id(gen_bd_kassa_menu_main_id,1); end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON BD_KASSA_MENU_MAIN TO PUBLIC;,глобальные идентификаторы для меню касс18.11.12.1BD_KASSA_MENU_MAIN^q'fALTER TABLE BD_SVERKA ADD FIRM_LIST VARCHAR(500);+ADD FIRM_LIST18.11.4.1BD_SVERKAQ_)eALTER TABLE KS_1 ADD FK_BD_FACE INTEGER;+ADD FK_BD_FACE18.11.4.1KS_1 c#!'dSET TERM ^ ; CREATE OR ALTER trigger tr_ks1_dolg_a for ks_1 active after update position 0 AS BEGIN if ((coalesce(old.VALID_FLAG,0)<>coalesce(new.VALID_FLAG,0))and(coalesce(new.VALID_FLAG,0)=1)) then begin -- execute procedure SP_KS1_RAZNES(new.FIELD_KEY); end END^ SET TERM ; ^*Отключаем авторазнесение при проведении18.10.30.1tr_ks1_dolg_ar _Q!+bSET TERM ^ ; CREATE OR ALTER trigger tr_bd_1_setcash for bd_1 active after insert or update position 0 AS DECLARE VARIABLE d date; BEGIN if ((coalesce(old.fk_selful,0)<>coalesce(new.fk_selful,0))or(coalesce(old.VALID_FLAG,0)<>coalesce(new.VALID_FLAG,0))or(coalesce(old.FK_BD_FIRM,0)<>coalesce(new.FK_BD_FIRM,0)) or(coalesce(old.cod_prih,0)<>coalesce(new.cod_prih,0)) or(coalesce(old.day_cons_prih,0)<>coalesce(new.day_cons_prih,0))or(coalesce(old.date_prih,'1.1.2000')<>coalesce(new.date_prih,'1.1.2000'))) THEN BEGIN if (new.cod_prih=2) then d=new.date_prih+coalesce(new.day_cons_prih,0); else d=new.date_prih; update bd_11 set valid_flag=new.VALID_FLAG,FK_BD_FIRM=new.FK_BD_FIRM, date_dolg=:d, cod_prih=new.cod_prih, fk_supplier=new.fk_supplier, date_prih=new.DATE_PRIH, fk_selful=new.fk_selful, fk_bd_smena=new.fk_bd_smena where fk_bd_1=new.FIELD_KEY; /*if (coalesce(new.cod_prih,0)<>6) then*/ update bd_11 set fk_supplier_6=new.fk_supplier where fk_bd_1=new.FIELD_KEY and fk_bd_21_6 is null; END END^ SET TERM ; ^)--if (coalesce(new.cod_prih,0)<>6)18.10.26.1tr_bd_1_setcash #k _ E)/># E7!)rUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('autorefresh_timeout', '0', 'Время автообновления данных в журнале по таймеру') MATCHING (PARAMNAME);.autorefresh_timeout 218.11.21.2GLOBAL_OPTIONSs + !%qSET TERM ^ ; CREATE OR ALTER procedure SP_COPY_RASH ( FK_BD_2 integer, FK_FIRM integer) as declare variable DATE_NAKL date; declare variable NOMER_RASH varchar(10); declare variable FK_RECIPIENT integer; declare variable FK_FACE integer; declare variable COD_RASH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_PFIRM integer; declare variable FK_PFIRM_RECIPIENT integer; declare variable FK_CENA_RASH integer; declare variable INTv sS!oALTER TABLE BD_FIRM ADD DAY_DELIVERY_ORDER_OUT SMALLINT; ALTER TABLE BD_FIRM ADD TIME_DELIVERY_ORDER_OUT TIME;-Дата время ожидаемой поставки по умолчанию для заявок18.11.21.1BD_FIRMq !%nSET TERM ^ ; CREATE OR ALTER procedure SP_COPY_RASH ( FK_BD_2 integer, FK_FIRM integer) as declare variable DATE_NAKL date; declare variable NOMER_RASH varchar(10); declare variable FK_RECIPIENT integer; declare variable FK_FACE integer; declare variable COD_RASH integer; declare variable DAY_CONS_RASH integer; declare variable FK_BD_PFIRM integer; declare variable FK_PFIRM_RECIPIENT integer; declare variable FK_CENA_RASH integer; declare variable INS' {!!)mUPDATE OR INSERT INTO GLOBAL_OPTIONS (PARAMNAME, PARAMVALUE, INFO) VALUES ('flowershop', '0', 'Цветочный магазин (отображение признака входимости в букет у товара)') MATCHING (PARAMNAME);,flowershop18.11.12.1GLOBAL_OPTIONS q !'lexecute block as declare variable fk_menu_main integer; declare variable fk_grt_firm integer; declare variable name varchar(31); begin for select distinct coalesce(bd_kassa_menu.fk_bd_grt_firm,-1), coalesce(bd_grt_firm.name,'Общее') from bd_kassa_menu left join bd_grt_firm on bd_grt_firm.field_key=bd_kassa_menu.fk_bd_grt_firm into fk_grt_firm, name do begin insert into bd_kassa_menu_main (name) values(:name) returning(field_key) into :fk_menu_main; if (fk_grt_firm<>-1) then begin update bd_kassa_menu set fk_bd_kassa_menu_main=:fk_menu_main where fk_bd_grt_firm=:fk_grt_firm; update bd_kassa set fk_bd_kassa_menu_main=:fk_menu_main where fk_bd_firm in (select fk_bd_firm from bd_grt_firm_web where fk_bd_grt_firm=:fk_grt_firm); end else begin update bd_kassa_menu set fk_bd_kassa_menu_main=:fk_menu_main where fk_bd_grt_firm is null; end end end,для создания заголовков меню касс18.11.12.1execute block U!kALTER TABLE BD_TOVAR ADD BUKET SMALLINT DEFAULT 0 ; COMMENT ON COLUMN BD_TOVAR.BUKET IS 'признак может входить в Букет цветов';,признак может входить в Букет цветов18.11.12.1BD_TOVAR I!1jSET TERM ^ ; CREATE trigger bd_kassa_menu_main_bd0 for bd_kassa_menu_main active before delete position 0 AS begin /* Trigger text */ update bd_kassa set FK_BD_KASSA_MENU_MAIN=null where FK_BD_KASSA_MENU_MAIN=old.field_key; delete from bd_kassa_menu where FK_BD_KASSA_MENU_MAIN=old.field_key; end^ SET TERM ; ^,trigger bd_kassa_menu_main_bd018.11.12.1bd_kassa_menu_main_PRIH_CENA integer; declare variable FK_BD_DOGOVOR integer; declare variable FK_BD_2NEW integer; declare variable FK_BD_TOVAR integer; declare variable CENA_WITH_NDS decimal(8,2); declare variable CENA_WITHOUT_NDS decimal(8,2); declare variable CNT decimal(8,3); declare variable NDS decimal(3,2); declare variable DATE_SAVE date; declare variable GTD varchar(26); declare variable FK_USER integer; declare variable FIRMNAME varchar(200); declare variable FK_BD_TOVAR_MOD integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable SUM_INPUT_MAN_FLAG integer; declare variable SUMMA type of column BD_22.SUMMA; declare variable CNT_IN_INPLACE type of column BD_22.CNT_IN_INPLACE; declare variable PRIM type of column BD_2.comment; declare variable DATE_RASH date; begin select field_key from bd_users where upper(login)=upper(current_user) into :fk_user; select name from bd_firm where field_key=(select fk_bd_firm from bd_2 where field_key=:fk_bd_2) into :firmname; if (fk_firm is null) then begin select bd_2.nomer_rash, bd_2.date_nakl, bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_bd_pfirm, bd_2.fk_bd_firm, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT" from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_bd_pfirm, :fk_firm, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim; end else begin select bd_2.nomer_rash, bd_2.date_nakl ,bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT", bd_2.date_rash from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim, :date_rash; end fk_bd_2new=gen_id(GEN_BD_2_ID,1); if (:date_rash is null) then begin date_rash=current_date; end insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1, FK_BD_dogovor) VALUES ( :fk_bd_2new,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), null, :date_rash, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_user, coalesce(:prim,'Копия расхода '||:nomer_rash||' '||:firmname), 0, :fk_bd_pfirm, null, null, :fk_firm, null, 0, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, null, null, null,:fk_bd_dogovor); for select a.FK_BD_TOVAR, a.FK_BD_TOVAR_MOD, a.CENA_WITH_NDS, a.CENA_WITHOUT_NDS, a.NDS, a.CNT, a.FK_TOVAR_NABOR_MASTER, a.SUM_INPUT_MAN_FLAG, a.SUMMA, a.CNT_IN_INPLACE from bd_22 a where fk_bd_2=:fk_bd_2 order by field_key into :fk_bd_tovar, :fk_bd_tovaR_MOD, :CENA_WITH_NDS, :CENA_without_nds, :nds, :cnt, :fk_tovar_nabor_master, :sum_input_man_flag, :summa, :cnt_in_inplace do begin INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, FK_TOVAR_NABOR_MASTER, SUM_INPUT_MAN_FLAG, SUMMA, CNT_IN_INPLACE) VALUES (:fk_bd_2new, :FK_BD_TOVAR, :FK_BD_TOVAR_MOD, :CENA_WITH_NDS, :CENA_WITHOUT_NDS, :NDS, :CNT, :FK_TOVAR_NABOR_MASTER, :SUM_INPUT_MAN_FLAG, :SUMMA, :CNT_IN_INPLACE); end end^ SET TERM ; ^-30-20018.11.21.1SP_COPY_RASH_PRIH_CENA integer; declare variable FK_BD_DOGOVOR integer; declare variable FK_BD_2NEW integer; declare variable FK_BD_TOVAR integer; declare variable CENA_WITH_NDS decimal(8,2); declare variable CENA_WITHOUT_NDS decimal(8,2); declare variable CNT decimal(8,3); declare variable NDS decimal(3,2); declare variable DATE_SAVE date; declare variable GTD varchar(26); declare variable FK_USER integer; declare variable FIRMNAME varchar(200); declare variable FK_BD_TOVAR_MOD integer; declare variable FK_TOVAR_NABOR_MASTER integer; declare variable SUM_INPUT_MAN_FLAG integer; declare variable SUMMA type of column BD_22.SUMMA; declare variable CNT_IN_INPLACE type of column BD_22.CNT_IN_INPLACE; declare variable PRIM type of column BD_2.comment; declare variable DATE_RASH date; begin select field_key from bd_users where upper(login)=upper(current_user) into :fk_user; select name from bd_firm where field_key=(select fk_bd_firm from bd_2 where field_key=:fk_bd_2) into :firmname; if (fk_firm is null) then begin select bd_2.nomer_rash, bd_2.date_nakl, bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_bd_pfirm, bd_2.fk_bd_firm, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT" from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_bd_pfirm, :fk_firm, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim; end else begin select bd_2.nomer_rash, bd_2.date_nakl ,bd_2.fk_recipient, bd_2.fk_face, bd_2.cod_rash, bd_2.day_cons_rash, bd_2.fk_pfirm_recipient, bd_2.fk_cena_rash, bd_2.in_prih_cena, bd_2.fk_bd_dogovor, bd_2."COMMENT", bd_2.date_rash from bd_2 where bd_2.field_key=:fk_bd_2 into :nomer_rash, :date_nakl, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, :fk_bd_dogovor, :prim, :date_rash; end fk_bd_2new=gen_id(GEN_BD_2_ID,1); if (:date_rash is null) then begin date_rash=current_date; end insert into bd_2 (FIELD_KEY, NOMER_NAKL, NOMER_RASH, DATE_NAKL, DATE_RASH, FK_RECIPIENT, FK_FACE, COD_RASH, DAY_CONS_RASH, FK_BD_USERS, "COMMENT", EXPORT_FLAG, FK_BD_PFIRM, NOMER_SF, DATE_SF, FK_BD_FIRM, FK_BD_1_6, SUMMA, FK_PFIRM_RECIPIENT, FK_CENA_RASH, IN_PRIH_CENA, FK_BD_SF_OUT, FK_BD_RASH_POL, FK_BD_ORDER_OUT_1, FK_BD_dogovor) VALUES ( :fk_bd_2new,null, (select coalesce(max(bd_2.nomer_rash)+1,1) from bd_2 where bd_2.fk_bd_firm=:fk_firm), null, :date_rash, :fk_recipient, :fk_face, :cod_rash, :day_cons_rash, :fk_user, /*coalesce(*/:prim/*,'Копия расхода '||:nomer_rash||' '||:firmname)*/, 0, :fk_bd_pfirm, null, null, :fk_firm, null, 0, :fk_pfirm_recipient, :fk_cena_rash, :in_prih_cena, null, null, null,:fk_bd_dogovor); for select a.FK_BD_TOVAR, a.FK_BD_TOVAR_MOD, a.CENA_WITH_NDS, a.CENA_WITHOUT_NDS, a.NDS, a.CNT, a.FK_TOVAR_NABOR_MASTER, a.SUM_INPUT_MAN_FLAG, a.SUMMA, a.CNT_IN_INPLACE from bd_22 a where fk_bd_2=:fk_bd_2 order by field_key into :fk_bd_tovar, :fk_bd_tovaR_MOD, :CENA_WITH_NDS, :CENA_without_nds, :nds, :cnt, :fk_tovar_nabor_master, :sum_input_man_flag, :summa, :cnt_in_inplace do begin INSERT INTO BD_22 (FK_BD_2, FK_BD_TOVAR, FK_BD_TOVAR_MOD, CENA_WITH_NDS, CENA_WITHOUT_NDS, NDS, CNT, FK_TOVAR_NABOR_MASTER, SUM_INPUT_MAN_FLAG, SUMMA, CNT_IN_INPLACE) VALUES (:fk_bd_2new, :FK_BD_TOVAR, :FK_BD_TOVAR_MOD, :CENA_WITH_NDS, :CENA_WITHOUT_NDS, :NDS, :CNT, :FK_TOVAR_NABOR_MASTER, :SUM_INPUT_MAN_FLAG, :SUMMA, :CNT_IN_INPLACE); end end^ SET TERM ; ^.18.11.21.2SP_COPY_RASH