28.02.2005, 13:51 | #1 |
Участник
|
Я пока ещё разбираюсь с C/AL, посему возник следующий вопрос:
Допустим есть запись Customer и поле "No.".. Customer."No." Как оформить присваивание значения Customer."No." какой-нибудь переменной text типа Code? |
|
28.02.2005, 14:17 | #2 |
NavAx
|
Почитайте хелп про GET и FIND, если Вам нужно в переменную типа Code передать значение Customer."No."
Почитайте хелп про INSERT, MODIFY, RENAME и DELETE, если нужно наоборот передать в Customer."No." значение переменной.
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
28.02.2005, 15:44 | #3 |
Участник
|
Спасибо.. в этом разобрался..
Тогда ещё один вопрос: Допустим в записи сколько-то там номеров клиентов.. как мне получить общее число этих клиентов? Объясню зачем это нужно: просто захотелось мне изменить каждый номер клиента.. например был 6201, а стал 96201, был 6207, а стал 96207.. и так со всеми.. Вот как это сделать? То есть как работать со всеми значениями поля? Как оформить такой цикл? Надеюсь не сильно тупо сформулирован вопрос.. я пытаюсь разобраться |
|
28.02.2005, 16:08 | #4 |
Участник
|
Цитата:
Сообщение от Inso
Спасибо.. в этом разобрался..
Тогда ещё один вопрос: Допустим в записи сколько-то там номеров клиентов.. как мне получить общее число этих клиентов? Объясню зачем это нужно: просто захотелось мне изменить каждый номер клиента.. например был 6201, а стал 96201, был 6207, а стал 96207.. и так со всеми.. Вот как это сделать? То есть как работать со всеми значениями поля? Как оформить такой цикл? Надеюсь не сильно тупо сформулирован вопрос.. я пытаюсь разобраться цикл будет выглядеть, например, так: Customer.FIND('-'); REPEAT // тело цикла UNTIL Customer.NEXT=0; Но для твоей задачи быстрее будет использовать репорт |
|
28.02.2005, 16:11 | #5 |
NavAx
|
Нифига не понял, если честно.
Количество всех записей в таблице - rec.COUNT или Rec.COUNTAPPROX (действует с учетом фильтров, см. хелп). Как оформить цикл - еще раз, посмотрите хелп по FIND. Заодно по NEXT, там приводится пример, как пробежаться циклом по всей таблице.
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
28.02.2005, 16:14 | #6 |
Участник
|
а что будет представлять собой тело цикла?
и что означает Customer.NEXT=0? (кроме как условие true).. значений больше нет или что-то другое? |
|
28.02.2005, 16:15 | #7 |
Участник
|
Цитата:
Сообщение от Дуд
Нифига не понял, если честно.
Количество всех записей в таблице - rec.COUNT или Rec.COUNTAPPROX (действует с учетом фильтров, см. хелп). Как оформить цикл - еще раз, посмотрите хелп по FIND. Заодно по NEXT, там приводится пример, как пробежаться циклом по всей таблице. |
|
28.02.2005, 16:18 | #8 |
Участник
|
Цитата:
Сообщение от Inso
а что будет представлять собой тело цикла?
и что означает Customer.NEXT=0? (кроме как условие true).. значений больше нет или что-то другое? |
|
03.03.2005, 10:39 | #9 |
Заноза в заднице
|
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.
RESET(Customer); //сбрасываем все фильтры = все записи таблицы IsCount := Customer.COUNT; Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи IsCount := Customer.COUNT; Вот и вся любовь...
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! |
|
03.03.2005, 11:33 | #10 |
Участник
|
Цитата:
Сообщение от Likefire
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.
RESET(Customer); //сбрасываем все фильтры = все записи таблицы IsCount := Customer.COUNT; Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи IsCount := Customer.COUNT; Вот и вся любовь... Не понял идеи. При чём здесь COUNT? Искать последнюю запись с помощью цикла - далеко не лучшая идея, конечно :-) Но вопрос был не об этом - человеку, как я понял, нужно изменить значение поля во всех записях. В этом деле COUNT точно не поможет, там без цикла не обойтись. Для того, чтобы найти последнюю запись, на самом деле, существует такой простой метод как FIND('+') В примере кода, приведённом Вами я опять-таки не увидел поиска поска записи. RESET(Customer); //сбрасываем все фильтры = все записи таблицы IsCount := Customer.COUNT; Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи IsCount := Customer.COUNT; Вы здесь дважды считаете количество записей. Первый раз - всего в такблице, второй - количество записей, удовлетворяющих фильтру. А где, собственно, поиск? |
|
03.03.2005, 11:35 | #11 |
Участник
|
Цитата:
Сообщение от Дуд
Нифига не понял, если честно.
Количество всех записей в таблице - rec.COUNT или Rec.COUNTAPPROX (действует с учетом фильтров, см. хелп). Как оформить цикл - еще раз, посмотрите хелп по FIND. Заодно по NEXT, там приводится пример, как пробежаться циклом по всей таблице. |
|
03.03.2005, 11:48 | #12 |
NavAx
|
Цитата:
Сообщение от Shoorik
Вы имеете в виду, что COUNTAPPROX действует с учётом фильтров? А COUNT не учитывает фильтры? Или я Вас неправильно понял?
Все написано в хелпе.
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
03.03.2005, 12:00 | #13 |
Участник
|
Цитата:
Сообщение от Дуд
Цитата:
Сообщение от Shoorik
Вы имеете в виду, что COUNTAPPROX действует с учётом фильтров? А COUNT не учитывает фильтры? Или я Вас неправильно понял?
Все написано в хелпе. Просто я неверно понял Ваше сообщение, что и смутило. Теперь всё вернулось на свои места. :-) |
|
03.03.2005, 12:14 | #14 |
Moderator
|
Можно вставить два слова?
В случае если таблица Table содержит flow fields типа Sum, а также имеет немаленький размер (допустим >10 000 записей), то количество элементов в этой таблице быстрее посчитать не через Table.COUNT или Table.COUNTAPPROX, а через перебор всех элементов с суммированием переменной-счетчика. Баг навиженовского движка. |
|
03.03.2005, 16:57 | #15 |
Заноза в заднице
|
Цитата:
Сообщение от Shoorik
Цитата:
Сообщение от Likefire
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.
RESET(Customer); //сбрасываем все фильтры = все записи таблицы IsCount := Customer.COUNT; Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи IsCount := Customer.COUNT; Вот и вся любовь... Не понял идеи. При чём здесь COUNT? Искать последнюю запись с помощью цикла - далеко не лучшая идея, конечно :-) Но вопрос был не об этом - человеку, как я понял, нужно изменить значение поля во всех записях. В этом деле COUNT точно не поможет, там без цикла не обойтись. Для того, чтобы найти последнюю запись, на самом деле, существует такой простой метод как FIND('+') В примере кода, приведённом Вами я опять-таки не увидел поиска поска записи. RESET(Customer); //сбрасываем все фильтры = все записи таблицы IsCount := Customer.COUNT; Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи IsCount := Customer.COUNT; Вы здесь дважды считаете количество записей. Первый раз - всего в такблице, второй - количество записей, удовлетворяющих фильтру. А где, собственно, поиск? Да,- я дважды считаю количество записей, но только для примера, чтобы было понятно, что при применении фильтров, инструкция COUNT передаёт различные значения... А насчёт бага навиженовского движка - справедливо, да и flowfield'ы типа SUM в больших таблицах встречаются достаточно часто. Про то, что умно, а что неумно - погорячился... И ещё: насчёт RESET... Конечно же нужно применять инструкцию не RESET(Customer), а Customer.RESET...
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! |
|
03.03.2005, 17:10 | #16 |
NavAx
|
Ребят, вам не кажется, что вы к словам друг друга придираетесь? (я не о замечании Tyrex'а)
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
03.03.2005, 18:24 | #17 |
Участник
|
Цитата:
Сообщение от Likefire
Вообще-то человеку нужно было общее количество записей в таблице...
Цитата:
Сообщение от Likefire
А насчёт бага навиженовского движка - справедливо, да и flowfield'ы типа SUM в больших таблицах встречаются достаточно часто.
Например, у меня есть таблица AVT, содержащая ~25000 записей с тремя вычисляемыми полями типа SUM. Монитор клиента показывает, что на вызов AVT.COUNT требуется 16 мс. Прочитав замечание tyrex, написал такой код: <div class='CALtop'>C/AL</div><div class='CAL'>IF AVT.FIND('-') THEN REPEAT Cnt += 1; UNTIL AVT.NEXT = 0;</div> Работает сильно медленне. В какой ситуации перебор оказывается быстрее? |
|
03.03.2005, 19:00 | #18 |
Участник
|
Код: { VAR i Integer Customer Record Customer Start Time Finish Time } WITH Customer DO BEGIN Start := TIME; i := COUNT; Finish := TIME; IF NOT CONFIRM(STRSUBSTNO('Simple COUNT = %1, takes %2 msec\Continue?', i, (Finish - Start))) THEN ERROR(''); SETFILTER(Balance, '<>0'); Start := TIME; i := COUNT; Finish := TIME; IF NOT CONFIRM(STRSUBSTNO('FlowField COUNT = %1, takes %2 msec', i, (Finish - Start))) THEN ERROR(''); RESET; i:=0; Start := TIME; IF FIND('-') THEN REPEAT CALCFIELDS(Balance); IF (Balance <> 0) THEN i += 1; UNTIL NEXT=0; Finish := TIME; IF NOT CONFIRM(STRSUBSTNO('FlowField Loop Counter = %1, takes %2 msec', i, (Finish - Start))) THEN ERROR(''); RESET; i:=0; IF FIND('-') THEN REPEAT RENAME('яя'+"No."); i += 1; UNTIL NEXT=0; MESSAGE ('Wrong way to Rename records example, Records renamed: = %1', i); END; Скопируйте в какой-нить новый юнит, запустите на своих данных. У меня получилось вот так: 1 сообщение: 1420, 0 2 сообщение: 682, 1657 ms 3 сообщение: 682, 281 ms 4 сообщение: 1 У меня база SQL, но на локальном кронусе результаты принципиально те же получились. |
|
04.03.2005, 10:21 | #19 |
Участник
|
Wizard, спасибо! Идею понял.
|
|
04.03.2005, 10:22 | #20 |
Участник
|
Народы....
Пробовал кто-нить? попробуйте местами секции с фильтром по вычисляемому полю поменять поменять - сначала цикл потом Count... А не поменяется результат от этого - опять сначала больше времени, потом меньше. кеширование это... Эксперимент неправильный. Вот я опять теперь думаю, что ж это за баг такой с Count в навиженском движке? Как увидеть-то? |
|