Два вопроса по Queue

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1209
Зарегистрирован: 06 Ноябрь 2014, 12:48

Два вопроса по Queue

Сообщение finsoftrz » 11 Июль 2019, 8:21

Не могу представить, зачем такое надо может быть. А если надо, то кто мешает свою функцию написать.
Рязань решает.

kreator
✯ Ветеран ✯
Сообщения: 3256
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Два вопроса по Queue

Сообщение kreator » 11 Июль 2019, 10:44

finsoftrz писал(а):
11 Июль 2019, 8:21
А если надо, то кто мешает свою функцию написать.
Надо так и сделать. Раз гора никуда не идёт :D . Наверняка ещё где-нибудь пригодится. Игорь Столяров, у Вас есть такая универсальная функция? Не поделитесь с народом?
We are hard at work… for you. :)

Аватара пользователя
Admin
Администратор
Сообщения: 3410
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 11 Июль 2019, 13:30

Да нет смысла в этой функции.
А если два поля сравнить нужно, сложное условие и т.д.
Можно подумать вам сотни раз нужно количество по условию считать.
Вообще не помню ни одного случая когда нужно посчитать количество записей по условию без их обработки, т.е. без того что в функцию вы не передадите.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3410
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 12 Июль 2019, 9:16

Что нибудь такое?

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

            PROGRAM
            MAP
            END


QueueFunc   CLASS,TYPE
CountStr      PROCEDURE(*QUEUE Q, STRING Field, STRING Value, BYTE CS=TRUE),LONG
CountSubstr   PROCEDURE(*QUEUE Q, STRING Field, STRING Value, BYTE CS=TRUE),LONG
CountNum      PROCEDURE(*QUEUE Q, STRING Field, LONG Value),LONG
CountNum      PROCEDURE(*QUEUE Q, STRING Field, LONG Value1, LONG Value2),LONG
GetField      PROCEDURE(*QUEUE Q, STRING Field),*ANY
            END

QF          QueueFunc

TestQueue   QUEUE
Field1        LONG
Field2        LONG
Field3        STRING(100)
Field4        STRING(100)
            END

  CODE
  LOOP W# = 1 TO 10000
    CLEAR(TestQueue)
    TestQueue.Field1 = W#
    TestQueue.Field2 = W#*100
    TestQueue.Field3 = 'Some string #' & W#
    LOOP 10 TIMES
      TestQueue.Field4 = CLIP(TestQueue.Field4)&CHR(RANDOM(65,90))
    END
    ADD(TestQueue)
  END
  MESSAGE(QF.CountNum(TestQueue, 'Field1', 100, 112))
  MESSAGE(QF.CountStr(TestQueue, 'Field3', 'some string #10', FALSE))
  MESSAGE(QF.CountSubstr(TestQueue, 'Field4', 'ADA'))

! ============================================================================================
QueueFunc.CountStr      PROCEDURE(*QUEUE Q, STRING Field, STRING Value, BYTE CS=TRUE)!,LONG
LOC:Pos                 LONG
LOC:Counter             LONG
LOC:Field               ANY
  CODE
  LOC:Counter = 0
  GET(Q, 1)
  IF ERRORCODE() THEN RETURN 0 END

  LOC:Field &= SELF.GetField(Q, Field)
  IF LOC:Field &= NULL
    RETURN -1
  END

  LOOP LOC:Pos = 1 TO RECORDS(Q)
    GET(Q, LOC:Pos)
    IF (CS = TRUE AND CLIP(LOC:Field) = CLIP(Value)) OR |
       (CS = FALSE AND UPPER(CLIP(LOC:Field)) = UPPER(CLIP(Value)))
      LOC:Counter += 1
    END
  END
  RETURN LOC:Counter

! ============================================================================================
QueueFunc.CountSubstr   PROCEDURE(*QUEUE Q, STRING Field, STRING Value, BYTE CS=TRUE)!,LONG
LOC:Pos                 LONG
LOC:Counter             LONG
LOC:Field               ANY
  CODE
  LOC:Counter = 0
  GET(Q, 1)
  IF ERRORCODE() THEN RETURN 0 END

  LOC:Field &= SELF.GetField(Q, Field)
  IF LOC:Field &= NULL
    RETURN -1
  END

  LOOP LOC:Pos = 1 TO RECORDS(Q)
    GET(Q, LOC:Pos)
    IF (CS = TRUE AND INSTRING(CLIP(Value),LOC:Field,1,1)) OR |
       (CS = FALSE AND INSTRING(UPPER(CLIP(Value)),UPPER(LOC:Field),1,1))
      LOC:Counter += 1
    END
  END
  RETURN LOC:Counter

QueueFunc.CountNum      PROCEDURE(*QUEUE Q, STRING Field, LONG Value)!,LONG
  CODE
  RETURN SELF.CountNum(Q, Field, Value, Value)

QueueFunc.CountNum      PROCEDURE(*QUEUE Q, STRING Field, LONG Value1, LONG Value2)!,LONG
LOC:Pos                 LONG
LOC:Counter             LONG
LOC:Field               ANY
  CODE
  LOC:Counter = 0
  GET(Q, 1)
  IF ERRORCODE() THEN RETURN 0 END

  LOC:Field &= SELF.GetField(Q, Field)
  IF LOC:Field &= NULL
    RETURN -1
  END

  LOOP LOC:Pos = 1 TO RECORDS(Q)
    GET(Q, LOC:Pos)
    IF LOC:Field >= Value1 AND LOC:Field <= Value2
      LOC:Counter += 1
    END
  END
  RETURN LOC:Counter

QueueFunc.GetField      PROCEDURE(*QUEUE Q, STRING Field)!,*ANY
LOC:Index               LONG
LOC:FieldName           CSTRING(256)
LOC:AnyVar              ANY
  CODE
  LOC:Index = 1
  LOOP
    LOC:FieldName = UPPER(WHO(Q, LOC:Index))
    IF LEN(LOC:FieldName)
      IF LOC:FieldName = UPPER(Field)
        LOC:AnyVar &= WHAT(Q, LOC:Index)
        RETURN LOC:AnyVar
      END
      LOC:Index += 1
    ELSE
      RETURN LOC:AnyVar
    END
  END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Ответить