Работа с Меркурием

Сканеры, кассы, ККТ и т.д.
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 27 Июнь 2019, 8:25

Так и не смог я отжать из Меркурия справочник видов исследований продукции … :(

Код: Выделить всё

        Loc:Request.Cat('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '            & |
                                          'xmlns:ws="http://api.vetrf.ru/schema/cdm/registry/ws-definitions/v2" ' & |
                                          'xmlns:bs="http://api.vetrf.ru/schema/cdm/base">'           & '<13,10>' & |
                          '<soapenv:Header/>'                                                         & '<13,10>' & |
                          '<soapenv:Body>'                                                            & '<13,10>' & |
                            '<ws:getResearchMethodListRequest>'                                       & '<13,10>' & |
                              '<bs:listOptions>'                                                      & '<13,10>' & |
                                '<bs:count>10</bs:count>'           & '<13,10>' & |
                                '<bs:offset>0</bs:offset>'          & '<13,10>' & |
                              '</bs:listOptions>'                                                     & '<13,10>' & |
                            '</ws:getResearchMethodListRequest>'                                      & '<13,10>' & |
                          '</soapenv:Body>'                                                           & '<13,10>' & |
                        '</soapenv:Envelope>'                                                                       |
                       )
Тут что-то выше моего понимания. Если кто-нибудь видит ошибку в запросе - ткните меня носом в неё пожалуйста … :)
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 27 Июнь 2019, 14:17

Игорь, судя по подобным вопросам на форумах, Вы не одиноки.
У меня тоже не работает...
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 28 Июнь 2019, 7:11

finsoftrz писал(а):
27 Июнь 2019, 14:17
У меня тоже не работает...
Спасибо ! Значит на этот раз проблема всё-таки в бобине … :)

Я тут ещё напоролся на технологическое ограничение Clarion при распарсе (#очень плохое слово) XML Меркурия.
В конструкции вроде:

Код: Выделить всё

MyQueue  Queue
...
containerNumber2 CString(41),  Name('VeryVeryLongName')
...  
end
длина этого самого 'VeryVeryLongName' ограничена-то оказывается нищенскими 100 символами … Во !
А для XML Меркурия с 10-ю уровнями вложенности и наименованиями тегов вроде "vd:certifiedConsignment" - это ничто. :(
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 28 Июнь 2019, 18:51

Не сталкивался. Имена определяются относительно узла. Обход такого ограничения напрашивается - использовать алиасы. Например,
field string(128), name('alias_1')
И назначение алиаса методом FsXMLpar.AliasAdd(1,'vd:certifiedConsignment....').
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 28 Июнь 2019, 20:34

finsoftrz писал(а):
28 Июнь 2019, 18:51
Обход такого ограничения напрашивается - использовать алиасы
Ну да … но достаточно муторно содержать и согласовывать QUEUE и отдельный список алиасов.
Тут же ещё есть разница в технологическом подходе - Вы под каждый XML создаёте свой, заточенный именно под него парсер (скрипт),
а я иду по пути разбора всех вариантов XML одним, универсальным парсером, в т.ч. и с вложенными тегами списков без XPATH …
Поэтому мне в имени поля нужен полный путь от корневого тега строки в XML ...

Как частный вариант такого решения можно сделать группу с таблицей имён и получать по номеру поля в GROUP его имя
для любой QUEUE - но всё равно, нужно содержать QUEUE И GROUP с описанием её полей и передавать их в парсер.

Код: Выделить всё

MyQueue  Queue
...
containerNumber2 CString(41) ! Поле номер 77
...  
end

MyName Group
…
NameField77 CString('VeryVeryLongName')  ! Имя поля 77 в MyQueue
…
end
Но ... вилы ! Пошёл пока по пути костылей - макроподстановок - те же алиасы, только проще.

Код: Выделить всё

MyQueue  Queue
...
containerNumber2 CString(41),  Name('#01LongName')
...  
end
И в парсере таблица констант, что "#01" заменить в имени на "VeryVery". Дёшево и сердито. :)
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 28 Июнь 2019, 20:58

Ммм... Вроде я про тоже самое писал. Навешиваем список алиасов, а при генерации vbscript используем его. То есть к обычному коду добавляется только назначение алиасов методом AliasAdd. И все. Все загружается полностью автоматически, на основе сопоставления названий тэгов в исходном xml и имен полей в кьюшке. То есть одним методом (в простом случае). Плюс строчка добавления алиаса, если имя слишком длинное.

Без алиасов.

Код: Выделить всё

getCountrys_r  routine   !запрос стран
   DATA

lor:queue queue, pre()
lor:name   string(128), name('dt:name')
lor:guid    string(80), name('bs:guid')
  .

   CODE

  fsXmlPar.init(Loc:NameTmp,Loc:NameVbsTmp,Loc:NameOutTmp)
  fsXmlPar.LoadQueue('dt:country','lor:queue',lor:queue)
  fsXmlPar.MakeScript(1)
  if fsXmlPar.ErrorCode<>0
     FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
     loc:err=1
  .
  fsXmlPar.kill
С алиасом.

Код: Выделить всё

getCountrys_r  routine   !запрос стран
   DATA

lor:queue queue, pre()
lor:name   string(128), name('alias_1')
lor:guid    string(80), name('bs:guid')
  .

   CODE

  fsXmlPar.init(Loc:NameTmp,Loc:NameVbsTmp,Loc:NameOutTmp)
  fsXmlPar.AliasAdd(1,'dt:name') 
  fsXmlPar.LoadQueue('dt:country','lor:queue',lor:queue)
  fsXmlPar.MakeScript(1)
  if fsXmlPar.ErrorCode<>0
     FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
     loc:err=1
  .
  fsXmlPar.kill
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 04 Июль 2019, 7:58

Чем дальше в лес - тем толще партизаны ! :)
Выяснилось, что вопреки правил связи списков БД (да и вообще законов божьих) существует отношение ХС <<-->> ПЛОЩАДКИ.
Такого удара в спину никто не ожидал - пришлось уже на ходу переделывать. :(
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 04 Июль 2019, 9:32

В запросах всегда указываются и ХС, и площадка. Чтобы площадка с одним guid относилась к нескольким ХС, я не сталкивался, но вполне возможно. Если перевести на человеческий язык, то есть в одном магазине могут работать несколько фирм.

По Ветису у меня новая фишка. Можно работать с серверов, не имеющих прямого выхода в интернет. Некоторые маньячат по поводу безопасности. И я в их числе... :-)
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 04 Июль 2019, 11:14

finsoftrz писал(а):
04 Июль 2019, 9:32
площадка с одним guid относилась к нескольким ХС, я не сталкивался
Я тоже, пока не получил ошибку дубликата ключа "GUID ХС + GUID площадка". :(
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 04 Июль 2019, 11:30

Ммм... А зачем такой ключ нужен, если не секрет? Может, мне тоже захочется...
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 04 Июль 2019, 11:53

finsoftrz писал(а):
04 Июль 2019, 11:30
Может, мне тоже захочется...
Уникальный ключ для отбора площадок по выбранному ХС.
Надо же как-то контролировать загрузку площадок для ХС.
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 04 Июль 2019, 12:16

Я в справочнике контрагентов храню оба этих значения. Поставщики и покупатели обмениваются ими, прежде чем начинать работу. Площадки могут быть и задвоены, надо договариваться, куда слать документы.
Рязань решает.

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 02 Август 2019, 17:31

Одна из проблем при формировании отгрузочных всд в том, что не всем товарам, полученным от поставщиков, присвоен guid. До 2019 года ветеринарные справки содержали guid трех уровневого справочника продукции, с помощью которого нельзя было точно классифицировать конкретный товар. А название товара писалось в произвольном виде. Например, Пищевые продукты - Молоко и молочная продукция - Йогурты. 1 уровень определяется кодом, 2 и 3 уровни имеют свои guid. Конкретный товар в произвольном виде, например, "Биойогурт Слобода с вишней 2,9% 125 мл".
Потом спохватились и обязали производителей присваивать guid своей продукции (так называемый четвертый уровень справочника продукции), дав им переходный период.

Сейчас, когда начали в оптовке формировать отгрузочные всд, некоторые партии полученных товаров в Ветисе числятся без guid 4 уровня. Для автоматизации сопоставления можно вместо guid сохранять в справочнике товаров название, хотя сложно сказать, какая длина у него может быть. Или оставить отгрузку таких партий на ручном выборе с фильтрацией по фрагментам названия. Я склонился ко второму варианту. Большая часть партий уже с guid 4 уровня.
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Работа с Меркурием

Сообщение Игорь Столяров » 02 Август 2019, 18:29

finsoftrz писал(а):
02 Август 2019, 17:31
хотя сложно сказать, какая длина у него может быть
Тег <vd:productItem><dt:name> имеет тип данных STRING255 и является обязательным (в отличии от <vd:productItem><bs:guid>).

Поэтому просто получаем комбинацию <dt:name> + <bs:guid> из входящего ВСД для партии товара по складскому журналу и
переносим её в исходящий ВСД … Разве нет ? По крайне мере при оформлении возврата, сам Ветис.API именно так создаёт
исходящий ВСД ...
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

Работа с Меркурием

Сообщение finsoftrz » 02 Август 2019, 19:11

Нет, в отгрузочном всд (точнее, xml запросе на отгрузку) товар вообще не фигурирует. Там указывается uuid партии на складе. Guid товара нам нужен при привязке складских партий к отгрузке. То есть мы вначале запрашиваем из Ветис партии с остатками. Партия может иметь guid товара или только название. Когда есть guid у партии и он же предварительно сохраненный в справочнике товаров учетной системы, то мы можем автоматически сделать привязку партий к отгрузкам в хронологическом порядке следования. Если нет, то только вручную. При ручной привязке мы можем предложить сразу список партий по конкретному товару при наличии guid. Если guid нет, то выбор из общего списка всех партий (с поиском, фильтрацией), но все равно тут есть риск ошибки со стороны пользователя.

В целом алгоритм сейчас такой. На основании обычных отгрузочных накладных формируются отгрузочные всд. За период, по контрагенту, ручному выбору накладных. Включаются только те покупатели, у которых прописаны guid хс и площадки, и те товары, которым присвоен guid (присвоение делается проще всего при получении входящего всд).
Затем запрашиваются партии с остатками. Эти партии привязываются к отгрузочным всд в хронологическом порядке, с учетом сроков годности. Затем уже можно поправить привязку партий вручную, отправить в ветис, распечатать сопроводительные формы с qr кодами.
Рязань решает.

Ответить