Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Массово проставить цены в накладных на перемещение : Супермаг Плюс (Супермаг 2000)

22.11.2024 16:21


29.05.2012 13:54
Приветствую!
Возникла необходимость пакетного проставления цен в накладные на перемещение, можно ли это сделать средствами интерфейса супермага или же "дернуть" внешним приложением какую-либо супермажную функцию?
З.Ы. пробовал дергать
Код:
smdocgetlastincomepricefi_iw(vDocID, '0');
передавая ей в качестве второго параметра null, '1' или '0' но безрезультатно.
Смысл сего действа - обмен данными с внешней ВМС системой, которая выгружает накладные на перемещение в СМ+ через почтовый модуль.
29.05.2012 18:59
не понял цели, если честно, надо бы подробнее писать. во-первых, в админе есть опция заполнения накладных на перемещение, но если хочется снаружи, то чем update не подходит?
30.05.2012 07:16
Смысл вот в чем, после автоматического формирования складских требований они выгружаются в ВМС посредством внешнего приложения. После обработки в ВМС накладные на перемещения в торговые точки загружаются через почтовый модуль с помощью того же внешнего приложения, а затем хотелось бы заполнить их актуальными ценами последнего прихода (возможно за время обработки в ВМС цены поменялись).
Пока делаю так (скрип найден на форуме)
Код:
// получение последней цены
        public static double GetLastPrice(string strArticle, int intLocId)
        {
            double dLastPrice;
            using (var conOra = new OracleConnection(connString))
            {
                conOra.Open();
                const string txtSql = "declare " +
                                      "vArticle varchar2(10) := :article; " +
                                      "nLocID number(5,0) := :locid;  " +
                                      "nLastPrice number(8,3); " +
                                      "begin " +
                                      "SELECT coalesce(ITEMPRICE,0) into nLastPrice " +
                                      "FROM (SELECT A2.CREATEDAT, " +
                                      "A2.ID, " +
                                      "A2.LOCATIONTO, " +
                                      "B2.ARTICLE, " +
                                      "B2.ITEMPRICE, " +
                                      "B2.QUANTITY, " +
                                      "B2.TOTALPRICE, " +
                                      "ROW_NUMBER() OVER(PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN " +
                                      "FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2 " +
                                      "WHERE A2.DOCTYPE = B2.DOCTYPE " +
                                      "AND A2.ID = B2.DOCID " +
                                      "AND A2.DOCSTATE IN (2, 3) " +
                                      "AND A2.OPCODE=0 " +
                                      "AND A2.LOCATIONTO = :locid " +
                                      "AND A2.DOCTYPE in ('WI') " +
                                      "AND B2.ARTICLE IN (:article)) " +
                                      "WHERE RN = 1; " +
                                      ":nLastPrice := nLastPrice; " +
                                      "end;";

                using (var cmd = new OracleCommand(txtSql, conOra))
                {
                    cmd.Parameters.Add(new OracleParameter("article", OracleType.VarChar));
                    cmd.Parameters["article"].Value = strArticle;
                    cmd.Parameters.Add(new OracleParameter("locid", OracleType.Int16));
                    cmd.Parameters["locid"].Value = 1;
                    OracleParameter parNRec = cmd.Parameters.Add(":nLastPrice", OracleType.Number);
                    parNRec.Direction = ParameterDirection.Output;
                    try
                    {
                        cmd.ExecuteNonQuery();
                        dLastPrice = Convert.ToDouble(parNRec.Value);
                    }
                    catch (Exception exp)
                    {
                        Console.WriteLine(String.Format("Поиск последней цены привел к ошибке {0}\r\n", exp.Message));
                        dLastPrice = 0;
                    }
                }
            }
            return dLastPrice;
        }
Но получается довольно долго. Кажется встроенная функция супермага выполняет это много быстрее но "дернуть" ее не получается.
30.05.2012 09:41
Из встроенного можно попробовать:

Последние приходные
SMDOCSETLASTINCOMEPRICESIW( ADOCID IN DOCUMENTS.TDOCID, AFORCENULLS IN NUMBER, AONLYZEROS IN CORE.SMBOOL )

Продажные
SMDOCSETSELLINGPRICESIW( ADOCID IN SMSPEC.DOCID%TYPE, ASELLINGPRICE IN NUMBER, ALOCATION IN NUMBER, AFORCENULLS IN NUMBER, AONLYZEROS IN CORE.SMBOOL )

Учетные
SMDOCSETACCOUNTPRICESIW( ADOCID IN DOCUMENTS.TDOCID, AACCOUNTPRICE IN DOCUMENTS.TPRICETYPE, ALOCATIONPRICE IN DOCUMENTS.TLOCATION, AFORCENULLS IN CORE.SMBOOL, AONLYZEROS IN CORE.SMBOOL )

commit не забыть.
30.05.2012 13:39
Ого как все сложно...А долго получается потому что ищешь на один артикул за ВЕСЬ период. И IN здесь для "AND B2.ARTICLE IN (:article)) " в этом случае ни к чему...
Сейчас что нить наваяю для этого.
30.05.2012 14:19
скрипт который проставит цены последних приходов, которые были с даты создания складского требования по текущий момент - строка
AND A2.CREATEDAT>=(select h.createdat from supermag.smdocuments h where h.id='0000000001' and h.doctype='SO')
Если ты её уберешь цена последних приходов будет искаться вообще за вес период.
В этих скриптах подменяешь только '0000000001' - это номер складского требования.

Код:
UPDATE SUPERMAG.SMSPEC F SET F.ITEMPRICE=NVL(
(
SELECT LP.ITEMPRICE
FROM (SELECT B2.ARTICLE,B2.ITEMPRICE, ROW_NUMBER() OVER(PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2
WHERE A2.DOCTYPE = B2.DOCTYPE
AND A2.ID = B2.DOCID
AND A2.DOCSTATE IN (2, 3)
AND A2.OPCODE=0
AND A2.LOCATIONTO = (select h.location from supermag.smdocuments h where h.id='0000000001' and h.doctype='SO')
AND A2.DOCTYPE in ('WI')
AND B2.ARTICLE in (select r.article from supermag.smspec r where r.docid='0000000001' and r.doctype='SO')
AND A2.CREATEDAT>=(select h.createdat from supermag.smdocuments h where h.id='0000000001' and h.doctype='SO')
) LP
WHERE LP.RN = 1
AND LP.ARTICLE=F.ARTICLE
),F.ITEMPRICE)
 WHERE F.DOCTYPE='SO' AND F.DOCID='0000000001'
;
COMMIT;
теперь надо изменить суммы в спецификации этого документа
Код:
UPDATE SUPERMAG.SMSPEC F SET F.TOTALPRICE=F.QUANTITY*F.ITEMPRICE WHERE F.DOCTYPE='SO' AND F.DOCID='0000000001';
COMMIT;
остается только изменить сумму по документу
Код:
UPDATE SUPERMAG.SMDOCUMENTS D 
SET 
D.TOTALSUM=(SELECT SUM(F.TOTALPRICE) FROM SUPERMAG.SMSPEC F WHERE F.DOCTYPE=D.DOCTYPE AND F.DOCID=D.ID),
D.TOTALSUMCUR=(SELECT SUM(F.TOTALPRICE) FROM SUPERMAG.SMSPEC F WHERE F.DOCTYPE=D.DOCTYPE AND F.DOCID=D.ID)
WHERE  D.DOCTYPE='SO' AND D.ID='0000000001';
COMMIT;
вот как то так, у меня складских требований нет, я создал одно, написал цену от балды, потом глянул таблицы, скрипт написал и попробовал, все нормально отработало - цены последних приходов встали в требование, сумма по документу изменилась правильно.
30.05.2012 15:32
Цитата:
vdm Из встроенного можно попробовать:

Последние приходные
SMDOCSETLASTINCOMEPRICESIW( ADOCID IN DOCUMENTS.TDOCID, AFORCENULLS IN NUMBER, AONLYZEROS IN CORE.SMBOOL )
.....
А что правильно подставлять в качестве CORE.SMBOOL? не смог найти такой тип в PL/SQL девелопере в пакете CORE :tomato2:
30.05.2012 16:04
Заработало таким образом
Код:
declare
core_result pls_integer;
begin
if supermag.core.getproc is null then 
  core_result := supermag.Core.StartSMApp();
end if;
  supermag.documents.lockdoc('IW', 'НПххххххххх');
  smdocgetlastincomepricefi_iw('НПххххххххх', '1');
  smdocsetlastincomepricesiw('НПххххххххх', 1, '1');
  commit;
  supermag.documents.unlockdoc('IW', 'НПххххххххх');
end;
04.06.2012 07:31
В продолжение темы, можно ли так же пакетно инициировать простановку сертификатов соответствия в созданных накладных?

OlegON:
как-то ни разу не в продолжение темы, тему закрыл
Часовой пояс GMT +3, время: 16:21.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.