13.07.2007, 15:01 | #1 |
Участник
|
В таблице нужно подсчитать число уникальных по значению некоторого поля записей.
"Count" и IF FIND('-') THEN BEGIN i := 0; REPEAT i += 1; UNTIL NEXT = 0; END; не подходят, так как есть повторяющиеся по этому полю записи. |
|
13.07.2007, 15:09 | #2 |
Участник
|
А поле ключевое?
|
|
13.07.2007, 15:43 | #3 |
Участник
|
А есть возможность отсортировать по этому полю?
|
|
13.07.2007, 16:20 | #4 |
Участник
|
Быстрого способа типа конструкции Distinct наверно не получится. Как вариант проходить по всем записям таблицы и заполнять временную данными значениями по условию. В таком случае ключ по полю не нужен. Это если не использовать аутомейшн.
__________________
Want to believe... |
|
13.07.2007, 16:40 | #5 |
Участник
|
Сортировка следующая:
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 |
Участник
|
Цитата:
И постить строкой типа: IF NOT таблица.INSERT THEN; В этом случае при попытке скопировать значение повторно, INSERT не отработает поскольку строка с таким первичным ключом уже существует А в конце цикла делаем COUNT |
|
13.07.2007, 16:59 | #7 |
Участник
|
В Дельфи я бы сделал это так
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 |
Участник
|
Чем тебе не подходит мой вариант? Там вобще не нужно никаких проверок.
Задача: Посчитать количество строк с уникальным значением поля "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 |
Участник
|
Я сделал проще:
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 |
Участник
|
Цитата:
Код: 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 |
Участник
|
похоже как и вверху, но побыстрей:
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 |
Участник
|
Не всегда есть ключ по нужному полю.
Я делаю своды вот так: Код: ... 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 |
Участник
|
Если база работает на сервере SQL то можно сделать запрос с DISTINCT и вернуть результат либо во временную таблицу ну или сразу количество записей в переменную, имхо если большое количество записей данный способ будет наиболее быстрым
|
|
16.07.2007, 10:45 | #14 |
Участник
|
Цитата:
Задача: Посчитать количество строк с уникальным значением поля "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; И в добавок весь список уникальных значений. Все просто, быстро и прекрасно работает |
|