Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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"и очень даже хороши!!!
С уважением, Шаман



Страницы: 1 вся ветка

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

Наверх





Память: 0.5 MB
Время: 0.006 c
1-57807
Di_wind
2002-04-06 19:03
2002.04.18
RxLib


3-57581
Ninelle
2002-03-26 16:29
2002.04.18
lookup в wwdbgrid


3-57612
shane54
2002-03-27 16:06
2002.04.18
Как перейти на следующую запись?


1-57676
daos
2002-04-07 15:08
2002.04.18
Подскажите где есть РАБОТАЮЩИЕ компоненты для шифрования!


1-57783
Avgurin
2002-04-06 05:37
2002.04.18
GIF в Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский