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

Практические советы по работе с FileMaker, типичные задачи и их решения. У вас вопрос? Пишите сюда.
Ответить
Nicussi
Сообщения: 1
Зарегистрирован: 23 янв 2019, 08:11

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

Сообщение Nicussi » 25 янв 2019, 07:13

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

andrey volkov
Сообщения: 184
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

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

Сообщение andrey volkov » 12 фев 2019, 16:40

пожалуйста, укажите версию файлмейкера

andrey volkov
Сообщения: 184
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

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

Сообщение andrey volkov » 12 фев 2019, 17:21

это можно использовать как общий принцип экспорта в эксель отчетов с разделами subsummary


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

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

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

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

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

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

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

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

Alexei Sytch
Сообщения: 53
Зарегистрирован: 21 сен 2017, 18:48
Откуда: Минск

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

Сообщение Alexei Sytch » 12 фев 2019, 21:59

Еще можно попробовать через ExecuteSQL
В вашем случае будет так (если таблица называется БазаПродаж)

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

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

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

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

andrey volkov
Сообщения: 184
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

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

Сообщение andrey volkov » 13 фев 2019, 05:00

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

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

Alexei Sytch
Сообщения: 53
Зарегистрирован: 21 сен 2017, 18:48
Откуда: Минск

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

Сообщение Alexei Sytch » 21 фев 2019, 22:27

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

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

Ответить