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

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 11:58
gopstop2007
Локальные данные

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

l_Group1  GROUP,PRE(G1)
NameField1            STRING(20)
NameField2            STRING(20)
NameField3            STRING(20)
                     END 
NameFieldNoGroup            STRING(20)
Как узнать принадлежность поля к группе и получить префикс этой группы?

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 12:32
Shur
Боюсь, я не первый, кто ещё не понял суть вопроса.

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 14:03
gopstop2007
команды с помощью которых можно узнать что поле NameField2 относится к группе под названием l_Group1 и имеет префикс G1

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 14:17
Shur
Ааа! Просто кода с ассайном (&=) не видать! А без него вопрос становится в какой-то мере бессмысленным.
Команд таких раньше было три What()/Who()/Where(). В данном случае, должно быть, Where().

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 15:09
Shur
Сорри, проверил себя -- WHERE() не отвечает на поставленный вопрос.
А вот дополнительно введенные HOWMANY()/GETGROUP()/ISGROUP() должны помочь.

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 15:47
gopstop2007
я эти команды видел-знаю :)
Shur писал(а):HOWMANY()/GETGROUP()/ISGROUP() должны помочь.
и они не подходят, так как для этих команд требуется в виде начальных значений наличие(название) самой группы, а я об этом "не знаю" изначально :)

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 15:54
Дед Пахом
Вот так я вычисляю индекс поля в группе:

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

msxml::GetFieldNumber         PROCEDURE(*GROUP pG, STRING pFieldName)
aRef                            ANY
cIndex                          LONG, AUTO
  CODE
  LOOP cIndex = 1 TO 2147483647
    aRef &= WHAT(pG, cIndex)
    IF aRef &= NULL
      BREAK
    END
    
    IF UPPER(WHO(pG, cIndex)) = UPPER(pFieldName) OR UPPER(msxml::RemovePrefix(WHO(pG, cIndex), TRUE)) = UPPER(pFieldName)
      RETURN cIndex
    END
  END
  
  RETURN 0

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 16:11
gopstop2007
:shock: Ого. Спасибо, не думал что так всё сложно :) Хотя, может кто то предложит более простой вариант :)

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 16:13
Дед Пахом
gopstop2007 писал(а): Ого. Спасибо, не думал что так всё сложно Хотя, может кто то предложит более простой вариант
Присоединяюсь, код выглядит слегка дико, но ничего лучшего я добиться не смог.

Group - узнать принадлежность

Добавлено: 06 Январь 2016, 22:26
Shur
Тут есть вот какое предложение.
Если известен конечный список групп, то ссылки на них можно держать в очереди вроде:

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

AllGroups QUEUE
GroupName   string(20)
GroupPrefix string(5)
Ref         &group
          END 
то в дальнейшем установить принадлежность к той или иной группе можно так:

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

CheckingField &= ... ! неизвестно что и главное откуда
loop I# = 1 to records(AllGroups)
   get(AllGroups, I#)
   Where# = WHERE(AllGroups.Ref, CheckingField)
   if Where# > 0 then
      message('The field ' & WHO(AllGroups.Ref, Where#) & ' belongs to ' & AllGroups.GroupName & ' which has prefix ' & AllGroups.GroupPrefix)
      break
   end !if   
end !loop 
За синтаксис не ручаюсь. Но идея может оказаться полезной.

Group - узнать принадлежность

Добавлено: 07 Январь 2016, 12:11
gopstop2007
Shur писал(а): Но идея может оказаться полезной.
спасибо, но мне кажется механизм схож на указаный Дед-ом Пахом-ом :) Может кто укажет другой... А как через язык шаблонов решается это?

Group - узнать принадлежность

Добавлено: 07 Январь 2016, 12:23
Shur
Не, у меня оригинальный способ!
Он нигде не использует строковые сравнения (UPPER()=UPPER()). Число переборов сокращено до предела!
А как изящно он разбирается с префиксом группы!
:lol:

Group - узнать принадлежность

Добавлено: 07 Январь 2016, 15:37
Дед Пахом
gopstop2007 писал(а): А как через язык шаблонов решается это?
для начала - через язык шаблонов не добраться до групп, объявленных от руки, а не в локальных/глобальных данных.

Group - узнать принадлежность

Добавлено: 07 Январь 2016, 15:40
Дед Пахом
Shur писал(а): Не, у меня оригинальный способ! Он нигде не использует строковые сравнения (UPPER()=UPPER()). Число переборов сокращено до предела! А как изящно он разбирается с префиксом группы!
Число переборов вырастет в N раз, если Вам, как и мне, надо найти индекс поля в группе по его имени (а имена в Clarion как известно регистронечувствительные). То есть "myfield", "MyFiElD" или "GRP!:MYFIELD" означает одно и то же поле одной конкретной группы. Как без UPPER?

Group - узнать принадлежность

Добавлено: 07 Январь 2016, 16:16
PavelNK
Match в помощь!