Ответить на тему  [ Сообщений: 14 ] 
Каков алгоритм задачи поиска серийного номера. 
Автор Сообщение
Бывалый

Зарегистрирован: Вт, 22 июн 2004, 8:57
Сообщения: 119
Откуда: г. Николаев
Написано: Пт, 08 апр 2005, 22:18
Сообщение Каков алгоритм задачи поиска серийного номера.
Вопрос в следующем.
Есть документы - приходные гарантийные талоны с датой, партнером, названием товаров и их номерами.
Есть журнал с этими документами.
Нужно найти по серийному номеру когда он был получен и от кого.
Я бы предложил алгоритм поиска такой: пройтись в цикле по всем документам журнала открыть и х и посмотреть не было ли там товара с нужным номером.
Но что-то мне кажется что сдесь нужно использовать акумуляторы. Только не пойму как и вообще что это такое.


Профиль ICQ
Профи

Зарегистрирован: Чт, 18 мар 2004, 13:09
Сообщения: 341
Откуда: Coquitlam, BC, Canada
Написано: Пн, 11 апр 2005, 9:29
Сообщение 
Такое решение уже есть в конфигурации для сборщиков ПК, да и в любом производстве.

Структура аккумулятора следующая:
Измерения - Товар, Серийный номер
Значения - КолОбщ
Атрибуты - ГарантияДо, Партнер

Остальное смотреть в модуле РасчетыГарантТалоны.

_________________
Eugene Komisarenko
Software Product Developer
g-talk ekomisarenko@gmail.com


Профиль ICQ
Бывалый

Зарегистрирован: Вт, 22 июн 2004, 8:57
Сообщения: 119
Откуда: г. Николаев
Написано: Пн, 11 апр 2005, 9:40
Сообщение 
Да это я уже все видел и модуль смотрел. Но я хочу сам это реализовать со своими доработаками и поэтому хочу понять принцип.
Мой первый вариант поиска не правильный? почему? будет большое время поиска? или еще какие причины?
И не могли бы вы поподнробнее описать что деалть с аккумуляторами что бы с их помощью найти товар по номеру. ну т.е. общий алгоритм. Мне один раз понять и все.


Профиль ICQ
Профи

Зарегистрирован: Чт, 18 мар 2004, 13:09
Сообщения: 341
Откуда: Coquitlam, BC, Canada
Написано: Пн, 11 апр 2005, 9:52
Сообщение 
...первый вариант.... дело в том что любой алгоритм имеет право на жизнь. Только вот ограничения у каждого алгоритма разные. Например берем ваш алгоритм и запускаем его на журнале входящих гарантийных талонов из 1000 документов. При вашем алгоритме необходимо выполнить в худшем случае 1000 + 1000 + 1000 = 3000 sql запросов к базе данных. Результат мы получим и если повезет то встретим серийный номер быстро, повторюсь, если повезет), а если нет то ждать окончания не минуты, а часы. А теперь рассмотрим вариант с внешним хранилищем в виде, например наших аккумуляторов. Представьте себе что это 4 таблицы, данные из которых можно получить 1 sql запросом, при этом набор данных будет полностью соответствовать нашим требованиям, т.е. он будет отфильтрован, сгруппирован и отсортирован так как нам необходимо. Заполнение этого хранилища переложено на активный модуль фиксации документа. В нем мы прописываем саму процедуру заполнения этого хранилища. Данное решение увеличивает исбыточность информации, но позволяет свести процесс поиска или отбора неоходимой информации к мс, а не к суткам :). Как вы думаете работает отчет ОборотТовара ? точно также, представьте себе что нужно было бы сделать для формирования этого отчета с помощью алгоритма прохода по журналу документов :)

_________________
Eugene Komisarenko
Software Product Developer
g-talk ekomisarenko@gmail.com


Профиль ICQ
Бывалый

Зарегистрирован: Вт, 22 июн 2004, 8:57
Сообщения: 119
Откуда: г. Николаев
Написано: Пн, 11 апр 2005, 11:23
Сообщение 
Ясно, спасибо.
Только я еще алгоритм работы просил, что бы понять каков принцип работы с акумуляторами.


Профиль ICQ
Профи

Зарегистрирован: Чт, 18 мар 2004, 13:09
Сообщения: 341
Откуда: Coquitlam, BC, Canada
Написано: Пн, 11 апр 2005, 11:45
Сообщение 
Постановка задачи
"При изменении цены в карточке товара, менять цену во всех прайслистах, которые содержат данный товар".

Алгоритм.
1. Аккумулятор "Цены"
2. Измерения: Товар (link на справочник товаров), Прайслист (link на прайслисты)
3. Значения: Цена1, Цена2, Цена3, Цена4, Цена5
4. Процедура фиксации для документа "Прайслист":

Код:
procedure ChangeStateUpEP(Doc : ISDocuments; var Accept : boolean);
var
  Count, Total : integer;
  dDocDate : DateTime;
begin
  accPrice := CreateObject('Accumulators.Цены');
  dDocDate := Doc.GetDate();

  accPrice.ClearFieldBuffers;
  accPrice.ClearFieldFilters;

  Doc.SelectLines;
  nil(Count); Total := Doc.LinesCount();
  while Doc.SelectNextLine do begin
    inc(Count);

    accPrice.Товар := Doc.@Товар;
    accPrice.Прайслист := Doc;
    accPrice.Цена1 := Doc.Цена1;
    accPrice.Цена2 := Doc.Цена2;
    accPrice.Цена3 := Doc.Цена3;
    accPrice.Цена4 := Doc.Цена4;
    accPrice.Цена5 := Doc.Цена5;
    accPrice.Income(Doc, dDocDate, Count);

    // отправка сообщения клиенту
    Doc.NotifyClient(msgProceed + IntToStr(Count)+':'+IntToStr(Total), Count, Total);
    if Doc.Terminated then break;
  end;

  Accept := not Doc.Terminated
end;


5. В результате получаем хранилище в котором при фиксации любого прайслиста сохраняется информация о том что в нем есть и по каким отпускным ценам.

6. Теперь в карточке товара на любое подходящее событие вешаем вызов серверной функции:

Код:
function GetUpdatePrice(MasterData : ISDictionary; dPrice {розничная цена} : Decimal) : Variant; server;
var
  accPrice : ISAccs;
  docPrice : ISDocuments;
  vtCont : ISValueTable;
begin
  accPrice := CreateObject('Accumulators.Цены');
  vtCont := CreateObject('ValueTable');

  accPrice.SetFieldFilter('Товар', MasterData);
  accPrice.SaveGroupMotionToValueTable(0, RoundDate(CurrentDate, rdDay, True), amtBoth, 'Прайслист', -1, vtCont);

  vtCont.Select;
  while vtCont.SelectNext do begin
    docPrice := vtCont.Прайслист;

    docPrice.StateDown;
    //отобрать строки документа и пересчитать в цены для данного товара
    docPrice.Edit;
    docPrice.SelectLines;
    if docPrice.FindLineBy('Товар', MasterData) then begin
      docPrice.EditLine;
      docPrice.ЦенаОснВал := dPrice;

      docPrice.Цена1Вал := CalcPricePct(docPrice.ЕстьНДС1,docPrice.Процент1,docPrice.ЦенаОснВал,MasterData.СтавкаНДС);
      docPrice.Цена2Вал := CalcPricePct(docPrice.ЕстьНДС2,docPrice.Процент2,docPrice.ЦенаОснВал,MasterData.СтавкаНДС);
      docPrice.Цена3Вал := CalcPricePct(docPrice.ЕстьНДС3,docPrice.Процент3,docPrice.ЦенаОснВал,MasterData.СтавкаНДС);
      docPrice.Цена4Вал := CalcPricePct(docPrice.ЕстьНДС4,docPrice.Процент4,docPrice.ЦенаОснВал,MasterData.СтавкаНДС);
      docPrice.Цена5Вал := CalcPricePct(docPrice.ЕстьНДС5,docPrice.Процент5,docPrice.ЦенаОснВал,MasterData.СтавкаНДС);

      docPrice.ЦенаОсн := dPrice * MasterData.КурсОтпЦены;
      docPrice.Цена1 := docPrice.Цена1Вал * MasterData.КурсОтпЦены;
      docPrice.Цена2 := docPrice.Цена2Вал * MasterData.КурсОтпЦены;
      docPrice.Цена3 := docPrice.Цена3Вал * MasterData.КурсОтпЦены;
      docPrice.Цена4 := docPrice.Цена4Вал * MasterData.КурсОтпЦены;
      docPrice.Цена5 := docPrice.Цена5Вал * MasterData.КурсОтпЦены;
      docPrice.PostLine;

      result := ArrayOf(docPrice.Цена2Вал, docPrice.Цена3Вал);
    end;
    docPrice.Post;
    docPrice.StateUp;
  end;
end;


7. В результате при изменении розничной цены в карточке товара мы отбираем все прайслисты в которых встречается данный товар и пересчитываем в них цены исходя из розничной и скидок заданных в прайслистах.

8. Данный пример демонстрирует как можно быстро получить список интересуемых документов, которые необходимо как-то менять или использовать. Сравните алгоритм отбора конкретных позиций во временную табличку значений:

Код:
accPrice.SetFieldFilter('Товар', MasterData);
accPrice.SaveGroupMotionToValueTable(0, RoundDate(CurrentDate, rdDay, True), amtBoth, 'Прайслист', -1, vtCont);


9. От алгоритма прохода по всем прайслистам и поиска по табличным частям того что надо, причем если в первом варианте система сразу отбирает то что надо, то во втором признак остановы - это последний документ в журнале, а их может быть ТЬМА !!

_________________
Eugene Komisarenko
Software Product Developer
g-talk ekomisarenko@gmail.com


Профиль ICQ
Бывалый

Зарегистрирован: Вт, 22 июн 2004, 8:57
Сообщения: 119
Откуда: г. Николаев
Написано: Вт, 12 апр 2005, 17:07
Сообщение 
Спасибо. Работает.
Только теперь такой вопрос. А если мы знаем только чатсь номера, например посдедние 6 цифр. Как найти по части номера?


Профиль ICQ
Профи

Зарегистрирован: Чт, 18 мар 2004, 13:09
Сообщения: 341
Откуда: Coquitlam, BC, Canada
Написано: Ср, 13 апр 2005, 10:37
Сообщение 
Если в интерактиве для справочника, то по маске: *[часть номера]

Если программно, то зависит от реализации. Какая структура аккумулятора ?
И как отбираются данные при получении из него информации ?

_________________
Eugene Komisarenko
Software Product Developer
g-talk ekomisarenko@gmail.com


Профиль ICQ
Бывалый

Зарегистрирован: Вт, 22 июн 2004, 8:57
Сообщения: 119
Откуда: г. Николаев
Написано: Ср, 13 апр 2005, 18:08
Сообщение 
Аккумулятор: измерения: Товар - линк на товар и СерийныйНомер - String;
Делаю поиск так:
accSerNum.SetFieldFilter('СерийныйНомер', SN1);
accSerNum.SaveGroupMotionToValueTable(DateFrom, DateTo, amtBoth, 'Партнер;ГарантияДо;Товар;НазваниеДокумента;ДатаДокумента;НомерДокумента;СерийныйНомер', -1, DocsTbl);

где SN номер для поиска;
Так вот вопрос - как найти если известна только часть этого номера?


Профиль ICQ
Бывалый

Зарегистрирован: Вт, 22 июн 2004, 8:57
Сообщения: 119
Откуда: г. Николаев
Написано: Ср, 13 апр 2005, 22:32
Сообщение 
Есть такая идея:
Предположим что максимальная длина серийного номера может быть 10 символов. Тогда добавляем в аккумулятор еще 10 измерений для серийного номера с длиной от 1 до 10 символов. И потом при поиске в зависимости от длины введенного номера ищем по сответствующему измерению. Что можете сказать по этому поводу?

[off]Добавлено [Ср, 13 Апр 2005, 22:34]:[/off]

Хотя это конечно не позволит искать например по строке входящей в середину номера, а только по последним цифрам номера.


Профиль ICQ
Гуру

Зарегистрирован: Чт, 18 мар 2004, 11:49
Сообщения: 1148
Откуда: Львов
Написано: Чт, 14 апр 2005, 10:07
Сообщение 
Цитата:
Тогда добавляем в аккумулятор еще 10 измерений

Измерения в аккумуляторе не "резиновые" - всего доступно 12 полей(LINK-поле занимает 2 поля). На атрибуты ограничений нет, но в данном случае это все равно плохая идея.

Возможный вариант выглядит так
1.Поле "СерийныйНомер" делаем Link(Справочники.СерийныеНомера) и соответственно меняем фиксацию и заносим значения
2.На клиенте на Справочник "СерийныеНомера" накладываем необходимое условие частичного совпадения, используя

procedure CreateDefineSelectParams(Active:Boolean; TypeLine:Integer; Clause:String; FieldName:String; Predicate:String; Value:Variant);

Active - активное ли условие;
TypeLine - Тип Условия - может принимать (tlStandart - стандартное условие,tlSub - дополнительное условие)
Clause - 'AND' или 'OR' для первой строчки не влияет, для следующих определяет как стыковать условия
FieldName - Имя поля (можно указывать тип понятия + сигнатуру + название поля, для выборки по подчененным справочникам)
Predicate - Предикат (>, <, <>, =, >=, <=, LIKE - включает, NOT LIKE - не включает, LIKE% - начинается, %LIKE - заканчивается )
Value - Значение (любое совместимое с Variant или Справочник спозиционированный на запись, если для поля типа Link)

Пример:
procedure ToolButton3_Click(Sender : TObject);
var
D : ICDictionary;
begin
D := CreateObject('Справочники.Города');
D.FindByName('UMC',False);
MasterData.CreateDefineSelectParams(True,0,'and','Справочники.Телефоны.Город','=',D);
end;
2.Создаем объект на сервере(серверная процедура)
MySrvSerNumDict
3.Далее на клиенте вызываем
MySerNumDict.AssignSelectParamsOnSrv(Null);
4.Далее запускаем серверную процедуру, где прописываем
MySrvSerNumDict.SaveToValueTable('СерийныйНомер', MyValueTable, 1, MySrvSerNumDict.RecordCount);
5.Далее на сервере
accSerNum.SetFieldFilter('СерийныйНомер', MyValueTable);
accSerNum.SaveGroupMotionToValueTable(DateFrom, DateTo, amtBoth, 'Партнер;ГарантияДо;Товар;НазваниеДокумента;ДатаДокумента;НомерДокумент а;СерийныйНомер', -1, DocsTbl);

P.S. Обязательно прочитайте документацию для разработчика по упомянутым выше функциям
Предложенный вариант не проверялся, но теоретически должен работать :)


Профиль
Профи

Зарегистрирован: Чт, 18 мар 2004, 13:09
Сообщения: 341
Откуда: Coquitlam, BC, Canada
Написано: Чт, 14 апр 2005, 10:19
Сообщение 
Вы видели как работает режим Серийные номера для производства ?

Все в интерактиве. Сначала поиск товара. Потом поиск серийного номера в другом окне (справа).
Думаю это пока единственная возможность. А по поводу программного поиска по части серийного номера, то это скорее должно быть что-то похожее на перебор всех серийных номеров для данного товара, т.е. отбираем серийные номера для товара и по ним в цикле поиск, причем как отсортировать этот список надо думать... а по поводу кучи измерений, то тут лучше атрибутами аккумулятора пользоваться... причем как? надо думать... пока не готов ответить... возможно один из вариантов сделать столько дополнительных атрибутов сколько символов в серийном номере все типа стринг на один символ... и при поиске ставить фильтр на те позиции, которые вводяться... такое решение позволит решить вопросы поиска по маске:
1. *[часть серийного номера]
2. [часть серийного номера]*

Но не позволит найти вариант *[часть серийного номера]*
...что-нибудь придумаю напишу...

Но решение от Виталия намного красивее и правильнее, как я забыл про эту чудную функцию отбора для справочника... :)

_________________
Eugene Komisarenko
Software Product Developer
g-talk ekomisarenko@gmail.com


Профиль ICQ
Тех. поддержка

Зарегистрирован: Пт, 19 мар 2004, 15:28
Сообщения: 125
Откуда: Львов
Написано: Чт, 14 апр 2005, 16:06
Сообщение 
sas,

А может, все-таки, Вы огласите полностью задание, которое перед Вами стоит, а не пытаетесь решить 1% общей задачи.


Профиль WWW
Гуру
Аватара пользователя

Зарегистрирован: Ср, 18 авг 2004, 18:54
Сообщения: 1699
Откуда: Тячівський р-н, Сонячне Закарпаттячко
Написано: Ср, 22 май 2013, 13:27
Сообщение Re: Каков алгоритм задачи поиска серийного номера.
Vitaliy писал(а):
procedure CreateDefineSelectParams(Active:Boolean; TypeLine:Integer; Clause:String; FieldName:String; Predicate:String; Value:Variant);

Vitaliy писал(а):
P.S. Обязательно прочитайте документацию для разработчика по упомянутым выше функциям

Скажите пожалуйста, в какой документации разработчика, поставляемой Вами на компакт-диске, существует хотя бы упоминание об этой функции ?

_________________
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте" (c) ...
Этот пост выражает мнение партнера АБ-Системы, и является совокупностью идей, мыслей, предложений пользователей АБ-Офиса.


Профиль WWW
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 14 ] 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware.
Русская поддержка phpBB