Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
ВнизРазличное поведение НД при вставке и редактировании. Найти похожие ветки
← →
Sergey__ (2006-12-21 10:28) [0]Уважаемые мастера, столкнулся со следующей ситуацией. Есть система учета взвешиваний, на каждое взвешивание оформляется весовая карточка. При создании новой карточки, заполнения необходимых полей и последующем ее сохранении почему-то исчезают значения полей на форме ввода, хотя карточка сохраняется нормально. При вызове на редактирование ранее созданной карточки и последующем сохранении, значения полей на форме ввода остаются. Последовательность действий в обоих случаях одинакова. В чем может быть причина исчезновения значений полей на форме ввода при создании новой карточки ?
← →
ЮЮ © (2006-12-21 10:33) [1]
> В чем может быть причина исчезновения значений полей на
> форме ввода при создании новой карточки ?
Например, сделано специально, для ввода многих карточек подряд. Т.е. после сохранения на форме ввода уже вставленная запись.
> В чем может быть причина исчезновения значений полей на
> форме ввода при создании новой карточки ?
Если код твой - то только в нем :)
← →
Sergey__ (2006-12-21 10:44) [2]2ЮЮ
Код мой. Различие одно - при создании я делаю Insert, а при редактировании Edit. Дальнейшие действия абсолютно идентичны. Пробовал после Insert сделать сразу же Post и Edit, эффект остался неизменным.
← →
ЮЮ © (2006-12-21 10:53) [3]
> При создании новой карточки, заполнения необходимых полей
> и последующем ее сохранении почему-то исчезают значения
> полей на форме ввода, хотя карточка сохраняется нормально.
>
В какой момент? Форма ввода показавается модально? Тогда она должна вообще закрыться.
Последовательность действий в обоих случаях одинакова.
Чьих действий? Пользователя или программы. У тебя используется тот же код в обоих случаях, или скопирован?
З.Ы. Ты с кодом и Дельфи ошибку найти не можешь, а нас телепатировать заставляешь.
← →
Плохиш © (2006-12-21 11:02) [4]
> Sergey__ (21.12.06 10:44) [2]
> 2ЮЮ
> Код мой. Различие одно - при создании я делаю Insert
По методу Insert в наборе данных создаётся новая запись с пустыми полями.
PS. Никак люди не поймут, что не может любая кухарка не только управлять государством, но и быть программистом :-(
← →
Sergey__ (2006-12-21 11:16) [5]2ЮЮ
> > В какой момент?
При сохранении.
> Форма ввода показавается модально? Тогда
> > она должна вообще закрыться.
Нет, не модально.
2Плохиш
> По методу Insert в наборе данных создаётся новая запись
> с пустыми полями.
>
Это я знаю. Но после этого поля заполняются необходимыми значениями.
← →
ЮЮ © (2006-12-21 11:20) [6]Значит показывай какой код выполняется для вставки, редактирования и сохранения записи. Конкретно твой. И обработчики событий DataSet-а.
← →
Плохиш © (2006-12-21 11:21) [7]
> Sergey__ (21.12.06 11:16) [5]
> Но после этого поля заполняются необходимыми значениями.
Тогда в чём вопрос?
← →
Sergey__ (2006-12-21 11:34) [8]2Плохиш
> Тогда в чём вопрос?
Вопрос изложен в самом начале :-) Но повторюсь : значения полей на форме ввода исчезают ПОСЛЕ сохранения заполненной записи. При редактировании такого эффекта не наблюдается.
2ЮЮ
Сейчас накопирую...
← →
ЮЮ © (2006-12-21 11:36) [9]
> Сейчас накопирую...
Полегче там ... :)
← →
Sergey__ (2006-12-21 11:46) [10]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:55) [11]Осталось выяснить каким боком тут какая-то "форма ввода".
← →
Sergey__ (2006-12-21 12:02) [12]2Плохиш
> Осталось выяснить каким боком тут какая-то "форма ввода".
Экранная форма, в которой пользователь заполняет необходимые поля.TCardF = class(TForm)
← →
Плохиш © (2006-12-21 12:05) [13]
> Sergey__ (21.12.06 12:02) [12]
> 2Плохиш
>
> > Осталось выяснить каким боком тут какая-то "форма ввода".
>
>
>
> Экранная форма, в которой пользователь заполняет необходимые
> поля.
> TCardF = class(TForm)
Всё, мне скучно, не люблю партизанов, можешь дальше не продолжать.
← →
Anatoly Podgoretsky © (2006-12-21 12:27) [14]> Sergey__ (21.12.2006 11:16:05) [5]
Не обманывай, из ниже приведеного кода этого не наблюдается
← →
ЮЮ © (2006-12-21 13:01) [15]Во-первых, для вставки одной записи кэшировать НД совсем ни к чему.
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, чтобы поймать в отладчике
← →
Sergey__ (2006-12-21 13:05) [16]2Anatoly Podgoretsky
> Не обманывай, из ниже приведеного кода этого не наблюдается
Не обманываю, говорю как на духу :-) Причину понял сам. Просто после сохранения новой карточки перестает выполняться условие выборкиSQL.Add("select * from cards");
If newcard then begin
SQL.Add("where cardn is NULL");
т.к. поле cardn уже не NULL. И в приведенном коде это четко наблюдается :-) Тем не менее всем ответившим огромное спасибо.
← →
ЮЮ © (2006-12-22 02:54) [17]Причину понял сам. Просто после сохранения новой карточки перестает выполняться условие выборки
SQL.Add("select * from cards is NULL");
Это же не фильтр DataSeta, а условие первоначальной выборки. Даже если запись и не удовлетворяет этому условию, сама она из DataSeta никуда не денется, пока твы не переоткроешь его.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c