06.03.2007, 11:48 | #1 |
Участник
|
Какой код 1) или 2) правильный?
1) SETRANGE(...) CALCFIELDS(...) IF FIND('-') THEN REPEAT .... UNTIL NEXT=0; 2) SETRANGE(...) IF FIND('-') THEN REPEAT CALCFIELDS(...) .... UNTIL NEXT=0; Как я понимаю, 2-й - медленее 1-го, но в первом не получается расчитать вычисляемое поле (не срабатывает CALCFIELDS) - нули. |
|
06.03.2007, 12:07 | #2 |
Участник
|
FlowField-ы необходимо пересчитывать при переходе между записями. Грубо говоря нужно активизировать значение.
Т. е. 1-ый способ не то чтобы быстрее, он просто не подходит. |
|
06.03.2007, 12:08 | #3 |
Участник
|
А вы фильтруете по тем полям, по которым рассчитываете калкфилд? Если да, то по-моему следует сперва определить значения в этих полях с помощью калкфилда, а потом уже после наложения фильтра запускать цикл. Могу ошибаться, но мне кажется, что до вызова CALCFIELDS значения в этом поле пустые, стало быть и фильтр SETRANGE по этому полю вернёт вам пустую запись, и выражение IF FIND('-') ... возвратит FALSE. Сделайте так:
Record.CALCFIELDS(Field1,Field2,...); Record.SETRANGE(Field1,Value1,Value2) (или как там у вас) IF Record.FIND('-') THEN REPEAT {тело цикла} UNTIL Record.NEXT=0; |
|
06.03.2007, 12:38 | #4 |
Участник
|
Мало инфы ... Приведенные примеры разные абсолютно. И дело тут не в скорости работы. CALCFIELDS работает для записи. Не надо путать его с CALCSUMS.
|
|
06.03.2007, 15:58 | #5 |
Участник
|
Цитата:
Сообщение от Neovision
А вы фильтруете по тем полям, по которым рассчитываете калкфилд? Если да, то по-моему следует сперва определить значения в этих полях с помощью калкфилда, а потом уже после наложения фильтра запускать цикл. Могу ошибаться, но мне кажется, что до вызова CALCFIELDS значения в этом поле пустые, стало быть и фильтр SETRANGE по этому полю вернёт вам пустую запись, и выражение IF FIND('-') ... возвратит FALSE. Сделайте так:
Record.CALCFIELDS(Field1,Field2,...); Record.SETRANGE(Field1,Value1,Value2) (или как там у вас) IF Record.FIND('-') THEN REPEAT {тело цикла} UNTIL Record.NEXT=0; Цитата:
Как я понимаю, 2-й - медленее 1-го, но в первом не получается расчитать вычисляемое поле (не срабатывает CALCFIELDS) - нули.
После FIND('-') запись позиционируется и CALCFIELD работает. Первый способ однозначно не подходит. |
|
07.03.2007, 09:47 | #6 |
Участник
|
все ясно. всем спасибо. просто меня смутило то, что в отчетах обычно CALCFIELDS ставится в триггере OnPreDataItem() а не в OnAfterGetRecord() и все работает...
|
|
07.03.2007, 10:27 | #7 |
Участник
|
Странно... а я не нахожу команду CalcFields в тригере OnPreDatаItem... а вот в OnAfterGetRecord как раз есть.
|
|
17.03.2007, 00:15 | #8 |
Участник
|
|
|