Два вопроса по Queue
Добавлено: 11 Июль 2019, 8:21
Не могу представить, зачем такое надо может быть. А если надо, то кто мешает свою функцию написать.
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Код: Выделить всё
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