Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сохранение документа и его табличной части  (Прочитано 8455 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Zabava
Гость
« : 23-07-2010 10:49 » 

Пожалуйста, подскажите как лучше работать с данными документа, с реквизитами шапки документа и его табличной частью.
Используется две таблицы, одна хранит реквизиты самих документов, другая - их табличные части. Здесь была моя ладья...
При создании нового документа надо "привязать " его табличную часть к несохраненной еще части документа, а пользователь может на каком-то этапе прервать операцию, отказаться от ввода документа. Отдельно создано еще 2 временные таблицы, куда первоначально накапливается информация, затем при подтвержении записи - это переносится хранимой процедурой в рабочие таблицы. Есть ли другие варианты? А черт его знает...
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 23-07-2010 11:06 » 

какая СУБД?
Записан

Zabava
Гость
« Ответ #2 : 23-07-2010 11:30 » 

Delphi 7.0 и Firebird 2.1
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 23-07-2010 11:56 » 

а почему не использовать транзакции? если пользователь прерывает операцию - просто откатываете её назад и всё.

собственно, именно для таких ситуаций транзакции и предназначены, и не только в FB, а в любой СУБД.

Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 23-07-2010 12:27 » 

имеется в виду, что при создании нового документа вы сразу формируете его заголовок минимум значений (мастер-таблицу, насколько я понимаю). можно даже её запостить. и дальше пользователь вводит данные в основную (подчинённую) таблицу, также может изменить какие-то данные (кроме ключей) в заголовке. если он передумал - вы просто откатываете транзакцию и данные сохранены не будут.
Записан

Zabava
Гость
« Ответ #5 : 23-07-2010 13:10 » 

А вот тут, пож., поподробнее. Делаем транзакцию активной, работаем над документом, если все ОК, то Commit, иначе - Rollback?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 23-07-2010 13:38 » 

ну да, куда уж поподробнее? Улыбаюсь

1. IbTransaction.StartTransaction;
2. if (Form1.ShowModal = mrOk) then (3) else => (4) // предполагается, что Form1 - это диалог работы с документом
3. IbTransaction.Commit; | CommitRetaining;
4. IbTransaction.RollBack; | RollbackRetaining;
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 23-07-2010 13:41 » 

з.ы. судя по тому, что вы спрашиваете о транзакциях, в качестве компонентов доступ аиспользуются FIB+, где у Database стоит AutoCommit = TRUE. если это так, то на период редактирования автокоммит придётся отключить.
Записан

Zabava
Гость
« Ответ #8 : 26-07-2010 10:33 » 

Спасибо большое, получается теперь нормально.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 26-07-2010 12:31 » 

аминь Ага
Записан

Zabava
Гость
« Ответ #10 : 28-07-2010 11:28 » 

Не всё в шоколаде!
Компоненты IBX.

кусок кода:

try
    if Drag.Modified=true then
    begin
      Drag.Edit;
      Drag['ID_PREDMET'] := RxDBLookupCombo1.KeyValue;
      Drag['ID_Termin1'] := Term1;
      Drag['ID_Termin2'] := Term2;
      Drag['ID_Termin3'] := Term3;
      Drag['KolPred'] := RxDBCalcEdit1.Value;
      Drag['ID_Price'] := RxDBLookupCombo5.KeyValue;
      Drag['Cena'] := DM1.Price['Cena'];
      Drag['Kol'] := RxDBCalcEdit2.Value;
      Drag['Minus'] := RxDBCalcEdit3.Value;
      Drag['Termin1'] := Name1;
      Drag['Termin2'] := Name2;
      Drag['Termin3'] := Name3;
      Drag['Name'] := DM1.Predmet['Name'];
      Drag['Sum_Oc'] := (RxDBCalcEdit2.Value-RxDBCalcEdit3.Value)*DM1.Price['Cena'];
      Drag['ID'] := 0;
      Drag['Opis'] := DBMemo1.Text;
      Drag['SProd'] := 0.00;
      Drag.Post;
      DM1.IBTr1.CommitRetaining;
   end;
   finally
      Drag.Close;
      Drag.Open;
   end;

ругается при закрытии таблицы Drag. Типа уже и так закрыта.

Вся идея вот в чём:

имеется две связанные таблицы, которые на форме отображаются в двух ДБГридах как список билетов и под ним список предметов, входящих в табличную часть билета.

Выбрали нужный билет (или добавили новый) и надо добавить предметы в его табличную часть.
Вызываем следующую форму, где представлен сам билет и его табл. часть. Заполняем его реквизиты, жмем на Добавить предмет в табличную часть. Третья форма отображает данные самого предмета с его потрохами.
И вот тут стали появляться чудеса: При открытии формы для добавления нового предмета - Drag.Append, затем выбираем на форме нужные значения, сохраняем и ... Ничего нет в базе. Сделано сейчас как выше, т.е. прямо перед сохранением присваиваем значения, то же самое.

Что делаю не так?

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines