Страница 1 из 1
Что есть тип данных LABEL ?
Добавлено: 12 Март 2023, 8:52
Игорь Столяров
Привет всем !
Имею непреодолимое желание создать метод для обработки полей некой структуры данных.
Упрощённо что-то вроде:
Код: Выделить всё
MyGroup Group
S1 String(20)
end
Code
Message( MyMethod(MyGroup,MyGroup.S1) ) ! Ожидается = 1
...
MyMethod Procedure(*Group xGroup, XXX xLabel) !,Long
Code
Return Where(xGroup, xLabel)
Вопрос: какой тип данных должен быть вместо XXX что бы это всё заработало ?!
Или как-то вообще нужно по другому передавать метку поля MyGroup.S1 ?
Заранее спасибо за посильную помощь ...
Что есть тип данных LABEL ?
Добавлено: 12 Март 2023, 15:53
Дед Пахом
Сам удивился, но если продублировать декларацию WHERE, то работает:
Что есть тип данных LABEL ?
Добавлено: 12 Март 2023, 21:42
Игорь Столяров
Спасибо - работает.
Хотя вроде бы ранее проверял этот вариант ...
Судя по справке - происходит следующее:
------------------------------------------------------
Нетипизированные параметры-переменные представляются в прототипе процедуры звездочкой и знаком вопроса (*?).
Внутри процедуры параметр с типом переменной действует как объект такого же типа данных,
что и переменная в вызывающей процедуре, чье значение передается данным параметром.
Это означает, что во время выполнения процедуры тип данных параметра не изменяется.
Делать какие-либо предположения о типе данных принятого параметра небезопасно.
Т.е. по сути - передаётся указатель на буфер переменной неопределённого типа.
Как его использует потом Where() и что есть "метка поля в структуре" - так и осталось тайной.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 13:23
Дед Пахом
А вот так можно получить полное имя поля группы:
Код: Выделить всё
MyWho PROCEDURE(*GROUP pGrp, *? pLabel)
fldPos SIGNED, AUTO
fldRef ANY
grpRef &GROUP, AUTO
i LONG, AUTO
fldFullName STRING(256), AUTO
CODE
fldPos = WHERE(pGrp, pLabel)
IF fldPos = 0
!- the field is not a member of this group
RETURN ''
END
fldFullName = ''
LOOP i=1 TO fldPos-1
fldRef &= WHAT(pGrp, i)
IF ISGROUP(pGrp, i)
grpRef &= GETGROUP(pGrp, i)
IF WHERE(grpRef, pLabel) > 0
!- the label is a member of this inner group,
!- so append a group name and a dot.
fldFullName = CLIP(fldFullName) & WHO(pGrp, i) &'.'
END
END
END
!- append a label name itself.
fldFullName = CLIP(fldFullName) & WHO(pGrp, fldPos)
RETURN fldFullName
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 13:43
Игорь Столяров
Это пример неудачного использования Вашей предыдущей красивой идеи.
Потому, что вызов получения полного имени поля будет выглядить что-то вроде:
Код: Выделить всё
MyWho(Loc:Group,Loc:Group.File.Document.SvSchFact.SvProd.Address.AdrRF.Region)
т.е. для того, что бы получить полное имя - мы его сначала должны указать.
Единственно, что будут учтены значения Name() полей, но это можно сделать
проще - если интересно, см. класс tXML в соседней ветке форума.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 14:59
Дед Пахом
Ну по такой логике и WHO не нужен.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 17:22
Игорь Столяров
Дед Пахом писал(а): ↑13 Март 2023, 14:59
Ну по такой логике и WHO не нужен
Who() возвращает символьное имя поля по номеру - это несколько другое.
Задаём номер (выражение) - получаем имя поля.
И это имя может дублироваться в других полях структуры (и тем более с NAME)
В MyWho (или штатный Where) нужно передать полное уникальное имя поля в структуре.
И если Where вернёт номер поля, то MyWho вернёт ... полное уникальное имя поля в структуре.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 17:52
Дед Пахом
Игорь Столяров писал(а): ↑13 Март 2023, 17:22
В MyWho (или штатный Where) нужно передать полное уникальное имя поля в структуре.
Отнюдь.
Код: Выделить всё
fldref ANY
CODE
fldref &= MyGroup.InGroup3.InGroup4.S8 !- или fldRef &= WHAT(MyGroup, 12)
fldName = MyWho(MyGroup, fldref) !- вернёт INGROUP3.InGroup4_Renamed.S8_Renamed
Вообще не понимаю, о чём спор, я привёл код чисто из академического интереса, сам его не использую и понятия не имею, есть ли применение знанию полного имени поля, разве что в лог писать.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 17:58
Игорь Столяров
Дед Пахом писал(а): ↑13 Март 2023, 17:52
я привёл код чисто из академического интереса
Полностью с Вами согласен ! Нет никакого спора.
Это просто академический пример обработки структуры у которого нет практического применения.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 18:36
Дед Пахом
А вот обратной функции (MyWhat, здесь не публикую), по полному имени поля возвращающей само это поле, можно найти применение, и не одно.
Что есть тип данных LABEL ?
Добавлено: 13 Март 2023, 19:22
Игорь Столяров
Дед Пахом писал(а): ↑13 Март 2023, 18:36
здесь не публикую
Ага ! Секретный код !
Ну, если придумаю WHY - буду думать WHO ...