Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

проблема 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"и очень даже хороши!!!
С уважением, Шаман




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.02 c
3-57615           sysoper               2002-03-28 07:10  2002.04.18  
Ошибка в IB5.6 +Win2000 server+sp2


1-57775           VS2001                2002-04-01 15:59  2002.04.18  
Распаковка архива из памяти (TMemoryStream)


1-57754           voland0               2002-04-05 12:37  2002.04.18  
Помогите!!! onStartDrag в TDBGrid не наступает!!!


14-57883          Фэ                    2002-03-04 23:10  2002.04.18  
Shells


4-57915           ctapik-net            2002-02-14 15:58  2002.04.18  
Определениие списка компьютеров в сети.