[ОТВЕТИТЬ]
20.12.2011 08:48
CrazyWolf
 
Приветствую, не подскажет ли кто можно ли статусы документов СМ менять при помощи скрипта?
Нашел вот такой функционал
Цитата:
supermag.documents.changedocstate('IW', vDocID, 1, 2);
но создается такое впечатление что он только тупо меняет поле docstate и никак не влияет на движения документов (т.е. если при поднятии статуса из морды супермага проихдоит движение, например, в таблице остатков. а при вызове этой функции нет).
Собсвенно нужно это для написания внешней системы управления документами.
20.12.2011 10:49
AlexeyF
 
Не правильно писать внешнюю программу управления документами. Вам никто не расскажет полностью как этот документооборот на уровне базы работает. И у вас соответственно никогда не будет гарантий что работает однозначно надёжно, требовать с с+ уже ничего не сможете, обновление версии будет совсем нереализуемой задачей.
20.12.2011 11:05
CrazyWolf
 
Не думаю что это скажется на обновлении, я ведь не собираюсь менять струуктура таблиц.
Насчет того что С+ вряд ли откроет секрет я тож знаю, но вдруг кто - нибудь из участником докопался и это не шибко секретно.
Пока рассматриваем вариант с выплевыванием документа в XML, смены статуса там и запихиванием обратно.
20.12.2011 12:22
AlexeyF
 
Про обновление сказал потому что даже если раскопать логику, после обновления она может поменяться, структура может измениться и всё это отлавливать накладно будет. Ну да дело мастера...
Первый мой пост был на тему, почему скорее всего тебе тут никто не поможет.
Расскажи хотя бы, для чего надо самостоятельно менять статусы, идея в чём, что реализовать хочешь, чего нет в самом супермаге, тогда интересно станет ?
20.12.2011 12:34
CrazyWolf
 
Да, собсвенно, на первом этапе хочу облегчить жизнь человеку отвечающего за блокировку невыполненных заказов поставщика. Дело в том что у нас в организации это осуществляется по заявке с магазна (сам магазин прав на блокировку не имеет). Соответсвенно каждое утро человек лопатит эти заявки и копипастит необходимы для блокировки номера в фильтр супермага.
А так как заявки подаются в электронном виде то хотел реализовать следующее
1. Читаем заявки с БД системы учета заявок;
2. Регулярными выражениями вычленяем номера документов на блокировку;
3. Скармливаем эти номера модулю блокировки.
Ну а дальше есть идея распространить это на синхронизацию документов с 1с, т.е. к примеру, сняли проведение в 1с - документ ушел в черновик.
20.12.2011 12:40
OlegON
 
Дак заказы на остатки не влияют. Заблокировать и поставить в очередь...
20.12.2011 12:54
Mtirt
 
Зато влияют на ожидаемое количество.
20.12.2011 13:06
CrazyWolf
 
Цитата:
Mtirt Зато влияют на ожидаемое количество.
Точно так
20.12.2011 15:52
vdm
 
С оговорками про "не нужно так делать" и без гарантий корректности и работоспособности на вашей версии.

Код:
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;
21.12.2011 09:38
CrazyWolf
 
Огромное спасибо!
21.12.2011 15:42
CrazyWolf
 
Реализовал понижение до черновика, но при попытке понизить черновик до блокировки выходит
Код:
ORA-20502: Функция проверки: "Проверка на соответствие номера документа условиям его генерации"
ORA-06512: на  line 1ORA-20502: Функция проверки: "Проверка на соответствие номера документа условиям его генерации"
ORA-06512: на  line 1
21.12.2011 16:26
vdm
 
Скрипт под supermag выполняется ?
Попробуй для его должности в административном модуле отключи эту проверку.
22.12.2011 10:51
CrazyWolf
 
Еще раз спасибо, кажется заработало.
Если нужно могу выложить куски когда на C#.
22.12.2011 13:08
Mtirt
 
Выкладывай. Кто-нибудь рано или поздно пойдет по твоим стопам...
22.12.2011 14:05
CrazyWolf
 
Как и уважаемый vdm хочу предупредить что все это надо тщательно тестировать, пока вот такие черновые варианты.
1. Собсвенно функция блокировки
на вход строка коннекта к БД, тип документа и его номер все стринговое
на выходе - булево успешно али нет
Код:
private bool BlockDocument(string strOraConn, string strDocType, string strDocId)
        {
            using (var conOra = new OracleConnection(strOraConn))
            {
                conOra.Open();
                const string txtSql = "declare " +
                                          "res number; " +
                                          "curdocstate 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; " +
                                          "supermag.SMDOCLOCK(DOCTYPE, DOCID); " +
                                          "begin " +
                                            "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); " +
                                          "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();
                        return true;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        return false;
                    }
                }
            }
        }
Добавлено через 9 минут 43 секунды
Пытаюсь запостить еще часть кога ругается на нарушение правил. Может он так на регулярное выражение реагирует?

Добавлено через 2 минуты 35 секунд
ЗЗЫ я так понял что при смене статуса атким образом рассылка в базы магазинов происходит автоматически, а вот стату более чем на одну ступень менять нельзя.
23.12.2011 12:07
OlegON
 
Продолжение от CrazyWolf
Код:
2. Кусок когда для разбора текста заявки регулярными выражениями

using (var conSql = new SqlConnection(connString))
            {
                conSql.Open();
                const string strsql = @" тут запрос который вовращает нужные нам заявки";
                using (var cmdSql = new SqlCommand(strsql, conSql))
                {
                    cmdSql.Parameters.Add(new SqlParameter("@date", dtpChecksOrders.Value.Date));
                    using (var sqlReader = cmdSql.ExecuteReader())
                    {
                        _dtOrders.Clear();
                        while(sqlReader.Read())
                        {
                            MatchCollection matches = Regex.Matches(sqlReader["Problem_description"].ToString(), @"(\d{1}ЗП\d{7})");
                            foreach (Match match in matches)
                            {
                                _dtOrders.Rows.Add(Convert.ToInt32(sqlReader["id"]), match.Groups[1].Value, sqlReader["User_name"].ToString());
                            }
                        }
                        dgvBlockOrders.DataSource = _dtOrders;
                    }
                }
            }

где _dtOrders
_dtOrders = new DataTable();
_dtOrders.Columns.Add("IDDemands", typeof(int));
_dtOrders.Columns.Add("IDOrders", typeof(string));
_dtOrders.Columns.Add("From", typeof(string));
19.01.2012 10:45
CrazyWolf
 
Пока обкатка проходит нормально, проблем нет, функция слегка доработалась
Код:
public static bool BlockDocument(string strOraConn, string strDocType, string strDocId)
        {
            using (var conOra = new OracleConnection(strOraConn))
            {
                conOra.Open();
                const string txtSql = "declare " +
                                          "res number; " +
                                          "curdocstate number; " +
                                          "existdoc 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 " +
                                            "supermag.SMDOCLOCK(DOCTYPE, DOCID); " +
                                            "select count(id) into existdoc from smdocuments where doctype = DOCTYPE and id = DOCID and DOCSTATE <> 0; " +
                                            "if existdoc > 0 then " +
                                                "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();
                        return true;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        return false;
                    }
                }
            }
        }
Опции темы


Часовой пояс GMT +3, время: 11:45.

 

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