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

Безболезненное изменение статуса заказа : Супермаг Плюс (Супермаг 2000)

23.11.2024 1:02


24.04.2013 09:31
Собственно говоря встала необходимость сменить статус заказа с черновик на размещен после отправки заказа поставщику(отправкой письма с вожением excel занимается сторонняя программа).
Возникают вопросы:
1)Чем опасен прямой апдейт статуса заказа поставщику в бд?
2)Какая процедура в см занимается пересчетом остатков и на всяк случай в какой dll она хранится, чтобы ее можно было программно вызвать?
24.04.2013 09:53
1. Опасен тем, что можно упустить какую-то обязательную сопутствующую процедуру, выполняемую при смене статуса заказа. И, как следствие - получить рассогласованное содержимое БД.
2. SUPERMAG.REMAINS, она не в dll, а в БД лежит. Рекомендую поискать по форуму по слову "остатки". И не оффтопить, если это к смене статуса заказа не имеет отношения.
24.04.2013 11:26
я вижу два варианта:
1. внешней программой (можно той же что и отправляет заказ поставщику) формировать XML файл для почтового модуля с этим же заказом, только с новым статусом...
2. ранее на форуме уже выкладывалась процедура для изменения статуса документа встроенными в СМ функциями:
Код:
DECLARE
   res       NUMBER;
   doctype   supermag.smdocuments.doctype%TYPE   := 'OR';
   docid     supermag.smdocuments.ID%TYPE        := 'ЗП012345';
BEGIN
   IF supermag.core.getproc IS NULL
   THEN
      res := supermag.core.startsmapp ();
   END IF;

   supermag.smdoclock (doctype, docid);

   BEGIN
      supermag.smenableactualizegoods;
      -- блокировка
      supermag.documents.changedocstate (doctype, docid, 1, 0);
      supermag.smactualizegoods;
      supermag.smdocunlock (doctype, docid);
   EXCEPTION
      WHEN OTHERS
      THEN
         supermag.smdocunlock (doctype, docid);
         RAISE;
   END;
END;
но мне не удалось заставить его работать в Delphi...
24.04.2013 11:38
Код:
DECLARE

pId    VARCHAR2(50);  
pLoc   NUMBER(5); 
pIdCl  NUMBER(10); 
pIdCl1 NUMBER(10); 
res number; 
curdocstate number; 
existdoc number; 
Cursor docs is
  select d.id, d.location, nvl(dd.ourselfclient, 0), d.clientindex
    from smdocuments d, smdatedocs dd
   where d.doctype = 'OR'
     and d.docstate in = '1'
     and d.id Like '%AZ'
     and d.id = dd.id
     and d.doctype = dd.doctype
Cursor loc is
  select storeloc from smpostlocmap where storeloc = pLoc;
  BEGIN 
  supermag.SMDOCLOCK('OR', pId);  
  OPEN docs;
   LOOP 
    FETCH docs INTO pId, pLoc, pIdCl, pIdCl1;
    EXIT WHEN docs%NOTFOUND;
     if supermag.core.getproc is null then         
      res := supermag.Core.StartSMApp(); 
    end if; 
    begin
      select count(id) into existdoc from smdocuments dm where dm.doctype = 'OR' and id = pId and DOCSTATE not in ('-1','2','0','3');       
      if existdoc > 0 then   
      supermag.SMENABLEACTUALIZEGOODS; 
      select docstate into curdocstate from smdocuments where doctype = 'OR' and id = pId;
      if curdocstate = 1 then
        supermag.documents.changedocstate('OR',pId,1,2);
      end if;
        supermag.SMACTUALIZEGOODS;
        supermag.SMDOCUNLOCK('OR', pId);
      exception when others then 
      supermag.SMDOCUNLOCK('OR', pId); 
    end;
     OPEN loc;
     IF loc%FOUND THEN
      insert into smpostqueue
        (enqtime,
         enqseq,
         target,
         objtype,
         objid,
         paramint,
         paramstr,
         transflags,
         virtpack,
         commentary)
        select sysdate,
               SMPOSTQUEUESEQ.Nextval,
               lm.dbaseid,
               d.doctype,
               id,
               null,
               null,
               0,
               null,
               null
          from smdocuments d, smpostlocmap lm
         where d.doctype = 'OR'
           and d.id = pId
           and lm.storeloc = d.location;
      commit; 
     END IF;  
    CLOSE loc;
   END LOOP;
  CLOSE docs; 
END;
В общем немного модифицировал код, который нашел и которая выше приведена. Не намудрил ли я сильно?))
24.04.2013 13:05
мои 5 копеек на Шарпе, может кому и пригодится
Код:
// блокировка документа на базе магазина
private bool BlockDocument(string strOraConn, string strDocType, string strDocId, out string strErrors)
        {
            using (var conOra = new OracleConnection(strOraConn))
            {
                try
                {
                    conOra.Open();
                }
                catch (Exception ex)
                {
                    strErrors = ex.Message;
                    return false;
                }

                const string txtSql = "declare " +
                                          "res number; " +
                                          "curdocstate number; " +
                                          "existdoc number; " +
                                          "clientindex number; " +
                                          "DOCTYPE supermag.smdocuments.doctype%TYPE := :vDocTypeID;  " +
                                          "DOCID   supermag.smdocuments.id%TYPE      := :vDocID;  " +
                                        "begin " +
                                          "if supermag.core.getproc is null then " +
                                             "res := supermag.Core.StartSMApp(); " +
                                          "end if; " +
                                          "begin " +
                                            "select count(id) into existdoc from smdocuments where doctype = DOCTYPE and id = DOCID and DOCSTATE <> 0; " +
                                            "if existdoc > 0 then " +
                                                "supermag.SMDOCLOCK(DOCTYPE, DOCID); " +
                                                "supermag.SMENABLEACTUALIZEGOODS; " +
                                                "select docstate into curdocstate from smdocuments where doctype = DOCTYPE and id = DOCID; " +
                                                "if curdocstate = 2 then " +
                                                    "supermag.documents.changedocstate(DOCTYPE, DOCID, 2, 1); " +
                                                    "supermag.documents.changedocstate(DOCTYPE, DOCID, 1, 0); " +
                                                "else " +
                                                    "supermag.documents.changedocstate(DOCTYPE, DOCID, 1, 0); " +
                                                "end if; " +
                                                "supermag.SMACTUALIZEGOODS; " +
                                                "supermag.SMDOCUNLOCK(DOCTYPE, DOCID); " +
                                            "end if; " +
                                          "exception when others then " +
                                            "supermag.SMDOCUNLOCK(DOCTYPE, DOCID); " +
                                            "raise; " +
                                          "end; " +
                                        "end;";
                using (var cmd = new OracleCommand(txtSql, conOra))
                {
                    cmd.Parameters.Add(new OracleParameter("vDocTypeID", OracleType.VarChar));
                    cmd.Parameters["vDocTypeID"].Value = strDocType;
                    cmd.Parameters.Add(new OracleParameter("vDocID", OracleType.VarChar));
                    cmd.Parameters["vDocID"].Value = strDocId;
                    try
                    {
                        cmd.ExecuteNonQuery();
                        strErrors = null;
                        return true;
                    }
                    catch (Exception ex)
                    {
                        strErrors = ex.Message;
                        return false;
                    }
                }
            }
        }
Часовой пояс GMT +3, время: 01:02.

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