Страница 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, то работает:

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

MyWhere(*GROUP pGrp, *? pLabel), SIGNED

Что есть тип данных 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 ... ;)