Установка автозаказа — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Создать таблицу ORDER_DATA)
Строка 166: Строка 166:
 
     new.id = gen_id(gen_order_data_id,1);
 
     new.id = gen_id(gen_order_data_id,1);
 
  end;
 
  end;
 +
</nowiki>
 +
 +
==Дополнительно==
 +
1) Проверить, что индекс WARES_IDX1 уникален, если нет, то выполнить процедуру UPDPR_REPARWARES и сделать индекс уникальным (возможно потребуется монопольный доступ к БД)
 +
<nowiki>
 +
SET TERM ^ ;
 +
 +
create or alter procedure UPDPR_REPARWARES
 +
returns (
 +
    ID DM_TEXT)
 +
as
 +
declare variable NAME_ID DM_TEXT;
 +
declare variable IZG_ID DM_TEXT;
 +
declare variable COUNTRY_ID DM_TEXT;
 +
declare variable ORIG_CODE DM_TEXT;
 +
declare variable ORIG_NAME_ID DM_TEXT;
 +
declare variable ORIG_IZG_ID DM_TEXT;
 +
declare variable ORIG_COUNTRY_ID DM_TEXT;
 +
declare variable T_ID DM_ID_NULL;
 +
begin
 +
delete from DOC_DETAIL_ACTIVE_LOG;
 +
for select min(id), NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID from wares
 +
group by NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID
 +
having count(1)>1
 +
into id, NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID do
 +
begin
 +
for
 +
select id from wares where NAME_ID=:NAME_ID and IZG_ID=:IZG_ID and COUNTRY_ID=:COUNTRY_ID and ORIG_CODE=:ORIG_CODE
 +
and ORIG_NAME_ID=:ORIG_NAME_ID and ORIG_IZG_ID=:ORIG_IZG_ID and ORIG_COUNTRY_ID=:ORIG_COUNTRY_ID and id<>:id into :t_id do
 +
begin
 +
update DOC_DETAIL_ACTIVE set ware_id=:id where ware_id=:t_id;
 +
update DOC_DETAIL_ACTIVE_CANCELED set ware_id=:id where ware_id=:t_id;
 +
-- update DOC_DETAIL_ACTIVE_LOG set ware_id=:id where ware_id=:t_id;
 +
update DOC_DETAIL_ACTIVE_NAMEID set ware_id=:id where ware_id=:t_id;
 +
update DOC_DETAIL_ACTIVE_TREB set ware_id=:id where ware_id=:t_id;
 +
update DOC_DETAIL_DELETED set ware_id=:id where ware_id=:t_id;
 +
update OUT$ZAKAZ set ware_id=:id where ware_id=:t_id;
 +
update PARTS set ware_id=:id where ware_id=:t_id;
 +
update PARTS_LOG set ware_id=:id where ware_id=:t_id;
 +
update WAREBASE set ware_id=:id where ware_id=:t_id;
 +
update WAREBASEFOLDERS set ware_id=:id where ware_id=:t_id;
 +
update WAREBASENAMEID set ware_id=:id where ware_id=:t_id;
 +
delete from wares where id=:t_id;
 +
end
 +
--    suspend;
 +
/*    delete from wares where NAME_ID=:NAME_ID and IZG_ID=:IZG_ID and COUNTRY_ID=:COUNTRY_ID and ORIG_CODE=:ORIG_CODE
 +
and ORIG_NAME_ID=:ORIG_NAME_ID and ORIG_IZG_ID=:ORIG_IZG_ID and ORIG_COUNTRY_ID=:ORIG_COUNTRY_ID and id<>:id;
 +
suspend;
 +
*/
 +
end
 +
--  suspend;
 +
end^
 +
 +
SET TERM ; ^
 +
 +
/* Following GRANT statetements are generated automatically */
 +
 +
GRANT SELECT,DELETE ON DOC_DETAIL_ACTIVE_LOG TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,DELETE ON WARES TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE_CANCELED TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE_NAMEID TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE_TREB TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON DOC_DETAIL_DELETED TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON OUT$ZAKAZ TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON PARTS TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON PARTS_LOG TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON WAREBASE TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON WAREBASEFOLDERS TO PROCEDURE UPDPR_REPARWARES;
 +
GRANT SELECT,UPDATE ON WAREBASENAMEID TO PROCEDURE UPDPR_REPARWARES;
 +
 +
/* Existing privileges on this procedure */
 +
 +
GRANT EXECUTE ON PROCEDURE UPDPR_REPARWARES TO SYSDBA;
 
  </nowiki>
 
  </nowiki>
  
Строка 174: Строка 248:
 
В Менеджере, перед проверкой убедитесь, что в '''"Сервис"-"Параметры системы"-"Глобальный справочник"''' указаны корректные параметры '''"Строка подключения Общего заказа"''' и '''"Путь к Общему заказу"''' (при наличии программы Общий заказ).
 
В Менеджере, перед проверкой убедитесь, что в '''"Сервис"-"Параметры системы"-"Глобальный справочник"''' указаны корректные параметры '''"Строка подключения Общего заказа"''' и '''"Путь к Общему заказу"''' (при наличии программы Общий заказ).
 
После чего в меню '''"Сервис-Заказ"''' открываем окно Автозаказа и нажимаем кнопку '''"Рассчитать заказ"''', после расчета мы должны увидеть позиции в кратком, оптимальном и ассортиментном заказе. Пример внешнего вида см. ниже.
 
После чего в меню '''"Сервис-Заказ"''' открываем окно Автозаказа и нажимаем кнопку '''"Рассчитать заказ"''', после расчета мы должны увидеть позиции в кратком, оптимальном и ассортиментном заказе. Пример внешнего вида см. ниже.
 +
  
 
  Теги: автозаказ, автозаявка, заказ, заявка
 
  Теги: автозаказ, автозаявка, заказ, заявка
  
 
[[Файл:Автозаказ_внешний_вид.png|left|Окно программы]]
 
[[Файл:Автозаказ_внешний_вид.png|left|Окно программы]]

Версия 13:04, 19 декабря 2014

Заменить версию Менеджера

Заменить ManagerXP2.exe на версию 2.272.26 от октября 2014 г. или более новую.

Создать таблицу ELNAKLS

CREATE TABLE ELNAKLS(FILENAME DM_TEXT1024);

Создать таблицу EXT_DATA

CREATE TABLE EXT_DATA(ID DM_ID NOT NULL,
SNAME DM_TEXT1024,
ORIG_NAME DM_TEXT1024,
MGN_SOURCE DM_TEXT1024,
QUANT DM_DOUBLE,
PRICE DM_DOUBLE,
SUMMA DM_DOUBLE,
SDOC_TYPE DM_TEXT1024,
COMMITDATE DM_DATETIME,
DOC_TYPE DM_STATUS,
STATUS DM_STATUS,
MGN_ID DM_ID_NULL,
INSERTDT DM_DATETIME,
G$PROFILE_ID DM_ID_NULL);

 CREATE SEQUENCE GEN_EXT_DATA_ID;
 ALTER SEQUENCE GEN_EXT_DATA_ID RESTART WITH 0;

 CREATE INDEX EXT_DATA_IDX1 ON EXT_DATA (ID);
 CREATE INDEX EXT_DATA_IDX2 ON EXT_DATA (SNAME);
 CREATE INDEX EXT_DATA_IDX3 ON EXT_DATA (MGN_ID);

 CREATE OR ALTER TRIGGER EXT_DATA_BI FOR EXT_DATA
 ACTIVE BEFORE INSERT POSITION 0
 as
 begin
  new.insertdt = 'now';
  if (new.id is null) then
    new.id = gen_id(gen_ext_data_id,1);
 end;
 

Добавить в таблицу WARES поля и индексы

 ALTER TABLE WARES ADD SNAME DM_TEXT1024;
 ALTER TABLE WARES ADD MGN_NAME DM_TEXT1024;
 ALTER TABLE WARES ADD MGN_ID DM_ID_NULL;
 ALTER TABLE WARES ADD MGN_SOURCE DM_TEXT1024;

 CREATE INDEX WARES_IDX3 ON WARES (MGN_NAME);
 CREATE DESCENDING INDEX WARES_IDX4 ON WARES (MGN_NAME);
 CREATE INDEX WARES_IDX7 ON WARES (MGN_ID);
 

В представления VW_DOC_DETAIL и VW_WARES добавить поля

MGN_NAME,
MGN_ID,
MGN_SOURCE
 

как

w.mgn_name,
w.mgn_id,
w.mgn_source
 

где w - таблица WARES

В представление VW_DOC_DETAIL_ACTIVE добавить поля

MGN_NAME,
MGN_ID,
MGN_SOURCE
 

как

(select mgn_name from wares where id = da.ware_id) as mgn_name,
(select mgn_id from wares where id = da.ware_id) as mgn_id,
(select mgn_source from wares where id = da.ware_id) as mgn_source
 

В представление VW_WAREBASE добавить поле

MGN_NAME
 

как

(select mgn_name from wares where id = wb.ware_id)
 

Создать триггер WARES_BU_MGN

CREATE OR ALTER TRIGGER WARES_BU_MGN FOR WARES
ACTIVE BEFORE UPDATE POSITION 0
AS
begin

  if (new.name_id <> old.name_id) then
  begin
    new.mgn_name = null;
    new.mgn_id = 0;
  end
 
  new.sname = (select svalue from vals where id = new.name_id);
  
end;
 

В триггер WARES_BI_SNAME добавить строку

 new.sname = (select svalue from vals where id = new.name_id);
 

или создать его при отсутствии

CREATE OR ALTER TRIGGER WARES_BI_SNAME FOR WARES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
	new.sname = (select svalue from vals where id = new.name_id);
end;
 

Создать таблицу ORDER_DATA

CREATE TABLE ORDER_DATA (
    ID                       DM_ID NOT NULL /* DM_ID = BIGINT */,
    MGN_NAME                 DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
    ORDER_QUANT              DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    SHORT_ORDER_QUANT        DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    OPTIMAL_ORDER_QUANT      DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    ASSORT_ORDER_QUANT       DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_PRIHOD_QUANT        DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    REALQUANT                DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_PRIHOD_DATE         DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
    LAST_PRIHOD_PRICE        DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_WEEK_SUM            DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_2WEEKS_SUM          DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_PERIOD_SUM          DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_MONTH_SUM           DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    SEASON_SUM               DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    RASHOD_DOC_QUANT         DM_STATUS /* DM_STATUS = INTEGER */,
    PRIHOD_DOC_QUANT         DM_STATUS /* DM_STATUS = INTEGER */,
    LAST_OZ_DATE             DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
    ELNAKL_QUANT             DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    QUANT                    DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_OZ_QUANT            DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    ACTIVE_PRIHOD_DOC_QUANT  DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_OZ_PRICE            DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    LAST_RASHOD_DATE         DM_DATETIME,
    ACTIVE_ORDER_QUANT	     DM_DOUBLE,
    MGN_ID                   DM_ID_NULL /* DM_ID_NULL = BIGINT */,
    BAD_FLAG                 DM_STATUS /* DM_STATUS = INTEGER */,
    INSERTDT                 DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
    G$PROFILE_ID	     DM_ID_NULL
);
 CREATE GENERATOR GEN_ORDER_DATA_ID;
 ALTER TABLE ORDER_DATA ADD CONSTRAINT PK_ORDER_DATA PRIMARY KEY (ID);

 CREATE INDEX ORDER_DATA_IDX1 ON ORDER_DATA (MGN_NAME);
 CREATE DESCENDING INDEX ORDER_DATA_IDX2 ON ORDER_DATA (MGN_NAME);
 CREATE DESCENDING INDEX ORDER_DATA_IDX3 ON ORDER_DATA (ID);

 CREATE OR ALTER TRIGGER ORDER_DATA_BI FOR ORDER_DATA
 ACTIVE BEFORE INSERT POSITION 0
 as
 begin
  if (new.id is null) then
    new.id = gen_id(gen_order_data_id,1);
 end;
 

Дополнительно

1) Проверить, что индекс WARES_IDX1 уникален, если нет, то выполнить процедуру UPDPR_REPARWARES и сделать индекс уникальным (возможно потребуется монопольный доступ к БД)

SET TERM ^ ;

create or alter procedure UPDPR_REPARWARES
returns (
    ID DM_TEXT)
as
declare variable NAME_ID DM_TEXT;
declare variable IZG_ID DM_TEXT;
declare variable COUNTRY_ID DM_TEXT;
declare variable ORIG_CODE DM_TEXT;
declare variable ORIG_NAME_ID DM_TEXT;
declare variable ORIG_IZG_ID DM_TEXT;
declare variable ORIG_COUNTRY_ID DM_TEXT;
declare variable T_ID DM_ID_NULL;
begin
delete from DOC_DETAIL_ACTIVE_LOG;
for select min(id), NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID from wares
group by NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID
having count(1)>1
into id, NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID do
begin
for
select id from wares where NAME_ID=:NAME_ID and IZG_ID=:IZG_ID and COUNTRY_ID=:COUNTRY_ID and ORIG_CODE=:ORIG_CODE
and ORIG_NAME_ID=:ORIG_NAME_ID and ORIG_IZG_ID=:ORIG_IZG_ID and ORIG_COUNTRY_ID=:ORIG_COUNTRY_ID and id<>:id into :t_id do
begin
update DOC_DETAIL_ACTIVE set ware_id=:id where ware_id=:t_id;
update DOC_DETAIL_ACTIVE_CANCELED set ware_id=:id where ware_id=:t_id;
-- update DOC_DETAIL_ACTIVE_LOG set ware_id=:id where ware_id=:t_id;
update DOC_DETAIL_ACTIVE_NAMEID set ware_id=:id where ware_id=:t_id;
update DOC_DETAIL_ACTIVE_TREB set ware_id=:id where ware_id=:t_id;
update DOC_DETAIL_DELETED set ware_id=:id where ware_id=:t_id;
update OUT$ZAKAZ set ware_id=:id where ware_id=:t_id;
update PARTS set ware_id=:id where ware_id=:t_id;
update PARTS_LOG set ware_id=:id where ware_id=:t_id;
update WAREBASE set ware_id=:id where ware_id=:t_id;
update WAREBASEFOLDERS set ware_id=:id where ware_id=:t_id;
update WAREBASENAMEID set ware_id=:id where ware_id=:t_id;
delete from wares where id=:t_id;
end
--    suspend;
/*    delete from wares where NAME_ID=:NAME_ID and IZG_ID=:IZG_ID and COUNTRY_ID=:COUNTRY_ID and ORIG_CODE=:ORIG_CODE
and ORIG_NAME_ID=:ORIG_NAME_ID and ORIG_IZG_ID=:ORIG_IZG_ID and ORIG_COUNTRY_ID=:ORIG_COUNTRY_ID and id<>:id;
suspend;
*/
end
--  suspend;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,DELETE ON DOC_DETAIL_ACTIVE_LOG TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,DELETE ON WARES TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE_CANCELED TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE_NAMEID TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON DOC_DETAIL_ACTIVE_TREB TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON DOC_DETAIL_DELETED TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON OUT$ZAKAZ TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON PARTS TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON PARTS_LOG TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON WAREBASE TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON WAREBASEFOLDERS TO PROCEDURE UPDPR_REPARWARES;
GRANT SELECT,UPDATE ON WAREBASENAMEID TO PROCEDURE UPDPR_REPARWARES;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE UPDPR_REPARWARES TO SYSDBA;
 

Сетка

Прикрепленный файл Файл:Сетка автозаказа.zip

Проверка себя

В Менеджере, перед проверкой убедитесь, что в "Сервис"-"Параметры системы"-"Глобальный справочник" указаны корректные параметры "Строка подключения Общего заказа" и "Путь к Общему заказу" (при наличии программы Общий заказ). После чего в меню "Сервис-Заказ" открываем окно Автозаказа и нажимаем кнопку "Рассчитать заказ", после расчета мы должны увидеть позиции в кратком, оптимальном и ассортиментном заказе. Пример внешнего вида см. ниже.


Теги: автозаказ, автозаявка, заказ, заявка
Окно программы