|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Несколько записей в DBGrid и отмена изменений
Как отобразить несколько записей в DBGrid (для полльзователя), но оставить за собой право разом отменить все изменения (т.е. что-то вроде Table.Cancel; )
Идея такая: формируется документ, к котором привязывается несколько позиций товара. (сам документ хранится в одной таблице, а привязанные к документу товары в другой) Перед тем, как занести этот документ в БД пользователю выводится конечное окно, где он проверяет правильность введённых данных. И одним из пунктов является DBGrid, в котором отображаются товары. Но как добавить несколько я не знаю. А писать процедуры на добавление\удаление не хочется (ибо подозреваю, что и не надо, есть обходной путь) |
#2
|
||||
|
||||
смотри в сторону кеширования изменений или управления транзакциями
Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#3
|
|||
|
|||
Цитата:
Еще TMemoryTable. Вся подготовка делается в таблице в памяти, потом, если пользователь подтвердил, копируется в БД. |
#4
|
||||
|
||||
На самом деле, если использовать нормальные компоненты, то в них должно быть встроенное свойство CachedUpdates и ApplyUpdates/CancelUpdates. Какая БД используется?
|
#5
|
||||
|
||||
Цитата:
Используется MySQL + ADO. Я почитаю про ApplyUpdates/CancelUpdates, спасибо. Перевёл таблицу в режим ltBatchOptimistic. Пишу: Код:
with fDataModule.tItems do begin Insert; FieldByName('Item').AsString := item; FieldByName('Weight').AsFloat := weight; FieldByName('InsertWeight').AsFloat := iweight; FieldByName('MetallWeight').AsFloat := weight - iweight; Post; end; В момент Insert начинает ругаться на то, что DataSet закрыт. Я догадываюсь, что ltBatchOptimistic блокирует insert. Как в этом случае правильно вносить изменения в таблицы? Решено после перевода таблицы в режим ltBatchOptimistic забыл открыть таблицу. Последний раз редактировалось Uniq!, 02.09.2013 в 20:05. |
#6
|
||||
|
||||
Код:
ADOQuery1.UpdateBatch(arAll); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
Страдалецъ, это всё уже прочитано.
Нужно решение для такой задачи: есть мастер таблица (документ), к которому привязываются из дэтэйл таблицы изделия. Код:
мастер.UpdateBatch(arAll); В поле ID, которе является AI (auto increment), ничего не записывается. Соответственно в дэтэйл таблицу записать изделия не могу, т.к. туда нужен этот ID номер. Без "быдлокода" как это реализовать? Задача скорее всего сведётся к нахождению последнего значения Столбца ID. и добавления к нему 1цы Последний раз редактировалось Uniq!, 02.09.2013 в 21:14. |
#8
|
||||
|
||||
Цитата:
А на самом деле нужно в рамках одной транзакции записать значение мастер-записи на сервер, получить значение ID (не знаю, как это делается в ADO, к сожалению), прописать его всем подчиненным записям и вызвать UpdateBatch. Как понимаю, пакетный режим должен быть включен для подчиненного набора данных, а на мастере -- наоборот, все изменения происходят у одной записи, курсор БД стоит на месте, для тиражирования ID достаточно читать его значение -- это и будет значение ID текущей записи. |
#9
|
||||
|
||||
Цитата:
Код:
Master.UpdateBatch; // использовать filterGroup, Для фильтрации только "новых" данных? //т.к. запись может быть не одна: нужно пробежаться по всем новым запися, while not Detail.EOF ?? Detail.FieldByName('TicketID').AsInteger := Master.FieldDyName('ID').AsIntger; Detail.UpdateBatch; Цитата:
Хотите сказать Код:
Master.LockType := ltOptimistic; Ещё мне неясны слова Цитата:
BD в папке release (просто откомпилировать в release и всё само заведётся) Обе таблицы (tMaster и tDetail находятся в режиме ltLockBatchOptimistic ) Собственно, что писать в коде кнопки @Сохранить изменения и какие дополнительные манипуляции необходимо произвести? Проблема в том, что: Код:
tDetail.MasterSource := dsDetail; После того как Код:
tMaster.UpdateBatch; Нужен дополнительный tDetail_Temp, который не связан по MasterSource ?? и использовать его как временное хранилище? =\ попахивает "быдлокодом" Последний раз редактировалось Uniq!, 03.09.2013 в 12:58. |
#10
|
||||
|
||||
Я не работал с ADO, поэтому конкретно по его режимам подсказать не могу. Возможно, для корректной работы master-detail нужно временно присваивать добавленной мастер-записи код -1, который копировать в AfterInsert в подчиненные, а после получения актуального кода обновлять все отрицательные записи.
Вообще же, если делать ввод накладных по учебнику, должно быть так:
Вспомнил, что уже отвечал на похожую тему на другом форуме. Последний раз редактировалось Freeman, 03.09.2013 в 15:33. |
#11
|
||||
|
||||
Ощущение, что это очередные костыли, не отпускает меня.
Но они прочнее моих текущих)) Как отфильтровать/перебрать все отрицательные Detail записи? я уже выдвигал предположения по поводу цикла или Filter =... Последний раз редактировалось Uniq!, 03.09.2013 в 16:23. |
#12
|
||||
|
||||
Цитата:
Цитата:
|
#13
|
||||
|
||||
Зарубежные коллеги вот что мне подсказали:
Что, если возникла особая нужда иметь доступ к ID, то надо исключать ADO. Он статичен... ... this way we dont use ado. Я не вникал. Что посоветовали: Код:
ADOCommand.CommandText := 'SET :new_id = LAST_INSERT_ID()+1;' ADOCommand.Parameters[0].DataType := ftInteger; ADOCommand.Parameters[0].Direction := pdOutput; Таким образом получу новый ID и буду уже его везде подставлять. Только не могу понять в каком из параметров ADOCommand лежит ответ |
#14
|
||||
|
||||
Использование last_insert_id типично для веб-проектов, а в клиент-серверных системах считается если не совсем быдлокодом, то транзакционно небезопасным -- это точно. Хотя, если MySQL используется, у него транзакции через известное место.
Короче, на таком уровне уже советую почитать какую-нибудь серьезную литературу по проектированию и реализации клиент-серверных приложений как со стороны Delphi и DB-компонентов, так и со стороны сервера. |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
Uniq! (03.09.2013)
|
#15
|
||||
|
||||
Посоветуйте книгу, серьёзную на таком уровне, пожалуйста
Я реализовал, но мне не нравится |