Функция обратная WHERE()
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7438
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Функция обратная WHERE()
Привет всем !
Вопрос: нет ли у кого-нибудь функции обратной WHERE() ?
Т.е. по номеру поля получить его полное имя в структуре данных с учётом вложенности ?
Я примерно представляю, что можно идти вверх по полям до группы и получить имя первой группы ...
А дальше что делать не совсем понятно-с ... Спасибо !
Вопрос: нет ли у кого-нибудь функции обратной WHERE() ?
Т.е. по номеру поля получить его полное имя в структуре данных с учётом вложенности ?
Я примерно представляю, что можно идти вверх по полям до группы и получить имя первой группы ...
А дальше что делать не совсем понятно-с ... Спасибо !
За теми кто отстал - не возвращаться. (С) Кодекс
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
- Игорь Столяров
- Ветеран движения
- Сообщения: 7438
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Функция обратная WHERE()
К сожалению, Who() возвращает только имя самого поля ...
Здесь нужно пробегать по полям с начала до поля и в рекурсии разворачивать вложенные группы через GetGroup().
Но есть проблема: Игорь и рекурсии - это разное !
Здесь нужно пробегать по полям с начала до поля и в рекурсии разворачивать вложенные группы через GetGroup().
Но есть проблема: Игорь и рекурсии - это разное !
За теми кто отстал - не возвращаться. (С) Кодекс
Функция обратная WHERE()
What-Who
Если не нравится рекурсия, можно сделать вложенные циклы, не думаю, что их будет больше 4-5
Если не нравится рекурсия, можно сделать вложенные циклы, не думаю, что их будет больше 4-5
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
Функция обратная WHERE()
Т.е. нужна некая универсальная функция, которой передаётся произвольная переменная из группы, а на выход получаем развёрнутую структуру подчинения?Игорь Столяров писал(а): ↑26 Февраль 2023, 23:45 К сожалению, Who() возвращает только имя самого поля ...
Томным голосом мисс Рокфеллер из анекдота о челночной дипломатии "а нафига?"
У меня есть фрагмент, где я делал нечто подобное (вывод полного имени с учётом подчинения) для красивого сохранения/чтения настроечной информации, но я по-простому, как сибирские лесорубы из того же анекдота, зная структуру, тупо компоную who(where()) к нужным переменным/группам.
Это я только кажусь дураком! На самом деле я полный идиот!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7438
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Функция обратная WHERE()
Это сделать легко, но не нужно делать ни в коем случае !
В соседней ветке глубина структуры обычного документа ЭДО уже 8 уровней.
И это без учёта аттрибутов и я не уверен, что здесь пробито дно.
Всё просто. Есть некий пакет структрированных данных (например XML).
И есть некая структура данных его описывающая (например GROUP).
Предположим, некие дебилы постоянно используют одинаковые имена тегов в разных местах (например ЭДО).
Тогда распарсить данные из XML в GROUP можно только по полным именам полей / тегов с учётом их вложенности.
За теми кто отстал - не возвращаться. (С) Кодекс
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
Функция обратная WHERE()
Как хорошо, что мне приходится заниматься с ЭДО только созданием XML
А те XML, которые приходится разбирать, требуют написания отдельной программы для каждого источника. В результате не сталкиваюсь с такими проблемами...
Это я только кажусь дураком! На самом деле я полный идиот!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7438
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Функция обратная WHERE()
Тоже недавно совсем думал так я ...Губин Игорь писал(а): ↑27 Февраль 2023, 9:24 Как хорошо, что мне приходится заниматься с ЭДО только созданием XML
Если это действительно документ ЭДО - то нет. Там сложные, но универсальные правила и структура.Губин Игорь писал(а): ↑27 Февраль 2023, 9:24 требуют написания отдельной программы для каждого источника
Можно, конечно, на парс каждого XML делать отдельную программу или скрипт - но только с повремённой оплатой.
За теми кто отстал - не возвращаться. (С) Кодекс
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
Функция обратная WHERE()
Это не документ ЭДО, это гораздо хуже )))
Это файлы обмена данными с оборудованием, для которых каждый производитель выдумывает свои структуры. Некоторые пытаются содрать "красиво" у конкурентов, в результате - полное отсутствие логики.
Одни пишут диапазон как два числа (максимум, минимум), другие - как два числа со знаком операции (число, знак операции (>, <, +-,...) и величину отклонения), третьи - как число и ссылку на то, что оно собой представляет в отдельной группе правил... И т.д. и т.п.
Я не занимался разбором универсальных ЭДО, потому, возможно, описанная проблема имеет место быть. Хотя, я бы, в силу привычки и необходимости контроля, писал разбор веток самостоятельно. Но у всех свои тараканы...
Это я только кажусь дураком! На самом деле я полный идиот!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4682
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 9 раз
- Поблагодарили: 37 раз
Функция обратная WHERE()
А почему отказались от использования name у полей кьшек и групп? Я так понял, что названия тэгов прописываете в коде при вызове методов класса. Что-то мне кажется, это ход не в ту сторону.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7438
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Функция обратная WHERE()
Ну так мы разбираем весь Меркурий одним парсером.
При вызове методов указывается корневой тег разбираемой группы (или тег строки для списков).
За что-то же парсеру зацепиться же надо !
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7438
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Функция обратная WHERE()
Корневой тег находится так же как и в скриптах по имени: XmlDoc.getElementsByTagName(TagName)
А остальные вложены в него ... или про что именно вопрос (пример) ?
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4682
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 9 раз
- Поблагодарили: 37 раз
Функция обратная WHERE()
Я выкладывал пример с 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
- ✯ Ветеран ✯
- Сообщения: 4682
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 9 раз
- Поблагодарили: 37 раз
Функция обратная WHERE()
Это когда значения в тэгах. Для значений в атрибутах используется другие методы, код похожий. Аналогично для загрузки в группу. Если ситуация более сложная, то через методы LoadQueueHand/LoadGroupHand делается интерфейс к кьюшам/группам, а скрипт разбора встраивается напрямую.
C6/C11, ШВС, tps/btrieve.