Страница 1 из 1

Функция OMIT/пропуск

Добавлено: 25 янв 2019, 07:13
Nicussi
Добрый день, прошу помочь в составлении SCRIPTа для следующей задачи:
Есть файл базы данных которая содержит многочисленные записи содержащие, например, следующие поля (fields):
Покупатель, Товар (код), Цена ед. и другие поля, не связанные с данной задачей.
Выполняю следующие действия: Нахожу все товары, проданные одному и тому же покупателю, сортирую по коду товара и по цене (по возрастанию). Получаю следующий результат:
Покупатель Код Цена
ААА БББ 1
ААА БББ 1
ААА БББ 2
ААА ВВВ 5
ААА ВВВ 6
ААА ГГГ 2
ААА ГГГ 3
ААА ГГГ 4
Из этих данных я бы хотел, чтобы по SCRIPTу, программа упустила (omit) повторяющиеся коды и оставила лишь коды с большим значением цены (потом эти данные я бы экспортировал в excel для дальнейшей обработки). Т.е. в результате должны быть отображены только следующие данные (остальные не удаляются, а просто не отображаются):
ААА БББ 2
ААА ВВВ 6
ААА ГГГ 4
На сегодняшний день я их экспортирую в excel и вручную удаляю лишние строки но т.к. иной раз записей больше 600 то это становится сложно и есть риск того что что то будет пропущено или лишнее будет удалено.
Буду благодарен за помощь.
Спасибо

Re: Функция OMIT/пропуск

Добавлено: 12 фев 2019, 16:40
andrey volkov
пожалуйста, укажите версию файлмейкера

Re: Функция OMIT/пропуск

Добавлено: 12 фев 2019, 17:21
andrey volkov
это можно использовать как общий принцип экспорта в эксель отчетов с разделами subsummary


1) у вас есть в таблице поле Код товара. Вам требуется в базе данных в той же таблице создать поле типа subsummary со значением Count of (Код товара)
2) визуализация отчета: в вашем обычном макете-списке вы заменяете раздел body на раздел subsummary (сортировать по Код товара)
3) в строке subsummary отображаете Наименование товара и цену. Также выносите сюда вновь созданное поле. Обязательно в инспекторе присваиваете ему имя, например Counter. Это поле настройками инспектора можно скрыть, но на начальном этапе рекомендую не делать это, потому что оно удобно для отладки. Вообще оно показывает сколько всего записей находится в каждой группе и какое количество записей соответственно нужно скрыть, чтобы оставить одну уникальную (общее количество минус один).

4) формируете представление скриптом, в котором отыскиваете нужные записи и сортируете их по Код товара + Цена (по убыванию)

теперь отчет визуально принимает тот вид, который вы, очевидно, хотели бы выгружать. В каждой строке отображается уникальный товар с наибольшей его ценой (по данному клиенту)
================
Для выгрузки используете скрипт, который будет проходить все записи, пока не дойдет до последней (цикл)
Перейти на первую запись
Цикл.
Выйти из цикла, если номер записи = общее количество записей (то есть если вы стоите на самой последней строке).

В цикле вычисляете "показания" поля-счетчика следующим образом: сохраняете в переменную содержимое счетчика формулой

Код: Выделить всё

GetLayoutObjectAttribute ( "counter"; "content" )
и вычитаете единицу

ЕСЛИ результат больше нуля, значит в группе больше одной записи и эти записи нужно скрыть. для этого переходите на следующую строчку и выполняете Omit multiple records [$переменная]
ИНАЧЕ
выполняете переход на следующую строку
Конец цикла

Все. Остались только уникальные записи. Теперь "отчет" можно выгружать в Эксель стандартными методами

Re: Функция OMIT/пропуск

Добавлено: 12 фев 2019, 21:59
Alexei Sytch
Еще можно попробовать через ExecuteSQL
В вашем случае будет так (если таблица называется БазаПродаж)

Код: Выделить всё

ExecuteSQL ( 
"SELECT \"Покупатель\", \"Код\", max (\"Цена\") 
FROM \"БазаПродаж\" 
GROUP BY \"Покупатель\", \"Код\" 
"
; "	" 
; ""
)
Полученный результат можно копировать и вставлять в Excel, он разделен табуляторами и сам разложится по полям (или экспортировать значение поля с этим результатом как текст с табуляторами)

Код: Выделить всё

ААА	БББ	2
ААА	ВВВ	6
ААА	ГГГ	4

Re: Функция OMIT/пропуск

Добавлено: 13 фев 2019, 05:00
andrey volkov

Код: Выделить всё

ExecuteSQL ( 
"SELECT \"Покупатель\", \"Код\", max (\"Цена\") 
FROM \"БазаПродаж\" 
GROUP BY \"Покупатель\", \"Код\" 
"
; Char(9) 
; ""
)
можно разделитель tab вставлять таким способом, для надежности

Re: Функция OMIT/пропуск

Добавлено: 21 фев 2019, 22:27
Alexei Sytch
Подумал, что пропустили самый простой способ -- напрямую экспортировать в эксель и использовать в окне экспорта опцию группировать (GroupBy) по полую Summary field. Чтобы опция GrouBy стала доступна, надо перед экспортом отсортировать записи по нужным полям. Специальный Layout создавать не надо. Только поле summary, сортировка и экспорт. Скрипт на два шага.

здесь файл с этой реализацией (ЦенаMAX это - поле типа summary настроенное как максимум значений поля Цена в группе записей). В списке полей для экспорта надо взять только поля, по которым есть группировка и summary поле (по последнему полю в группировке)
OMIT.zip
(66.38 КБ) 74 скачивания

Re: Функция OMIT/пропуск

Добавлено: 25 фев 2019, 11:35
Nicussi
Добрый день, извиняюсь за то что не сразу прочел все Ваши ответы но я думал что по каким то причинам не мог открыть тему (она не появлялась в списках и по этому отложил вопрос). Спасибо большое что ответили. Теперь постараюсь разобраться.
Филемакер 14 а база данных 12.
Извините что опоздал!

Re: Функция OMIT/пропуск

Добавлено: 25 фев 2019, 13:36
Nicussi
Спасибо Алексей и Андрей!
Я воспользовался (хотя стыдно признаться) самым простым способом а именно напрямую экспортировать в эксель!
Все получилось. ОГРОМНОЕ СПАСИБО АЛЕКСЕЙ ну и АНДРЕЮ конечно же. Я способ Андрея я обязательно попробую т.к. он дает возможность не только экспортировать но также визуализировать желаемый результат в самой программе но т.к. я не далеко не профессионал и базу данных я составлял методом научного тыка (получилось не плохо) мне необходимо собраться духом и сделать пару лишних backup на всякий случай.
ЕЩЕ РАЗ БОЛЬШОЕ СПАСИБО ВСЕМ! ИЗБАВИЛИ МЕНЯ ОТ МНОГИ ЧАСОВ НЕ НУЖНОЙ РАБОТЫ!