Ни хао, драконы! 🐲 Канал о китайской системе отчетности FineReport
Чат: @FineReport и @FineBiChat
По всем вопросам: @it_larin
Made in GlowByte
Post #43
41

«Очистить» при импорте Excel в FineReport не удаляет ни одной строки в базе
На форуме FanRuan спросили, как перед загрузкой Excel удалить из таблицы старые данные по параметрам, если у таблицы нет первичного ключа, а триггеры использовать нельзя.
Пример. Каждый месяц в форму ввода FineReport загружают Excel с продажами: месяц, магазин, сайт. Файл за август пришёл повторно, исправленный. Разработчик выбирает при импорте режим «Очистить» и ждёт, что старый август исчезнет.
Не исчезнет. Импорт и запись в базу в FineReport - два разных шага. Режимы «Очистить», «Инкремент» и «Перезаписать» только раскладывают данные по странице формы. База меняется позже, когда пользователь нажимает «Отправить».
Поэтому старый август удаляют на шаге отправки. В свойствах формы ввода настраивают два встроенных SQL:
- первый с типом «удаляющая отправка» убирает строки, подходящие под месяц, магазин и сайт;
- второй с типом «умная отправка» записывает строки нового файла.
Они выполняются сверху вниз в одной транзакции: если вторая команда упадёт, откатится и удаление.
Самое неочевидное место - «первичный ключ» удаляющей отправки. Это не ключ таблицы в базе, а условие отбора строк, как WHERE в SQL, поэтому таблица без ключа подходит.
На примере с августом: ключом отмечают одно поле, скажем ID строки. Его значение не берут из ячейки, а считают формулой SQL: выбрать ID из таблицы продаж, где месяц = август, магазин = выбранный, сайт = выбранный. Отправка удалит строки ровно с этими ID.
Теперь ошибка, которую сделать проще всего: отметить ключом месяц. Формула вернёт «август», и отправка удалит все строки за август, то есть август всех магазинов и сайтов. Поэтому в ответах советуют брать колонку, которая однозначно указывает на строку: ID или rowid. Поле ставят одно: при нескольких полях их значения сочетаются во всех комбинациях (в ответе это названо декартовым произведением), и под удаление попадают лишние строки.
Вторая ловушка - пустой параметр: если магазин не выбран, условие в формуле перестаёт отсекать чужие строки. Транзакция тут не спасёт: она откатывает сбой, а не неверное условие. Поэтому на удаляющую отправку ставят условие отправки, которое пропускает её только при заполненных параметрах. В примере из ветки это проверка len() для месяца, магазина и сайта.
Источник: https://bbs.fanruan.com/wenda/question/231720.html
#FineReport #FanRuan #Excel #формыввода #SQL #BI
На форуме FanRuan спросили, как перед загрузкой Excel удалить из таблицы старые данные по параметрам, если у таблицы нет первичного ключа, а триггеры использовать нельзя.
Пример. Каждый месяц в форму ввода FineReport загружают Excel с продажами: месяц, магазин, сайт. Файл за август пришёл повторно, исправленный. Разработчик выбирает при импорте режим «Очистить» и ждёт, что старый август исчезнет.
Не исчезнет. Импорт и запись в базу в FineReport - два разных шага. Режимы «Очистить», «Инкремент» и «Перезаписать» только раскладывают данные по странице формы. База меняется позже, когда пользователь нажимает «Отправить».
Поэтому старый август удаляют на шаге отправки. В свойствах формы ввода настраивают два встроенных SQL:
- первый с типом «удаляющая отправка» убирает строки, подходящие под месяц, магазин и сайт;
- второй с типом «умная отправка» записывает строки нового файла.
Они выполняются сверху вниз в одной транзакции: если вторая команда упадёт, откатится и удаление.
Самое неочевидное место - «первичный ключ» удаляющей отправки. Это не ключ таблицы в базе, а условие отбора строк, как WHERE в SQL, поэтому таблица без ключа подходит.
На примере с августом: ключом отмечают одно поле, скажем ID строки. Его значение не берут из ячейки, а считают формулой SQL: выбрать ID из таблицы продаж, где месяц = август, магазин = выбранный, сайт = выбранный. Отправка удалит строки ровно с этими ID.
Теперь ошибка, которую сделать проще всего: отметить ключом месяц. Формула вернёт «август», и отправка удалит все строки за август, то есть август всех магазинов и сайтов. Поэтому в ответах советуют брать колонку, которая однозначно указывает на строку: ID или rowid. Поле ставят одно: при нескольких полях их значения сочетаются во всех комбинациях (в ответе это названо декартовым произведением), и под удаление попадают лишние строки.
Вторая ловушка - пустой параметр: если магазин не выбран, условие в формуле перестаёт отсекать чужие строки. Транзакция тут не спасёт: она откатывает сбой, а не неверное условие. Поэтому на удаляющую отправку ставят условие отправки, которое пропускает её только при заполненных параметрах. В примере из ветки это проверка len() для месяца, магазина и сайта.
Источник: https://bbs.fanruan.com/wenda/question/231720.html
#FineReport #FanRuan #Excel #формыввода #SQL #BI





