Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.013 c
3-57581
Ninelle
2002-03-26 16:29
2002.04.18
lookup в wwdbgrid


1-57716
Kate
2002-04-08 11:16
2002.04.18
Scrollbar


1-57813
SeF
2002-04-02 02:57
2002.04.18
Getclassname


3-57622
Malder
2002-03-27 20:09
2002.04.18
тип Date


3-57621
IronHawk
2002-03-27 18:55
2002.04.18
Как в обыкновенной форме подключенной к базе через DBGrid, ....