![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Различное поведение НД при вставке и редактировании. [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]
> В чем может быть причина исчезновения значений полей на
> форме ввода при создании новой карточки ?
Например, сделано специально, для ввода многих карточек подряд. Т.е. после сохранения на форме ввода уже вставленная запись.
> В чем может быть причина исчезновения значений полей на
> форме ввода при создании новой карточки ?
Если код твой - то только в нем :)