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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.07.2007, 15:01   #1  
mefodiy is offline
mefodiy
Участник
 
96 / 10 (1) +
Регистрация: 08.07.2007
В таблице нужно подсчитать число уникальных по значению некоторого поля записей.

"Count" и

IF FIND('-') THEN
BEGIN
i := 0;
REPEAT
i += 1;
UNTIL NEXT = 0;
END;

не подходят, так как есть повторяющиеся по этому полю записи.
Старый 13.07.2007, 15:09   #2  
Corleone is offline
Corleone
Участник
 
355 / 10 (1) +
Регистрация: 27.05.2004
Адрес: London
А поле ключевое?
Старый 13.07.2007, 15:43   #3  
kekki is offline
kekki
Участник
 
58 / 10 (1) +
Регистрация: 27.06.2005
А есть возможность отсортировать по этому полю?
Старый 13.07.2007, 16:20   #4  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Быстрого способа типа конструкции Distinct наверно не получится. Как вариант проходить по всем записям таблицы и заполнять временную данными значениями по условию. В таком случае ключ по полю не нужен. Это если не использовать аутомейшн.
__________________
Want to believe...
Старый 13.07.2007, 16:40   #5  
mefodiy is offline
mefodiy
Участник
 
96 / 10 (1) +
Регистрация: 08.07.2007
Сортировка следующая:

SORTING(Posting date,Old period,Vendor Name,VAT Doc Date,VAT Doc No.,Doc No.) ORDER(Ascending)

Записи повторяются по значению поля "VAT Doc No.", причем, такие записи следуют друг за другом.
Старый 13.07.2007, 16:45   #6  
Jackal1 is offline
Jackal1
Участник
 
54 / 10 (1) +
Регистрация: 29.07.2005
Адрес: Киев
Цитата:
Сообщение от DA_NEAL Посмотреть сообщение
Быстрого способа типа конструкции Distinct наверно не получится. Как вариант проходить по всем записям таблицы и заполнять временную данными значениями по условию. В таком случае ключ по полю не нужен. Это если не использовать аутомейшн.
Можно вместо условия подобрать в качестве темповой такую таблицу у которой тип поля из первичного ключа совпадает с типом поля по которому Вы хотите сделать поиск.

И постить строкой типа:

IF NOT таблица.INSERT THEN;

В этом случае при попытке скопировать значение повторно, INSERT не отработает поскольку строка с таким первичным ключом уже существует

А в конце цикла делаем COUNT
Старый 13.07.2007, 16:59   #7  
mefodiy is offline
mefodiy
Участник
 
96 / 10 (1) +
Регистрация: 08.07.2007
В Дельфи я бы сделал это так

i := 0;
First;
while not Eof do
begin
s := <Текущее значение поля>;
while (<Текущее значение поля> = s) and (not Eof) do
Next;
i := i + 1;
end;

Но Navision я новичок и этот вариант не могу применить.
Происходит зацикливание.

Может кто переведет код в Navision?
Старый 13.07.2007, 17:10   #8  
Jackal1 is offline
Jackal1
Участник
 
54 / 10 (1) +
Регистрация: 29.07.2005
Адрес: Киев
Чем тебе не подходит мой вариант? Там вобще не нужно никаких проверок.

Задача: Посчитать количество строк с уникальным значением поля "VAT Doc No.". Поле "VAT Doc No." имеет тип, к примеру Code.

1. Ужем таблицу у которой первичный ключ типа Code.
2. Создаем временную таблицу на ее основе.
3. Копируем в чикле поле "VAT Doc No." во временную таблицу в ключевое поле
4. Пишем
IF NOT временная таблица.INSERT THEN;
Если такого значения нет то инсерт отработает нормально и перейдет к копированию следующей строчки
Если такое значение есть, то инсерт не отработает и, опять таки перейдет к копированию следующей строчки
5. После цикла пишем временная таблица.COUNT

все.... значение получили

IF временная таблица.FIND(-) THEN REPEAT
временная таблица.INIT;
временная таблица.ключевое поле := "VAT Doc No.";
IF NOT временная таблица.INSERT THEN;
UNTIL временная таблица.NEXT=0

Количество строк := временная таблица.COUNT;
Старый 13.07.2007, 17:24   #9  
mefodiy is offline
mefodiy
Участник
 
96 / 10 (1) +
Регистрация: 08.07.2007
Я сделал проще:

new_str := '';
old_str := '';
REPEAT
new_str := "VAT Doc No.";
if old_str <> new_str then
BEGIN
i += 1;
old_str := new_str;
END;
UNTIL NEXT = 0;

Всем спасибо.
Старый 13.07.2007, 17:30   #10  
satir is offline
satir
Участник
Аватар для satir
 
77 / 10 (1) +
Регистрация: 09.06.2006
Цитата:
Сообщение от mefodiy Посмотреть сообщение
Сортировка следующая:

SORTING(Posting date,Old period,Vendor Name,VAT Doc Date,VAT Doc No.,Doc No.) ORDER(Ascending)

Записи повторяются по значению поля "VAT Doc No.", причем, такие записи следуют друг за другом.
Пишется примерно следующее
Код:
count := 0
rec.setrange - накладываете нужные фильтры по необходимости
rec.find('-')
repeat
 rec.setrange("VAT Doc No.","VAT Doc No.")
 if rec.find('-') begin
  repeat
	 boolnext := rec.next;
  until boolnext = 0
  count +=1
 end
 rec.setrange("VAT Doc No.")  
until rec.next = 0

boolnext,count - integer
Должно работать
Кажется немного опоздал
Старый 13.07.2007, 18:11   #11  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
похоже как и вверху, но побыстрей:
Rec.SETCURRENTKEY("Поле, количество уникальных значений которого надо посчитать");
IF Rec.FINDFIRST THEN
REPEAT
Rec.SETRANGE("Поле", Rec."Поле");
Total+=1;
REC.FINDLAST;
Rec.SETRANGE("Поле");
UNTIL Rec.NEXT=0;
Старый 14.07.2007, 11:02   #12  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Не всегда есть ключ по нужному полю.
Я делаю своды вот так:

Код:
...
REPEAT
  IF not TEMPтаблица.Get(Field1,Field1,) then begin
	 TEMPтаблица.Field1:=Rec.Свод1;
	 TEMPтаблица.Field2:=Rec.Свод2;
	 TEMPтаблица.Qty1:=0;
	 TEMPтаблица.INSERT;
  end;
  TEMPтаблица.Qty1+=Rec.Qty1;
  TEMPтаблица.MODIFY;
until Rec.NEXT=0;
Старый 16.07.2007, 07:16   #13  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
Если база работает на сервере SQL то можно сделать запрос с DISTINCT и вернуть результат либо во временную таблицу ну или сразу количество записей в переменную, имхо если большое количество записей данный способ будет наиболее быстрым
Старый 16.07.2007, 10:45   #14  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от mefodiy Посмотреть сообщение
В Дельфи я бы сделал это так

i := 0;
First;
while not Eof do
begin
s := <Текущее значение поля>;
while (<Текущее значение поля> = s) and (not Eof) do
Next;
i := i + 1;
end;

Может кто переведет код в Navision?
Вам же написали - не изобретайте велосипед. Используйте временную таблицу.
Задача: Посчитать количество строк с уникальным значением поля "VAT Doc No.". Поле "VAT Doc No." имеет тип, к примеру Code.

1. Вводим любую временную таблицу, где поле "VAT Doc No." - первичный ключ (можно выбрать на любой вкус подходящую таблицу) и создаем временную таблицу на ее основе.
3. Копируем в цикле поле "VAT Doc No." во временную таблицу в ключевое поле и записываем
4. Временная таблица.COUNT

{все фильтра, которые нужно}
IF ИСХОДНАЯ ТАБЛИЦА.FIND(-) THEN REPEAT
временная таблица.INIT;
временная таблица.ключевое поле := "VAT Doc No.";
{прочие поля, которые нужны}
IF временная таблица.INSERT THEN;
UNTIL ИСХОДНАЯ ТАБЛИЦА.NEXT=0

Количество строк := временная таблица.COUNT;

И в добавок весь список уникальных значений.
Все просто, быстро и прекрасно работает
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:20.