cJSON: И где логика ?

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

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

cJSON: И где логика ?

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

Добрый день !

В классе cJSON есть правило (option) для честного случая: {"IgnoreFalse":true/false}
Но очень хочется для работы полноценное правило {"IgnoreBool":"true"/"false"}
(ну или хотя бы дополнение до него {"IgnoreTrue":true/false})

Поясню. Сейчас сервисы и оборудование имеют в структуре обмена массу флагов со значением DEFAULT = true.
Поэтому даже если флаг не используется в каком-то запросе (у меня таких в структуре Queue: 42 !) нужно присваивать
ему значение Flag = True перед записью в пакет ... Я не против, проблема по которой я сейчас пишу - в другом.

В рультате получается пакет JSON в котором огромное кол-во флагов BOOL со значением "true" и даже сейчас уже
не понятно какие из них реально передаются для управления запросом, а какие отрабатывают подтверждение
установки "DEFAULT = true" (и по здравой логике их там быть не должно, т.к. не нужно изменять предустановку).

Если я вообще исключу флаг из пакета - то не смогу изменять для записей его значение на "false" при необходимости. :(
Спасибо за рассмотрение ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5226
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

cJSON: И где логика ?

Сообщение finsoftrz »

Игорь, Вам пора Михаилу зарплату начинать платить. :-)
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

finsoftrz писал(а): 15 Сентябрь 2024, 9:40 Игорь, Вам пора Михаилу зарплату начинать платить.
Если Вы интересуетесь уровнями зарплат в IT, то там на втором месте: QA-инженер (тестировщик продукта).
Но я вообще без претензий ... Догадываетесь сколько времени занимает проверка на всех режимах ? ;)
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5226
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

cJSON: И где логика ?

Сообщение finsoftrz »

Я так понимаю, Вы это из альтруизма все делаете. :-)
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

finsoftrz писал(а): 15 Сентябрь 2024, 10:14 Вы это из альтруизма все делаете
Неть ! Мною движет непреодолимое желание создавать работающие проекты, а не бесполезные посты в форуме ! :facepalm:
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5226
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

cJSON: И где логика ?

Сообщение finsoftrz »

Смотрите сами. Всегда удивляло, кода некоторые люди думают, что их желания еще кому-то интересны. :-)
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: И где логика ?

Сообщение Дед Пахом »

Ага, завтра добавим опцию IgnoreIfNameContainsZ, послезавтра IgnoreIfRetrogradnyMercury...
Колбэк FindCB вам в руки:

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

rh.FindCB                     PROCEDURE(STRING fldName, *typCJsonFieldRule rule)
  CODE
  IF rule.IsBool
    !- игнор всех bool.
    rule.Ignore = TRUE
  END

С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

Дед Пахом писал(а): 15 Сентябрь 2024, 11:31 Колбэк FindCB вам в руки:
Игнорировать все Bool несложно, т.к. их невозможно вообще выгрузить без принудительной установки "IsBool":true ;)
А вот как убрать выгрузку конкретного тега с именем "Flag123" только если его значение true ? Вот вопрос ! :)

Если для реализации полноценной работы с логическими значениями нужно обязательно делать отдельную выгрузку
для каждого запроса с настройками тегов - я не против. Точнее уже привык. Понять бы как ... Спасибо !
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: И где логика ?

Сообщение Дед Пахом »

Игорь Столяров писал(а): 15 Сентябрь 2024, 11:50 А вот как убрать выгрузку конкретного тега с именем "Flag123" только если его значение true ? Вот вопрос !
Принимая во внимание факт, что во время выполнения FindCB очередь с данными в актуальном состоянии, то можно как-то так:

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

IF LOWER(fldName) = 'flag123'
  rule.Ignore = CHOOSE(DataQueue.Flag123 = TRUE)
END
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

Спасибо, работает ! Но для каждого запроса - свой отделный метод с настройками полей в rh.FindCB(). 😭
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

Дед Пахом писал(а): 15 Сентябрь 2024, 11:31 Ага, завтра добавим опцию IgnoreIfNameContainsZ
Вы всё предвидели ! Соглашусь, что опция {"IgnoreValue":ЗНАЧЕНИЕ} была бы весьма кстати !
Не стоит беспокоиться, я сам знаю как идти в rh.FindCB() ... ;)
Последний раз редактировалось Игорь Столяров 15 Сентябрь 2024, 20:50, всего редактировалось 1 раз.
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: И где логика ?

Сообщение Дед Пахом »

Игорь Столяров писал(а): 15 Сентябрь 2024, 13:33 Но для каждого запроса - свой отделный метод с настройками полей в rh.FindCB().
Можно всё в один запихать наверно.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

Спасибо, верите в меня ! Я не сдаюсь ! :)

Подскажите пожалуйста, можем ли мы в FindCB() определить места полей с одинаковыми названиями ?
Я вижу оба поля, но как опредеить какое именно ? Пример:

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

TestJSON  Procedure
rh        Class(TCJsonRuleHelper)
FindCB      Procedure(String pFldName, *typCJsonFieldRule pRule), Derived
          end
          
Root      &cJson 
Json      cJSONFactory

Q_Flags   Queue,Type
Flag1       Bool
Flag2       Bool
          end
          
Packet    Group
PrePrint    &Q_Flags
PostPrint   &Q_Flags
!           много одинаковых списков строк :(
          end
          
qPrePrint   Queue(Q_Flags).
qPostPrint  Queue(Q_Flags).
          
  Code
  qPrePrint.Flag1  = False   
  qPrePrint.Flag2  = True
  Add(qPrePrint)

  qPostPrint.Flag1 = True
  qPostPrint.Flag2 = False
  Add(qPostPrint)
  
  Packet.PrePrint  &= qPrePrint
  Packet.PostPrint &= qPostPrint

  Root &= json::CreateObject(Packet,,'[{{"Name":"*","RuleHelper":' & Address(rh) & '},' & |
                                      '{{"Name":"PrePrint","instance":'  & Instance(Packet.PrePrint, Thread()) & '},' & |
                                      '{{"Name":"PostPrint","instance":' & Instance(Packet.PostPrint,Thread()) & '},' & |
                                      '{{"Name":"Flag1","IsBool":true},'                & |
                                      '{{"Name":"Flag2","IsBool":true}]')
                                      
                                      
  If Not Root &= Null
     Message(Root.ToString(True))
     SetClipBoard(Root.ToString(True))
     Root.Delete()
  end   
  
rh.FindCB  Procedure(String pFldName, *typCJsonFieldRule pRule)
  Code
  If Lower(pFldName) = 'flag2'
     Message(Packet.PrePrint.Flag2 & ' - ' & Packet.PostPrint.Flag2 & '|' & pRule.FieldNumber)
    ! Как узнать 
    ! pRule.Ignore = Choose(Packet.PrePrint.Flag2  = True)
    ! или
    ! pRule.Ignore = Choose(Packet.PostPrint.Flag2 = True)     
  end
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: И где логика ?

Сообщение Дед Пахом »

Игорь Столяров писал(а): 15 Сентябрь 2024, 18:33 Подскажите пожалуйста, можем ли мы в FindCB() определить места полей с одинаковыми названиями ?
Учитывая, что поля перебираются последовательно, можно как-то так:

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

rh.FindCB  Procedure(String pFldName, *typCJsonFieldRule pRule)
  Code
  !- запомним имя обрабатываемой очереди
  case Lower(pFldName)
  of 'preprint' orof 'postprint'
    self.ProcessingQueueName = Lower(pFldName)
  end

  If Lower(pFldName) = 'flag2'
    if self.ProcessingQueueName = 'preprint'
      pRule.Ignore = Choose(Packet.PrePrint.Flag2  = True)
    elseif self.ProcessingQueueName = 'postprint'
      pRule.Ignore = Choose(Packet.PostPrint.Flag2 = True)
    end
  end
Можно ещё проще:

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

rh.FindCB  Procedure(String pFldName, *typCJsonFieldRule pRule)
  Code
  !- запомним обрабатываемую очередь
  case Lower(pFldName)
  of 'preprint' 
    self.flags &= Packet.PrePrint
  of 'postprint'
     self.flags &= Packet.PostPrint
  end

  If Lower(pFldName) = 'flag2'
    pRule.Ignore = Choose(self.flags.Flag2  = True)
  end
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: И где логика ?

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

Спасибо ! Идея понятна - заголовок группы всегда идёт раньше полей группы.
Этот вариант буду пробовать - другого выхода сейчас нет. :)
Make Clarion Great Again ! 😎
Ответить