Текущий архив: 2002.04.18;
Скачать: CL | DM;
Вниз
проблема c DataSource.DataChange Найти похожие ветки
← →
Roman_Tutov@mail.ru (2002-03-28 10:48) [0]procedure TForm1.DataSource3DataChange(Sender: TObject; Field: TField);
var
Result : integer;
begin
if Table1.Active=true then
Result:=0;
Table1.First;
while not Table1.Eof do begin
Result:=(Result+(Table1.FieldByName("TSENA").asInteger)*(Table1.FieldByName("KOLVO").asInteger));
Table1.Next;
end;
Form1.Frame81.Frame91.Label2.Caption:=(FloattoSTr(Result));
end;
end.
почему при исполнения этого текста я получаю
"Access violation " ?
Этот-же текст привязанный к кнопке работает ?
Бага ?
← →
Lusha (2002-03-28 11:13) [1]А DataSource3 случаем не к Table1 привязана? :)
← →
Roman_Tutov@mail.ru (2002-03-28 11:16) [2]Именно к ней . А тогда как эту проблему можно решить ?
если мне нужно при изменении table1 подсчитывать сумму ячеек ?
← →
Shaman_Naydak (2002-03-28 11:19) [3]Ага, у тебя! :)
Я так понимаю - у тебя DataSource3 как раз к Table1 и
привязан.. Нет, батенька, так дело не пойдет!
Объясню:
При первом же перемещении по таблице у тебя опять должен вызваться сам же этот обработчик. -> произойдет зацикливание
← →
Aleksandr (2002-03-28 11:22) [4]Если у Вас привязка DataSource к этой таблице, то она сама себя будет заклинивать в рекурсии... Потому что OnDataChange вызывается при редактировании, при этом еще должен произойти Post, а если его не произошло, то то обращения типа AsInteger, Next и прочее - это же опять изменения в таблице... Если же завязки нет, то проверьте поля сначала If FindField()<>nil...
← →
Lusha (2002-03-28 11:23) [5]Не думаю, что Вы правильно выбрали обработчик...
Событие OnChange у TDataSource возникает при перемещении на другую запись или поле, при изменении содержимого поля в связанном наборе данных.
Какое из перечисленных изменений интересует Вас?
← →
Roman_Tutov@mail.ru (2002-03-28 11:25) [6]Я правильно понял , что из этого обработчика с этой таблицей работать вообще нельзя ?
← →
Roman_Tutov@mail.ru (2002-03-28 11:27) [7]мне нужно , чтобы при добавлении/удаления записи в таблицу
выполнялся вышеуказанный код
← →
Aleksandr (2002-03-28 11:28) [8]Пока писал, уже откомментировали :)
В общем, то, что Вы делаете, нужно делать в событии OnCalcFields и добавить новое поле типа Calculated, в которое и вносить сумму... А еще лучше - добавить Query, который по событию OnStateChange будет вызываться и ссуммировать нужное...
← →
Lusha (2002-03-28 11:28) [9]А как насчет AfterPost?
← →
Roman_Tutov@mail.ru (2002-03-28 11:36) [10]Нет из OnCalcFields не работает . Такое впечатление ,
что событие OnCalcFields во время всавки в таблицу вообще не возникает . Такое может быть ?
← →
Roman_Tutov@mail.ru (2002-03-28 11:40) [11]>Lusha © (28.03.02 11:28)
>А как насчет AfterPost?
Нет мне нужно при Любом изменении таблицы ,а не только вставки
← →
Aleksandr (2002-03-28 11:49) [12]Гы, AutoCalcFields включил? Во время вставки он и не будет работать. Таблица не в режиме Browse. А вот ПОСЛЕ сохранения/удаления - посчитает. Но я говорю, лучше сделай по умному: компонента TQuery, в ней запрос, и на каждое OnStateChange делай ей ExecSQL с присвоением твоему результу расчетного поля...
← →
Shaman_Naydak (2002-03-28 11:49) [13]На, повесь на AfterPost и AfterOpen
procedure TForm1.Table1AfterOpenAndPost(DataSet: TDataSet);
var Result: Integer;
Bookmark: TBookmark;
begin
Result:=0;
if Table1.State = dsBrowse then
begin
Bookmark := Table1.GetBookmark;
Table1.DisableControls;
try
Table1.First;
while not Table1.Eof do
begin
inc(Result, Table1.FieldByName("TSENA").asInteger*Table1.FieldByName("KOLVO").asInteger);
Table1.Next;
end;
finally
Table1.GotoBookmark(Bookmark);
Table1.EnableControls;
Table1.FreeBookmark(Bookmark);
end;
end;
Form1.Frame81.Frame91.Label2.Caption:=IntToStr(Result);
end;
Кстати, что за любовь к скобкам?
Можно сделать и по другому..
← →
Shaman_Naydak (2002-03-28 11:52) [14]Тьфу ты, проверка на dsBrowse не нужна..
А вот если повесить на OnStateChange (так тоже мона), то нужна!
← →
Aleksandr (2002-03-28 11:57) [15]2Shaman_Naydak: Мне кажется, лучше не советовать работать с закладками... Криво они работают, сколько раз убеждался... И уникальности не обеспечивают, и теряются, и переход не могут осуществить... От компиляции к компиляции настроение меняют...
← →
Roman_Tutov@mail.ru (2002-03-28 12:05) [16]to Shaman_Naydak © (28.03.02 11:49)
>>На, повесь на AfterPost и AfterOpen
>>procedure TForm1.Table1AfterOpenAndPost(DataSet: TDataSet);
Код работает ,спасибо . Но всё-таки я попробую поставить еще один
TQuery и считать через него . Авось и получиться .
ЗЫ Все равно ещё с этим столкнусь
← →
Shaman_Naydak (2002-03-28 12:09) [17]>> Aleksandr .. мда, если нет уникального ключа, то с ними действительно бывает просто беда..
Но гонять query не оптимально ( у него же фоксовая таблица)
>> Roman
Могу посоветовать след. вариант - быстро как в танке.
Только на AfterOpen прогнать цикл, вычислить сумму и сохранить ее TotalSum.
На изменение полей TSENA и KOLVO поставить обработчик
в котором: TotalSum:=TotalSum-OldTsena*OldKolvo+NewTsena*NewKolvo
В общем, вилы что-то подробно расписывать.. если что - цинкани
← →
Johnmen (2002-03-28 12:10) [18]>Aleksandr © : Если с закладками работать правильно, то никаких глюков не будет ! И работают они прямо, а не криво !
>Roman_Tutov@mail.ru : Используй, как уже говорилось, OnCalcFields...
← →
Aleksandr (2002-03-28 12:17) [19]2 Johnmen, а Вы попробуйте... Я пять лет старые программы лопачу, и каждый раз, когда в гриде требуется такая простая и актуальная вещь, как позиционирование курсора на отредактированной/вставленной записи, чего в них не работало, выясняется, что виновата закладка... Шаман совершенно прав - если нет уникального ключа (а такое всегда, если работа с распределенными таблицами), то хрен с ними поработаешь...
← →
Johnmen (2002-03-28 14:11) [20]>Aleksandr © :
>....как позиционирование курсора на
>отредактированной/вставленной записи, чего в них не работало...
Я что-то не совсем уловил, кто позиционирует курсор, в чем в них и что не работало ???
Если приведешь подробное описание того, где у тебя не работает
закладка, то я покажу тебе, что она работает...
← →
Shaman_Naydak (2002-03-28 19:42) [21]>> Johnmen
Я попытаюсь ответить за Александра.
1. Мы говорим о Fox/DBase таблицах..
Структура этих таблиц изначально по своей природе не имеет primary key.. то есть в таблице практически не за что зацепиться..вспомните-ка сколько лет этому формату..
Дельфи вообще всегда имел проблему с нумерацией записей в этом формате..
Кроме того, из-за необязательности индексов и существования огромного числа их форматов (Delphi - mdx, FoxPro -idx, cdx, Clipper - ntx и еще у кого-то есть ndx) постоянно возникает
проблема неактуальности индексов..
А программа на Дельфи обычно представляет собой прибамбас к какой-нибудь старой программе (ну кто сам будет писать под такой формат :))
-> индексы постоянно слетают (но при этом эта ситуация не фиксируется, а просто аппликуха начинает некорректно работать)
Кстати, они и сами по себе хорошо слетают.. и все серьезные программы обязательно умеют полностью их перестраивать..
не буду расписывать всякие ухищрения...
А сами по себе TBookmark"и очень даже хороши!!!
С уважением, Шаман
Страницы: 1 вся ветка
Текущий архив: 2002.04.18;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.005 c