Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема c DataSource.DataChange [D5, dBase, FoxPro]


Страницы:   1 2

Roman_Tutov@mail.ru ©   (2002-03-28 10:48:00) 

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 " ?

Этот-же текст привязанный к кнопке работает ?
Бага ?


Shaman_Naydak   (2002-03-28 19:42:00) [1]

>> Johnmen
Я попытаюсь ответить за Александра.
1. Мы говорим о Fox/DBase таблицах..
Структура этих таблиц изначально по своей природе не имеет primary key.. то есть в таблице практически не за что зацепиться..вспомните-ка сколько лет этому формату..
Дельфи вообще всегда имел проблему с нумерацией записей в этом формате..
Кроме того, из-за необязательности индексов и существования огромного числа их форматов (Delphi - mdx, FoxPro -idx, cdx, Clipper - ntx и еще у кого-то есть ndx) постоянно возникает
проблема неактуальности индексов..
А программа на Дельфи обычно представляет собой прибамбас к какой-нибудь старой программе (ну кто сам будет писать под такой формат :))
-> индексы постоянно слетают (но при этом эта ситуация не фиксируется, а просто аппликуха начинает некорректно работать)
Кстати, они и сами по себе хорошо слетают.. и все серьезные программы обязательно умеют полностью их перестраивать..
не буду расписывать всякие ухищрения...

А сами по себе TBookmark"и очень даже хороши!!!
С уважением, Шаман


Johnmen   (2002-03-28 14:11:00) [2]

>Aleksandr © :
>....как позиционирование курсора на
>отредактированной/вставленной записи, чего в них не работало...

Я что-то не совсем уловил, кто позиционирует курсор, в чем в них и что не работало ???

Если приведешь подробное описание того, где у тебя не работает
закладка, то я покажу тебе, что она работает...


Aleksandr   (2002-03-28 12:17:00) [3]

2 Johnmen, а Вы попробуйте... Я пять лет старые программы лопачу, и каждый раз, когда в гриде требуется такая простая и актуальная вещь, как позиционирование курсора на отредактированной/вставленной записи, чего в них не работало, выясняется, что виновата закладка... Шаман совершенно прав - если нет уникального ключа (а такое всегда, если работа с распределенными таблицами), то хрен с ними поработаешь...


Johnmen   (2002-03-28 12:10:00) [4]

>Aleksandr © : Если с закладками работать правильно, то никаких глюков не будет ! И работают они прямо, а не криво !
>Roman_Tutov@mail.ru : Используй, как уже говорилось, OnCalcFields...


Shaman_Naydak   (2002-03-28 12:09:00) [5]

>> Aleksandr .. мда, если нет уникального ключа, то с ними действительно бывает просто беда..

Но гонять query не оптимально ( у него же фоксовая таблица)

>> Roman
Могу посоветовать след. вариант - быстро как в танке.
Только на AfterOpen прогнать цикл, вычислить сумму и сохранить ее TotalSum.
На изменение полей TSENA и KOLVO поставить обработчик
в котором: TotalSum:=TotalSum-OldTsena*OldKolvo+NewTsena*NewKolvo

В общем, вилы что-то подробно расписывать.. если что - цинкани


Roman_Tutov@mail.ru   (2002-03-28 12:05:00) [6]

to Shaman_Naydak © (28.03.02 11:49)

>>На, повесь на AfterPost и AfterOpen
>>procedure TForm1.Table1AfterOpenAndPost(DataSet: TDataSet);

Код работает ,спасибо . Но всё-таки я попробую поставить еще один
TQuery и считать через него . Авось и получиться .

ЗЫ Все равно ещё с этим столкнусь


Aleksandr   (2002-03-28 11:57:00) [7]

2Shaman_Naydak: Мне кажется, лучше не советовать работать с закладками... Криво они работают, сколько раз убеждался... И уникальности не обеспечивают, и теряются, и переход не могут осуществить... От компиляции к компиляции настроение меняют...


Shaman_Naydak   (2002-03-28 11:52:00) [8]

Тьфу ты, проверка на dsBrowse не нужна..
А вот если повесить на OnStateChange (так тоже мона), то нужна!


Shaman_Naydak   (2002-03-28 11:49:00) [9]

На, повесь на 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;

Кстати, что за любовь к скобкам?

Можно сделать и по другому..


Aleksandr   (2002-03-28 11:49:00) [10]

Гы, AutoCalcFields включил? Во время вставки он и не будет работать. Таблица не в режиме Browse. А вот ПОСЛЕ сохранения/удаления - посчитает. Но я говорю, лучше сделай по умному: компонента TQuery, в ней запрос, и на каждое OnStateChange делай ей ExecSQL с присвоением твоему результу расчетного поля...


Roman_Tutov@mail.ru   (2002-03-28 11:40:00) [11]

>Lusha © (28.03.02 11:28)
>А как насчет AfterPost?
Нет мне нужно при Любом изменении таблицы ,а не только вставки


Roman_Tutov@mail.ru   (2002-03-28 11:36:00) [12]

Нет из OnCalcFields не работает . Такое впечатление ,
что событие OnCalcFields во время всавки в таблицу вообще не возникает . Такое может быть ?


Lusha   (2002-03-28 11:28:00) [13]

А как насчет AfterPost?


Aleksandr   (2002-03-28 11:28:00) [14]

Пока писал, уже откомментировали :)
В общем, то, что Вы делаете, нужно делать в событии OnCalcFields и добавить новое поле типа Calculated, в которое и вносить сумму... А еще лучше - добавить Query, который по событию OnStateChange будет вызываться и ссуммировать нужное...


Roman_Tutov@mail.ru   (2002-03-28 11:27:00) [15]

мне нужно , чтобы при добавлении/удаления записи в таблицу
выполнялся вышеуказанный код


Roman_Tutov@mail.ru   (2002-03-28 11:25:00) [16]

Я правильно понял , что из этого обработчика с этой таблицей работать вообще нельзя ?


Lusha   (2002-03-28 11:23:00) [17]

Не думаю, что Вы правильно выбрали обработчик...
Событие OnChange у TDataSource возникает при перемещении на другую запись или поле, при изменении содержимого поля в связанном наборе данных.

Какое из перечисленных изменений интересует Вас?


Aleksandr   (2002-03-28 11:22:00) [18]

Если у Вас привязка DataSource к этой таблице, то она сама себя будет заклинивать в рекурсии... Потому что OnDataChange вызывается при редактировании, при этом еще должен произойти Post, а если его не произошло, то то обращения типа AsInteger, Next и прочее - это же опять изменения в таблице... Если же завязки нет, то проверьте поля сначала If FindField()<>nil...


Shaman_Naydak   (2002-03-28 11:19:00) [19]

Ага, у тебя! :)
Я так понимаю - у тебя DataSource3 как раз к Table1 и
привязан.. Нет, батенька, так дело не пойдет!
Объясню:
При первом же перемещении по таблице у тебя опять должен вызваться сам же этот обработчик. -> произойдет зацикливание


Roman_Tutov@mail.ru   (2002-03-28 11:16:00) [20]

Именно к ней . А тогда как эту проблему можно решить ?
если мне нужно при изменении table1 подсчитывать сумму ячеек ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо