Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Различное поведение НД при вставке и редактировании. [Paradox]


Sergey__ ©   (2006-12-21 10:28:00) 

Уважаемые мастера, столкнулся со следующей ситуацией. Есть система учета взвешиваний, на каждое взвешивание оформляется  весовая карточка. При создании новой карточки, заполнения необходимых полей и последующем ее сохранении почему-то исчезают значения полей на форме ввода, хотя карточка сохраняется нормально. При вызове на редактирование ранее созданной карточки и последующем сохранении, значения полей на форме ввода остаются. Последовательность действий в обоих случаях одинакова. В чем может быть причина исчезновения значений полей на форме ввода при создании новой карточки ?


ЮЮ   (2006-12-22 02:54:00) [1]

Причину понял сам. Просто после сохранения новой карточки перестает выполняться условие выборки
SQL.Add('select * from cards is NULL');


Это же не фильтр DataSeta, а условие первоначальной выборки. Даже если запись и не удовлетворяет этому условию, сама она из DataSeta никуда не денется, пока твы не переоткроешь его.


Sergey__   (2006-12-21 13:05:00) [2]

2Anatoly Podgoretsky

> Не обманывай, из ниже приведеного кода этого не наблюдается


Не обманываю, говорю как на духу :-) Причину понял сам. Просто после сохранения новой карточки перестает выполняться условие выборки
 SQL.Add('select * from cards');
If newcard then begin
 SQL.Add('where cardn is NULL');

т.к. поле cardn уже не NULL. И в приведенном коде это четко наблюдается :-) Тем не менее всем ответившим огромное спасибо.


ЮЮ   (2006-12-21 13:01:00) [3]

Во-первых, для вставки одной записи кэшировать НД совсем ни к чему.
DM.DB.StartTransaction;
ApplyUpdates;
DM.DB.Commit;
QGetCard.CommitUpdates;

If newcard then begin
 SQL.Add('where cardn is NULL');
 Open;
 Insert;
 CardT.Time := Time;
end


QGetCard содержит только одну карточку, или Inserted или с cardn = GurCardF.Tag. Чему равен GurCardF.Tag после вставки - непонятно, т.е.
код на Создание\редактирование карточки запросто может вернуть пустой набор, как для вставк, если он затем выполняется. Поставь брекпоинт для контроля этого кода. Возможно, что QGetCard после сохранения где-то переоткрывается. Создай у него AfterOpen, чтобы поймать в отладчике


Anatoly Podgoretsky   (2006-12-21 12:27:00) [4]

> Sergey__  (21.12.2006 11:16:05)  [5]

Не обманывай, из ниже приведеного кода этого не наблюдается


Плохиш   (2006-12-21 12:05:00) [5]


> Sergey__   (21.12.06 12:02) [12]
> 2Плохиш
>
> > Осталось выяснить каким боком тут какая-то "форма ввода".
>
>
>
> Экранная форма, в которой пользователь заполняет необходимые
> поля.
> TCardF = class(TForm)

Всё, мне скучно, не люблю партизанов, можешь дальше не продолжать.


Sergey__   (2006-12-21 12:02:00) [6]

2Плохиш

> Осталось выяснить каким боком тут какая-то "форма ввода".


Экранная форма, в которой пользователь заполняет необходимые поля.
TCardF = class(TForm)


Плохиш   (2006-12-21 11:55:00) [7]

Осталось выяснить каким боком тут какая-то "форма ввода".


Sergey__   (2006-12-21 11:46:00) [8]

2ЮЮ

Создание\редактирование карточки

.
.
.
.
With QGetCard do begin
 Close;
 SQL.Clear;
 SQL.Add('select * from cards');
 If newcard then begin
  SQL.Add('where cardn is NULL');
  Open;
  Insert;
  CardT.Time := Time;
 end else begin
  SQL.Add('where cardn = ' + IntToStr(GurCardF.Tag));
  Open;
  Line.KeyValue := FieldByName('LineId').Value;
  Brak.KeyValue := FieldByName('GoodID').Value;
  Reason.KeyValue := FieldByName('MotivId').Value;
  Boss.KeyValue := FieldByName('BossId').Value;
  Box.KeyValue := FieldByName('BoxId').Value;
  CardT.Time := FieldByName('CardT').Value;
  Edit;
 end;
end;
.
.
.


procedure TCardF.QGetCardAfterInsert(DataSet: TDataSet);
var cardn    : integer;
   h,m,s,ms : word;
begin
QGetCard.FieldByName('OperID').Value := oper_cod;
with QGetNcard do begin
 Close;
 Open;
 if Fields[0].Value = Null then cardn := 1
                           else cardn := Fields[0].Value + 1;
 Close;
end;
QGetCard.FieldByName('CardN').Value := cardn;
QGetCard.FieldByName('CardD').Value := Now;
QGetCard.FieldByName('CardT').Value := Time;
QGetCard.FieldByName('Brutto').Value := 0;
QGetCard.FieldByName('Netto').Value := 0;
QGetCard.FieldByName('PaletW').Value := Palett;
with DM.QCalcSmen do begin
 Close;
 DecodeTime(Time,h,m,s,ms);
 ParamByName('cs').Value := h * 3600 + m * 60 + s;
 Open;
 QGetCard.FieldByName('Smena').Value := FieldByName('Number').Value;
 Close;
end;
end;


Сохранение карточки

.
.
.
If not DM.DB.InTransaction then DM.DB.StartTransaction;
try
 With QGetCard do begin
  FieldByName('LineID').Value := Line.KeyValue;
  FieldByName('GoodID').Value := Brak.KeyValue;
  FieldByName('MotivID').Value := Reason.KeyValue;
  FieldByName('BoxID').Value := Box.KeyValue;
  FieldByName('BossID').Value := Boss.KeyValue;
  If oper_cod = admin then
   FieldByName('Cardd').Value := DateToStr(DtC.Date) + ' ' +      TimeToStr(CardT.Time);
  CheckBrowseMode;
  ApplyUpdates;
 end;
 DM.DB.Commit;
 QGetCard.CommitUpdates;
except
 ErrorFl := True;
 DM.DB.RollBack;
end;
.
.
.


ЮЮ   (2006-12-21 11:36:00) [9]


> Сейчас накопирую...


Полегче там ... :)


Sergey__   (2006-12-21 11:34:00) [10]

2Плохиш

> Тогда в чём вопрос?


Вопрос изложен в самом начале :-) Но повторюсь : значения полей на форме ввода исчезают ПОСЛЕ сохранения заполненной записи. При редактировании такого эффекта не наблюдается.

2ЮЮ

Сейчас накопирую...


Плохиш   (2006-12-21 11:21:00) [11]


> Sergey__   (21.12.06 11:16) [5]


> Но после этого поля заполняются необходимыми значениями.

Тогда в чём вопрос?


ЮЮ   (2006-12-21 11:20:00) [12]

Значит показывай какой код выполняется для вставки, редактирования и сохранения записи. Конкретно твой. И обработчики событий DataSet-а.


Sergey__   (2006-12-21 11:16:00) [13]

2ЮЮ


> > В какой момент?


При сохранении.


> Форма ввода показавается модально? Тогда
> > она должна вообще закрыться.


Нет, не модально.

2Плохиш

> По методу Insert в наборе данных создаётся новая запись
> с пустыми полями.
>


Это я знаю. Но после этого поля заполняются необходимыми значениями.


Плохиш   (2006-12-21 11:02:00) [14]


> Sergey__   (21.12.06 10:44) [2]
> 2ЮЮ
> Код мой. Различие одно - при создании я делаю Insert

По методу Insert в наборе данных создаётся новая запись с пустыми полями.

PS. Никак люди не поймут, что не может любая кухарка не только управлять государством, но и быть программистом :-(


ЮЮ   (2006-12-21 10:53:00) [15]


> При создании новой карточки, заполнения необходимых полей
> и последующем ее сохранении почему-то исчезают значения
> полей на форме ввода, хотя карточка сохраняется нормально.
>


В какой момент? Форма ввода показавается модально? Тогда она должна вообще закрыться.

Последовательность действий в обоих случаях одинакова.

Чьих действий? Пользователя или программы. У тебя используется тот же код в обоих случаях, или скопирован?

З.Ы. Ты с кодом и Дельфи ошибку найти не можешь, а нас телепатировать заставляешь.


Sergey__   (2006-12-21 10:44:00) [16]

2ЮЮ
Код мой. Различие одно - при создании я делаю Insert, а при редактировании Edit. Дальнейшие действия абсолютно идентичны. Пробовал после Insert сделать сразу же Post и Edit, эффект остался неизменным.


ЮЮ   (2006-12-21 10:33:00) [17]


> В чем может быть причина исчезновения значений полей на
> форме ввода при создании новой карточки ?


Например, сделано специально, для ввода многих карточек подряд. Т.е. после сохранения на форме ввода уже вставленная запись.


> В чем может быть причина исчезновения значений полей на
> форме ввода при создании новой карточки ?


Если код твой - то только в нем :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо