Dronton2
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Стало: 20 Кирпич1 88 Ящик1 35 Кирпич1 100 Ящик1 В итоге надо сделать: 20 Кирпич1 188 Ящик1 35 Кирпич1 0 Ящик1 | А чем вариант "Стало" отличается от варианта "надо сделать"? В обоих случаях - две записи. В обоих случаях - чтобы узнать общее количество Кирпича1 в Ящике1, нужно делать сложение. Имхо, неправильно сформулированная задача привела к неправильной реализации. Первое, что нужно сделать - обеспечить уникальное сочетание полей Naimenovanie и Box. То есть, запретить существование в таблице Table1 двух записей с одинаковыми значениями в полях Naimenovanie и Box. Делается это созданием уникальных индексов или как-то иначе - не помню, т.к. уже лет 20 с интербэйзом не работаю. Второе, что нужно сделать - это привести пользовательский интерфейс к регистрированию непосредственных действий пользователя, а не каких-то производных результатов этих действий или чего-то виртуального. Например, у вас пользователь изменяет значение Ящика для товара Кирпич1. А что он делает на самом деле? Например, для перемещения товара из одного ящика в другой, пользовательский интерфейс должен передать в базу данных: - наименование (а лучше - идентификатор) перемещённого товара - количество перемещённого товара - наименование (а лучше - идентификатор) ящика, из которого переместили - наименование (а лучше - идентификатор) ящика, в который переместили (- а дополнительно - идентификатор пользователя и дату-время данной операции, чтобы записать их в журнале, и если через некоторое время появится вопрос о несоответствии данных в базе, реальным данным, можно было бы сказать, кто, когда и какие изменения вносил в БД). Получаем процедуру с 4 входными параметрами. 1. Открываем транзакцию 2. Получаем количество Кирпич1 в Ящик2. 3. Если это количество равно перемещаемому количеству - Удаляем запись для Кирпич1 и Ящик2 Если это количество больше перемещаемого количества - записываем в запись для Кирпич1 и Ящик2 в поле Kol-vo разницу. Если это количество меньше перемещаемого количества - вызываем исключительную ситуацию, сообщаем об ошибке и откатываем транзакцию. 3. Используем оператор MERGE (или пользуемся аналогами UPDATE и INSERT) для добавления к существующей записи Кирпич1 и Ящик1 или создания новой записи, если такая запись отсутствует. (4. Регистрируем перемещение товара в журнале) 5. Закрываем транзакцию. | Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:15 13-07-2017 | Исправлено: Dronton2, 11:18 13-07-2017 |
|