Страница 1 из 4

Функция обратная WHERE()

Добавлено: 26 Февраль 2023, 20:01
Игорь Столяров
Привет всем ! :)

Вопрос: нет ли у кого-нибудь функции обратной WHERE() ?
Т.е. по номеру поля получить его полное имя в структуре данных с учётом вложенности ?

Я примерно представляю, что можно идти вверх по полям до группы и получить имя первой группы ...
А дальше что делать не совсем понятно-с ... Спасибо ! :)

Функция обратная WHERE()

Добавлено: 26 Февраль 2023, 22:57
Губин Игорь
А WHO? :?:

Функция обратная WHERE()

Добавлено: 26 Февраль 2023, 23:45
Игорь Столяров
К сожалению, Who() возвращает только имя самого поля ... :(
Здесь нужно пробегать по полям с начала до поля и в рекурсии разворачивать вложенные группы через GetGroup().
Но есть проблема: Игорь и рекурсии - это разное ! ;)

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 8:22
PavelNK
What-Who
Если не нравится рекурсия, можно сделать вложенные циклы, не думаю, что их будет больше 4-5

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 8:45
Губин Игорь
Игорь Столяров писал(а): 26 Февраль 2023, 23:45 К сожалению, Who() возвращает только имя самого поля ...
Т.е. нужна некая универсальная :dizzy: функция, которой передаётся произвольная переменная из группы, а на выход получаем развёрнутую структуру подчинения? :facepalm:

Томным голосом мисс Рокфеллер из анекдота о челночной дипломатии "а нафига?" :lol:
У меня есть фрагмент, где я делал нечто подобное (вывод полного имени с учётом подчинения) для красивого сохранения/чтения настроечной информации, но я по-простому, как сибирские лесорубы из того же анекдота, зная структуру, тупо компоную who(where()) к нужным переменным/группам.

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 9:07
Игорь Столяров
PavelNK писал(а): 27 Февраль 2023, 8:22 не думаю, что их будет больше 4-5
Это сделать легко, но не нужно делать ни в коем случае !
В соседней ветке глубина структуры обычного документа ЭДО уже 8 уровней.
И это без учёта аттрибутов и я не уверен, что здесь пробито дно. ;)
Губин Игорь писал(а): 27 Февраль 2023, 8:45 "а нафига?"
Всё просто. Есть некий пакет структрированных данных (например XML).
И есть некая структура данных его описывающая (например GROUP).
Предположим, некие дебилы постоянно используют одинаковые имена тегов в разных местах (например ЭДО).
Тогда распарсить данные из XML в GROUP можно только по полным именам полей / тегов с учётом их вложенности.

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 9:26
Губин Игорь
Игорь Столяров писал(а): 27 Февраль 2023, 9:07 например ЭДО
Как хорошо, что мне приходится заниматься с ЭДО только созданием XML :lol:
А те XML, которые приходится разбирать, требуют написания отдельной программы для каждого источника. В результате не сталкиваюсь с такими проблемами...

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 9:31
Игорь Столяров
Губин Игорь писал(а): 27 Февраль 2023, 9:24 Как хорошо, что мне приходится заниматься с ЭДО только созданием XML
Тоже недавно совсем думал так я ... ;)
Губин Игорь писал(а): 27 Февраль 2023, 9:24 требуют написания отдельной программы для каждого источника
Если это действительно документ ЭДО - то нет. Там сложные, но универсальные правила и структура.
Можно, конечно, на парс каждого XML делать отдельную программу или скрипт - но только с повремённой оплатой. ;)

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 9:49
Губин Игорь
Игорь Столяров писал(а): 27 Февраль 2023, 9:31 Если это действительно документ ЭДО
Это не документ ЭДО, это гораздо хуже )))

Это файлы обмена данными с оборудованием, для которых каждый производитель выдумывает свои структуры. Некоторые пытаются содрать "красиво" у конкурентов, в результате - полное отсутствие логики.

Одни пишут диапазон как два числа (максимум, минимум), другие - как два числа со знаком операции (число, знак операции (>, <, +-,...) и величину отклонения), третьи - как число и ссылку на то, что оно собой представляет в отдельной группе правил... И т.д. и т.п.

Я не занимался разбором универсальных ЭДО, потому, возможно, описанная проблема имеет место быть. Хотя, я бы, в силу привычки и необходимости контроля, писал разбор веток самостоятельно. Но у всех свои тараканы... :dizzy:

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 10:20
finsoftrz
А почему отказались от использования name у полей кьшек и групп? Я так понял, что названия тэгов прописываете в коде при вызове методов класса. Что-то мне кажется, это ход не в ту сторону.

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 11:20
Игорь Столяров
finsoftrz писал(а): 27 Февраль 2023, 10:20 от использования name у полей кьшек и групп
Ну так мы разбираем весь Меркурий одним парсером.
При вызове методов указывается корневой тег разбираемой группы (или тег строки для списков).
За что-то же парсеру зацепиться же надо ! :shock:

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 11:48
finsoftrz
Корневой, да. А остальные?

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 12:31
Игорь Столяров
finsoftrz писал(а): 27 Февраль 2023, 11:48А остальные
Корневой тег находится так же как и в скриптах по имени: XmlDoc.getElementsByTagName(TagName)
А остальные вложены в него ... или про что именно вопрос (пример) ?

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 13:15
finsoftrz
Я выкладывал пример с xpath. Вот вырезка со стандартными тегами. Если есть вложенные теги, то в name они указываются через "/".

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

getOst_r  routine   !загрузить остатки
   DATA
lor:queueOst queue, pre()
lor:kol           string(20), name('rst:Quantity')
lor:alcoFormaA    string(40), name('rst:InformF1RegId')
lor:alcoFormaB    string(40), name('rst:InformF2RegId')
lor:alcoCode      string(40), name('pref:AlcCode')
lor:alcoVal       string(20), name('pref:AlcVolume')
lor:alcoCap       string(20), name('pref:Capacity')
lor:alcoProdCode  string(20), name('pref:ProductVCode')
lor:proizvINN     string(20), name('oref:INN')
lor:proizvKPP     string(20), name('oref:KPP')
lor:proizvRegID   string(20), name('oref:ClientRegId')
lor:proizvCountry string(10), name('oref:Country')
lor:proizvRegion  string(10), name('oref:RegionCode')
lor:proizvIndex   string(20), name('oref:Index')
lor:proizvAdress  string(255), name('oref:description')
lor:proizvName    string(255), name('oref:ShortName')
lor:proizvNameFull string(255), name('oref:FullName')
lor:name          string(255), name('pref:ShortName')
lor:nameFull      string(255), name('pref:FullName')
.

lor:err byte

   CODE

  Loc:NameTmp=GetNameTmp(FsAccess:ActiveUserDir,'xml',0)
  Loc:NameVbsTmp=GetNameTmp(FsAccess:ActiveUserDir,'vbs',0)
  Loc:NameOutTmp=GetNameTmp(FsAccess:ActiveUserDir,'txt',0)

  lor:err=0
  fsXmlPar.init(Loc:NameTmp,Loc:NameVbsTmp,Loc:NameOutTmp)
  if DEdiH:TypeRegistr=0   !склад
     fsXmlPar.LoadQueue('rst:StockPosition','lor:queueOst',lor:queueOst)  
  else    !торговый зал
     fsXmlPar.LoadQueue('rst:ShopPosition','lor:queueOst',lor:queueOst)  
  .
  fsXmlPar.MakeScript(1)
  if fsXmlPar.ErrorCode<>0
     FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
     lor:err=1
  .
  fsXmlPar.kill

Функция обратная WHERE()

Добавлено: 27 Февраль 2023, 13:30
finsoftrz
Это когда значения в тэгах. Для значений в атрибутах используется другие методы, код похожий. Аналогично для загрузки в группу. Если ситуация более сложная, то через методы LoadQueueHand/LoadGroupHand делается интерфейс к кьюшам/группам, а скрипт разбора встраивается напрямую.