AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.02.2005, 13:51   #1  
Inso is offline
Inso
Участник
 
18 / 10 (1) +
Регистрация: 28.02.2005
Я пока ещё разбираюсь с C/AL, посему возник следующий вопрос:

Допустим есть запись Customer и поле "No.".. Customer."No."
Как оформить присваивание значения Customer."No." какой-нибудь переменной text типа Code?
Старый 28.02.2005, 14:17   #2  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Почитайте хелп про GET и FIND, если Вам нужно в переменную типа Code передать значение Customer."No."
Почитайте хелп про INSERT, MODIFY, RENAME и DELETE, если нужно наоборот передать в Customer."No." значение переменной.
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 28.02.2005, 15:44   #3  
Inso is offline
Inso
Участник
 
18 / 10 (1) +
Регистрация: 28.02.2005
Спасибо.. в этом разобрался..

Тогда ещё один вопрос:
Допустим в записи сколько-то там номеров клиентов.. как мне получить общее число этих клиентов?
Объясню зачем это нужно: просто захотелось мне изменить каждый номер клиента.. например был 6201, а стал 96201, был 6207, а стал 96207.. и так со всеми.. Вот как это сделать? То есть как работать со всеми значениями поля? Как оформить такой цикл?

Надеюсь не сильно тупо сформулирован вопрос.. я пытаюсь разобраться
Старый 28.02.2005, 16:08   #4  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Inso
Спасибо.. в этом разобрался..

Тогда ещё один вопрос:
Допустим в записи сколько-то там номеров клиентов.. как мне получить общее число этих клиентов?
Объясню зачем это нужно: просто захотелось мне изменить каждый номер клиента.. например был 6201, а стал 96201, был 6207, а стал 96207.. и так со всеми.. Вот как это сделать? То есть как работать со всеми значениями поля? Как оформить такой цикл?

Надеюсь не сильно тупо сформулирован вопрос.. я пытаюсь разобраться
Если правильно понял, то тебе надо тупо поставить приставку к существующим номерам? тогда так и сделай


цикл будет выглядеть, например, так:

Customer.FIND('-');
REPEAT
// тело цикла
UNTIL Customer.NEXT=0;

Но для твоей задачи быстрее будет использовать репорт
Старый 28.02.2005, 16:11   #5  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Нифига не понял, если честно.

Количество всех записей в таблице - rec.COUNT или Rec.COUNTAPPROX (действует с учетом фильтров, см. хелп).
Как оформить цикл - еще раз, посмотрите хелп по FIND. Заодно по NEXT, там приводится пример, как пробежаться циклом по всей таблице.
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 28.02.2005, 16:14   #6  
Inso is offline
Inso
Участник
 
18 / 10 (1) +
Регистрация: 28.02.2005
а что будет представлять собой тело цикла?

и

что означает Customer.NEXT=0? (кроме как условие true).. значений больше нет или что-то другое?
Старый 28.02.2005, 16:15   #7  
Inso is offline
Inso
Участник
 
18 / 10 (1) +
Регистрация: 28.02.2005
Цитата:
Сообщение от Дуд
Нифига не понял, если честно.

Количество всех записей в таблице - rec.COUNT или Rec.COUNTAPPROX (действует с учетом фильтров, см. хелп).
Как оформить цикл - еще раз, посмотрите хелп по FIND. Заодно по NEXT, там приводится пример, как пробежаться циклом по всей таблице.
ок.. сейчас почитаю.. спасибо.
Старый 28.02.2005, 16:18   #8  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Inso
а что будет представлять собой тело цикла?

и

что означает Customer.NEXT=0? (кроме как условие true).. значений больше нет или что-то другое?
Передвигает указатель на следующую строку и проверяет не кончились ли записи. Читай хелп!!!!!
Старый 03.03.2005, 10:39   #9  
Likefire is offline
Likefire
Заноза в заднице
Аватар для Likefire
MCBMSS
Лучший по профессии 2009
 
547 / 50 (3) ++++
Регистрация: 22.10.2007
Адрес: Москва
Записей в блоге: 1
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.
RESET(Customer); //сбрасываем все фильтры = все записи таблицы
IsCount := Customer.COUNT;

Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи
IsCount := Customer.COUNT;

Вот и вся любовь...
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков!
Старый 03.03.2005, 11:33   #10  
Shoorik is offline
Shoorik
Участник
 
19 / 10 (1) +
Регистрация: 03.03.2005
Цитата:
Сообщение от Likefire
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.
RESET(Customer); //сбрасываем все фильтры = все записи таблицы
IsCount := Customer.COUNT;

Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи
IsCount := Customer.COUNT;

Вот и вся любовь...
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.

Не понял идеи. При чём здесь COUNT?
Искать последнюю запись с помощью цикла - далеко не лучшая идея, конечно :-) Но вопрос был не об этом - человеку, как я понял, нужно изменить значение поля во всех записях. В этом деле COUNT точно не поможет, там без цикла не обойтись.
Для того, чтобы найти последнюю запись, на самом деле, существует такой простой метод как FIND('+')

В примере кода, приведённом Вами я опять-таки не увидел поиска поска записи.

RESET(Customer); //сбрасываем все фильтры = все записи таблицы
IsCount := Customer.COUNT;

Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи
IsCount := Customer.COUNT;

Вы здесь дважды считаете количество записей. Первый раз - всего в такблице, второй - количество записей, удовлетворяющих фильтру. А где, собственно, поиск?
Старый 03.03.2005, 11:35   #11  
Shoorik is offline
Shoorik
Участник
 
19 / 10 (1) +
Регистрация: 03.03.2005
Цитата:
Сообщение от Дуд
Нифига не понял, если честно.

Количество всех записей в таблице - rec.COUNT или Rec.COUNTAPPROX (действует с учетом фильтров, см. хелп).
Как оформить цикл - еще раз, посмотрите хелп по FIND. Заодно по NEXT, там приводится пример, как пробежаться циклом по всей таблице.
Вы имеете в виду, что COUNTAPPROX действует с учётом фильтров? А COUNT не учитывает фильтры? Или я Вас неправильно понял?
Старый 03.03.2005, 11:48   #12  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Цитата:
Сообщение от Shoorik
Вы имеете в виду, что COUNTAPPROX действует с учётом фильтров? А COUNT не учитывает фильтры? Или я Вас неправильно понял?
Вы меня неправильно поняли.
Все написано в хелпе.
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 03.03.2005, 12:00   #13  
Shoorik is offline
Shoorik
Участник
 
19 / 10 (1) +
Регистрация: 03.03.2005
Цитата:
Сообщение от Дуд
Цитата:
Сообщение от Shoorik
Вы имеете в виду, что COUNTAPPROX действует с учётом фильтров? А COUNT не учитывает фильтры? Или я Вас неправильно понял?
Вы меня неправильно поняли.
Все написано в хелпе.
Да нет, хелп я читал, спасибо. Как работают COUNT и COUNTAPPROX знаю.
Просто я неверно понял Ваше сообщение, что и смутило.
Теперь всё вернулось на свои места. :-)
Старый 03.03.2005, 12:14   #14  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Можно вставить два слова?

В случае если таблица Table содержит flow fields типа Sum, а также имеет немаленький размер (допустим >10 000 записей), то количество элементов в этой таблице быстрее посчитать не через Table.COUNT или Table.COUNTAPPROX, а через перебор всех элементов с суммированием переменной-счетчика.

Баг навиженовского движка.
Старый 03.03.2005, 16:57   #15  
Likefire is offline
Likefire
Заноза в заднице
Аватар для Likefire
MCBMSS
Лучший по профессии 2009
 
547 / 50 (3) ++++
Регистрация: 22.10.2007
Адрес: Москва
Записей в блоге: 1
Цитата:
Сообщение от Shoorik
Цитата:
Сообщение от Likefire
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как COUNT.
RESET(Customer); //сбрасываем все фильтры = все записи таблицы
IsCount := Customer.COUNT;

Сustomer.SETRANGE("No.", No1, No2); //ставим фильтр = избранные записи
IsCount := Customer.COUNT;

Вот и вся любовь...
Цикл в данном случае очень непродуктивно, так как записей в таблице может быть очень много и пробегаться по каждой записи, чтобы найти последний элемент таблицы - мягко говоря неумно, потому что существует такой простой метод как 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  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Ребят, вам не кажется, что вы к словам друг друга придираетесь? (я не о замечании Tyrex'а)
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 03.03.2005, 18:24   #17  
Shoorik is offline
Shoorik
Участник
 
19 / 10 (1) +
Регистрация: 03.03.2005
Цитата:
Сообщение от 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  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Код:
{
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;
Вставьте запись с кодом '00001' в 18 таблицу чтоб данные не портить
Скопируйте в какой-нить новый юнит, запустите на своих данных.
У меня получилось вот так:
1 сообщение: 1420, 0
2 сообщение: 682, 1657 ms
3 сообщение: 682, 281 ms
4 сообщение: 1


У меня база SQL, но на локальном кронусе результаты принципиально те же получились.
Старый 04.03.2005, 10:21   #19  
Shoorik is offline
Shoorik
Участник
 
19 / 10 (1) +
Регистрация: 03.03.2005
Wizard, спасибо! Идею понял.
Старый 04.03.2005, 10:22   #20  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Народы....
Пробовал кто-нить?
попробуйте местами секции с фильтром по вычисляемому полю поменять поменять - сначала цикл потом Count...
А не поменяется результат от этого - опять сначала больше времени, потом меньше.
кеширование это...
Эксперимент неправильный.
Вот я опять теперь думаю, что ж это за баг такой с Count в навиженском движке?

Как увидеть-то?
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:52.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.