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

Сканеры, кассы, ККТ и т.д.
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4040
Зарегистрирован: 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
✯ Ветеран ✯
Сообщения: 1209
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

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

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4040
Зарегистрирован: 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
✯ Ветеран ✯
Сообщения: 1209
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

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

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4040
Зарегистрирован: 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
✯ Ветеран ✯
Сообщения: 1209
Зарегистрирован: 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
Рязань решает.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответить