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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Привет всем ! :)

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

Я примерно представляю, что можно идти вверх по полям до группы и получить имя первой группы ...
А дальше что делать не совсем понятно-с ... Спасибо ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

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

Сообщение Губин Игорь »

А WHO? :?:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

К сожалению, Who() возвращает только имя самого поля ... :(
Здесь нужно пробегать по полям с начала до поля и в рекурсии разворачивать вложенные группы через GetGroup().
Но есть проблема: Игорь и рекурсии - это разное ! ;)
За теми кто отстал - не возвращаться. (С) Кодекс
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

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

Сообщение PavelNK »

What-Who
Если не нравится рекурсия, можно сделать вложенные циклы, не думаю, что их будет больше 4-5
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

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

Сообщение Губин Игорь »

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

Томным голосом мисс Рокфеллер из анекдота о челночной дипломатии "а нафига?" :lol:
У меня есть фрагмент, где я делал нечто подобное (вывод полного имени с учётом подчинения) для красивого сохранения/чтения настроечной информации, но я по-простому, как сибирские лесорубы из того же анекдота, зная структуру, тупо компоную who(where()) к нужным переменным/группам.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

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

Сообщение Губин Игорь »

Игорь Столяров писал(а): 27 Февраль 2023, 9:07 например ЭДО
Как хорошо, что мне приходится заниматься с ЭДО только созданием XML :lol:
А те XML, которые приходится разбирать, требуют написания отдельной программы для каждого источника. В результате не сталкиваюсь с такими проблемами...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

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

Сообщение Губин Игорь »

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

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

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

Я не занимался разбором универсальных ЭДО, потому, возможно, описанная проблема имеет место быть. Хотя, я бы, в силу привычки и необходимости контроля, писал разбор веток самостоятельно. Но у всех свои тараканы... :dizzy:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

А почему отказались от использования name у полей кьшек и групп? Я так понял, что названия тэгов прописываете в коде при вызове методов класса. Что-то мне кажется, это ход не в ту сторону.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

finsoftrz писал(а): 27 Февраль 2023, 10:20 от использования name у полей кьшек и групп
Ну так мы разбираем весь Меркурий одним парсером.
При вызове методов указывается корневой тег разбираемой группы (или тег строки для списков).
За что-то же парсеру зацепиться же надо ! :shock:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Корневой, да. А остальные?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

finsoftrz писал(а): 27 Февраль 2023, 11:48А остальные
Корневой тег находится так же как и в скриптах по имени: XmlDoc.getElementsByTagName(TagName)
А остальные вложены в него ... или про что именно вопрос (пример) ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение 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
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Это когда значения в тэгах. Для значений в атрибутах используется другие методы, код похожий. Аналогично для загрузки в группу. Если ситуация более сложная, то через методы LoadQueueHand/LoadGroupHand делается интерфейс к кьюшам/группам, а скрипт разбора встраивается напрямую.
C6/C11, ШВС, tps/btrieve.
Ответить