Функция OMIT/пропуск
Функция OMIT/пропуск
Добрый день, прошу помочь в составлении SCRIPTа для следующей задачи:
Есть файл базы данных которая содержит многочисленные записи содержащие, например, следующие поля (fields):
Покупатель, Товар (код), Цена ед. и другие поля, не связанные с данной задачей.
Выполняю следующие действия: Нахожу все товары, проданные одному и тому же покупателю, сортирую по коду товара и по цене (по возрастанию). Получаю следующий результат:
Покупатель Код Цена
ААА БББ 1
ААА БББ 1
ААА БББ 2
ААА ВВВ 5
ААА ВВВ 6
ААА ГГГ 2
ААА ГГГ 3
ААА ГГГ 4
Из этих данных я бы хотел, чтобы по SCRIPTу, программа упустила (omit) повторяющиеся коды и оставила лишь коды с большим значением цены (потом эти данные я бы экспортировал в excel для дальнейшей обработки). Т.е. в результате должны быть отображены только следующие данные (остальные не удаляются, а просто не отображаются):
ААА БББ 2
ААА ВВВ 6
ААА ГГГ 4
На сегодняшний день я их экспортирую в excel и вручную удаляю лишние строки но т.к. иной раз записей больше 600 то это становится сложно и есть риск того что что то будет пропущено или лишнее будет удалено.
Буду благодарен за помощь.
Спасибо
Есть файл базы данных которая содержит многочисленные записи содержащие, например, следующие поля (fields):
Покупатель, Товар (код), Цена ед. и другие поля, не связанные с данной задачей.
Выполняю следующие действия: Нахожу все товары, проданные одному и тому же покупателю, сортирую по коду товара и по цене (по возрастанию). Получаю следующий результат:
Покупатель Код Цена
ААА БББ 1
ААА БББ 1
ААА БББ 2
ААА ВВВ 5
ААА ВВВ 6
ААА ГГГ 2
ААА ГГГ 3
ААА ГГГ 4
Из этих данных я бы хотел, чтобы по SCRIPTу, программа упустила (omit) повторяющиеся коды и оставила лишь коды с большим значением цены (потом эти данные я бы экспортировал в excel для дальнейшей обработки). Т.е. в результате должны быть отображены только следующие данные (остальные не удаляются, а просто не отображаются):
ААА БББ 2
ААА ВВВ 6
ААА ГГГ 4
На сегодняшний день я их экспортирую в excel и вручную удаляю лишние строки но т.к. иной раз записей больше 600 то это становится сложно и есть риск того что что то будет пропущено или лишнее будет удалено.
Буду благодарен за помощь.
Спасибо
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Re: Функция OMIT/пропуск
пожалуйста, укажите версию файлмейкера
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Re: Функция OMIT/пропуск
это можно использовать как общий принцип экспорта в эксель отчетов с разделами subsummary
1) у вас есть в таблице поле Код товара. Вам требуется в базе данных в той же таблице создать поле типа subsummary со значением Count of (Код товара)
2) визуализация отчета: в вашем обычном макете-списке вы заменяете раздел body на раздел subsummary (сортировать по Код товара)
3) в строке subsummary отображаете Наименование товара и цену. Также выносите сюда вновь созданное поле. Обязательно в инспекторе присваиваете ему имя, например Counter. Это поле настройками инспектора можно скрыть, но на начальном этапе рекомендую не делать это, потому что оно удобно для отладки. Вообще оно показывает сколько всего записей находится в каждой группе и какое количество записей соответственно нужно скрыть, чтобы оставить одну уникальную (общее количество минус один).
4) формируете представление скриптом, в котором отыскиваете нужные записи и сортируете их по Код товара + Цена (по убыванию)
теперь отчет визуально принимает тот вид, который вы, очевидно, хотели бы выгружать. В каждой строке отображается уникальный товар с наибольшей его ценой (по данному клиенту)
================
Для выгрузки используете скрипт, который будет проходить все записи, пока не дойдет до последней (цикл)
Перейти на первую запись
Цикл.
Выйти из цикла, если номер записи = общее количество записей (то есть если вы стоите на самой последней строке).
В цикле вычисляете "показания" поля-счетчика следующим образом: сохраняете в переменную содержимое счетчика формулой
и вычитаете единицу
ЕСЛИ результат больше нуля, значит в группе больше одной записи и эти записи нужно скрыть. для этого переходите на следующую строчку и выполняете Omit multiple records [$переменная]
ИНАЧЕ
выполняете переход на следующую строку
Конец цикла
Все. Остались только уникальные записи. Теперь "отчет" можно выгружать в Эксель стандартными методами
1) у вас есть в таблице поле Код товара. Вам требуется в базе данных в той же таблице создать поле типа subsummary со значением Count of (Код товара)
2) визуализация отчета: в вашем обычном макете-списке вы заменяете раздел body на раздел subsummary (сортировать по Код товара)
3) в строке subsummary отображаете Наименование товара и цену. Также выносите сюда вновь созданное поле. Обязательно в инспекторе присваиваете ему имя, например Counter. Это поле настройками инспектора можно скрыть, но на начальном этапе рекомендую не делать это, потому что оно удобно для отладки. Вообще оно показывает сколько всего записей находится в каждой группе и какое количество записей соответственно нужно скрыть, чтобы оставить одну уникальную (общее количество минус один).
4) формируете представление скриптом, в котором отыскиваете нужные записи и сортируете их по Код товара + Цена (по убыванию)
теперь отчет визуально принимает тот вид, который вы, очевидно, хотели бы выгружать. В каждой строке отображается уникальный товар с наибольшей его ценой (по данному клиенту)
================
Для выгрузки используете скрипт, который будет проходить все записи, пока не дойдет до последней (цикл)
Перейти на первую запись
Цикл.
Выйти из цикла, если номер записи = общее количество записей (то есть если вы стоите на самой последней строке).
В цикле вычисляете "показания" поля-счетчика следующим образом: сохраняете в переменную содержимое счетчика формулой
Код: Выделить всё
GetLayoutObjectAttribute ( "counter"; "content" )
ЕСЛИ результат больше нуля, значит в группе больше одной записи и эти записи нужно скрыть. для этого переходите на следующую строчку и выполняете Omit multiple records [$переменная]
ИНАЧЕ
выполняете переход на следующую строку
Конец цикла
Все. Остались только уникальные записи. Теперь "отчет" можно выгружать в Эксель стандартными методами
-
- Сообщения: 106
- Зарегистрирован: 21 сен 2017, 18:48
- Откуда: Минск
Re: Функция OMIT/пропуск
Еще можно попробовать через ExecuteSQL
В вашем случае будет так (если таблица называется БазаПродаж)
Полученный результат можно копировать и вставлять в Excel, он разделен табуляторами и сам разложится по полям (или экспортировать значение поля с этим результатом как текст с табуляторами)
В вашем случае будет так (если таблица называется БазаПродаж)
Код: Выделить всё
ExecuteSQL (
"SELECT \"Покупатель\", \"Код\", max (\"Цена\")
FROM \"БазаПродаж\"
GROUP BY \"Покупатель\", \"Код\"
"
; " "
; ""
)
Код: Выделить всё
ААА БББ 2
ААА ВВВ 6
ААА ГГГ 4
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Re: Функция OMIT/пропуск
Код: Выделить всё
ExecuteSQL (
"SELECT \"Покупатель\", \"Код\", max (\"Цена\")
FROM \"БазаПродаж\"
GROUP BY \"Покупатель\", \"Код\"
"
; Char(9)
; ""
)
-
- Сообщения: 106
- Зарегистрирован: 21 сен 2017, 18:48
- Откуда: Минск
Re: Функция OMIT/пропуск
Подумал, что пропустили самый простой способ -- напрямую экспортировать в эксель и использовать в окне экспорта опцию группировать (GroupBy) по полую Summary field. Чтобы опция GrouBy стала доступна, надо перед экспортом отсортировать записи по нужным полям. Специальный Layout создавать не надо. Только поле summary, сортировка и экспорт. Скрипт на два шага.
здесь файл с этой реализацией (ЦенаMAX это - поле типа summary настроенное как максимум значений поля Цена в группе записей). В списке полей для экспорта надо взять только поля, по которым есть группировка и summary поле (по последнему полю в группировке)
здесь файл с этой реализацией (ЦенаMAX это - поле типа summary настроенное как максимум значений поля Цена в группе записей). В списке полей для экспорта надо взять только поля, по которым есть группировка и summary поле (по последнему полю в группировке)
- Вложения
-
- pic7.jpg (131.73 КБ) 12406 просмотров
Re: Функция OMIT/пропуск
Добрый день, извиняюсь за то что не сразу прочел все Ваши ответы но я думал что по каким то причинам не мог открыть тему (она не появлялась в списках и по этому отложил вопрос). Спасибо большое что ответили. Теперь постараюсь разобраться.
Филемакер 14 а база данных 12.
Извините что опоздал!
Филемакер 14 а база данных 12.
Извините что опоздал!
Re: Функция OMIT/пропуск
Спасибо Алексей и Андрей!
Я воспользовался (хотя стыдно признаться) самым простым способом а именно напрямую экспортировать в эксель!
Все получилось. ОГРОМНОЕ СПАСИБО АЛЕКСЕЙ ну и АНДРЕЮ конечно же. Я способ Андрея я обязательно попробую т.к. он дает возможность не только экспортировать но также визуализировать желаемый результат в самой программе но т.к. я не далеко не профессионал и базу данных я составлял методом научного тыка (получилось не плохо) мне необходимо собраться духом и сделать пару лишних backup на всякий случай.
ЕЩЕ РАЗ БОЛЬШОЕ СПАСИБО ВСЕМ! ИЗБАВИЛИ МЕНЯ ОТ МНОГИ ЧАСОВ НЕ НУЖНОЙ РАБОТЫ!
Я воспользовался (хотя стыдно признаться) самым простым способом а именно напрямую экспортировать в эксель!
Все получилось. ОГРОМНОЕ СПАСИБО АЛЕКСЕЙ ну и АНДРЕЮ конечно же. Я способ Андрея я обязательно попробую т.к. он дает возможность не только экспортировать но также визуализировать желаемый результат в самой программе но т.к. я не далеко не профессионал и базу данных я составлял методом научного тыка (получилось не плохо) мне необходимо собраться духом и сделать пару лишних backup на всякий случай.
ЕЩЕ РАЗ БОЛЬШОЕ СПАСИБО ВСЕМ! ИЗБАВИЛИ МЕНЯ ОТ МНОГИ ЧАСОВ НЕ НУЖНОЙ РАБОТЫ!