Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.08.2012, 09:45
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию Вычисление поля в одной таблице, запись в другую

Есть две таблицы "Поставщики" и "Счета". Таблицы связаны. "Счета" (подчиненная) подцепляется по key1 к id "Поставщики" через MasterSource.
В итоге, один поставщик может иметь несколько счетов. В таблице "Счета" имеется колонка сумма (денежная).
У меня задача просуммировать колонку "сумма" из таблицы "Счета" и вывести в отдельную колонку в таблицу "Поставщики". Т.е. у каждой записи уникального поставщика, будет отображаться своя общая сумма из таблицы "Счета".

В таблице "Поставщики" создал поле fkCalculated. Написал такой обработчик:
Код:
procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet);
var x,y:Integer;
begin
ADOTable2.First;
y:=0;
While not ADOTable2.Eof do
begin
x:=ADOTable2['Сумма'];
y:=x+y;
ADOTable2.Next;
end;

ADOTable1schet.Value:=y;

end;
Выводит непонятно что. Подскажите как правильно сделать.

Хотя, если выводить результат в Label, то все работает нормально.
Код:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var x,y:Integer;
begin
ADOTable2.First;
y:=0;
While not ADOTable2.Eof do
begin
x:=ADOTable2['Сумма'];
y:=x+y;
ADOTable2.Next;
end;
Label1.Caption:=IntToStr(y);
end;
(Это если в DBGrid выделить строку с нужным поставщиком, то в Label отображается общая сумма из таблицы "Счета" принадлежащей определенному поставщику) Но мне это не надо. Мне нужно выводить сумму в строке DBGrid
Ответить с цитированием
  #2  
Старый 30.08.2012, 09:56
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Фильтр на таблицу 2 повесь перед циклом, чтоб он у тебя в цикле проходил не всю таблицу а только те записи которые соответствуют поставщику
Ответить с цитированием
  #3  
Старый 30.08.2012, 13:22
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Lost_Fish
Фильтр на таблицу 2 повесь перед циклом, чтоб он у тебя в цикле проходил не всю таблицу а только те записи которые соответствуют поставщику
Спасибо. Но знать бы как правильно фильтр написать.
Попытался нечто подобное сделать:
Код:
procedure TForm1.ADOTable4CalcFields(DataSet: TDataSet);
var x,y:Integer;
begin
ADOTable2.Filtered:=True;
ADOTable2.Filter:='Сумма'=+Form1.DBGrid1.Fields[0].AsString;

ADOTable2.First;
y:=0;
While not ADOTable3.Eof do
begin
x:=ADOTable2['Сумма'];
y:=x+y;
ADOTable3.Next;
end;

ADOTable1schet.Value:=y;

end;
Ни чего не получилось.
Ответить с цитированием
  #4  
Старый 30.08.2012, 13:32
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SFproG
Спасибо. Но знать бы как правильно фильтр написать.
Попытался нечто подобное сделать:
Код:
...
ADOTable2.Filter:='Сумма'=+Form1.DBGrid1.Fields[0].AsString;
...
А в этом месте компилятор не ругается?
Ответить с цитированием
  #5  
Старый 30.08.2012, 13:37
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

Да. Ругается.
Ответить с цитированием
  #6  
Старый 30.08.2012, 13:40
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SFproG
Да. Ругается.
А если её переделать так:
Код:
...
ADOTable2.Filter:='Сумма='+DBGrid1.Fields[0].AsString;
...
Ответить с цитированием
  #7  
Старый 30.08.2012, 13:56
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

Точно такую же ошибку компилятор выводит.
Ответить с цитированием
  #8  
Старый 30.08.2012, 14:05
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от SFproG
Спасибо. Но знать бы как правильно фильтр написать.
Попытался нечто подобное сделать:
Код:
procedure TForm1.ADOTable4CalcFields(DataSet: TDataSet);
var x,y:Integer;
begin
ADOTable2.Filtered:=True;
ADOTable2.Filter:='Сумма'=+Form1.DBGrid1.Fields[0].AsString;

ADOTable2.First;
y:=0;
While not ADOTable3.Eof do
begin
x:=ADOTable2['Сумма'];
y:=x+y;
ADOTable3.Next;
end;

ADOTable1schet.Value:=y;

end;
Ни чего не получилось.

Код:
ADOTable2.Filtered:=True;
ADOTable2.Filter:='Сумма='+Form1.DBGrid1.Fields[0].AsString;

Местами поменяй, фильтр включать после того как в него значение поставишь.
И этой строчкой ты пытаешься отфильтровать значения по сумме, а надо по поставщику.

и я бы сделал так
Код:
ADOTable2.Filter:='key1='+VarToStr(ADOTable1['ID']);
//или можно
ADOTable2.Filter:='key1='+ADOTable1.FieldByName('ID').AsString;
//кому как нравится

и да, почему у тебя цикл идёт по Table3 а суммируешь одну и туже запись из Table2?

Давай разберёмся

Код:
procedure КалькФиелдс;
var
    наша переменная
begin
    //ставим значение фильтра для таблицы счета, такое чтоб таблица счета показывала только те записи которые относятся к текущему поставщику из таблицы поставщиков (см. ваыше)
    //включаем фильтр
    //ставим начальное значение нашей переменной
    //Цикл пока не дойдем до конца таблицы счетов (ведь сумма значений именно из неё нас интересует) //после включения фильтра курсор автоматом ставится на первую запись
        //в цикле сумируем текущее значении из таблицы счетов с нашей переменной
        //переходим к следующей записи в таблице счетов
    //конец цикла
    //ну и на выходе у нас нужная сумма
end;

Последний раз редактировалось Lost_Fish, 30.08.2012 в 14:46.
Ответить с цитированием
  #9  
Старый 30.08.2012, 14:42
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
и да, почему у тебя цикл идёт по Table3 а суммируешь одну и туже запись из Table2?
Там не Table3, а Table2 должно стоять. Это в сообщении для форума ошибся. В проекте все правильно.
Пробую по подсказкам твоим сейчас работать. Спасибо.
Ответить с цитированием
  #10  
Старый 30.08.2012, 14:57
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Можно кстати обойтись без объявления переменных в процедуре
Ответить с цитированием
  #11  
Старый 30.08.2012, 18:51
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

Вроде, все правильно написал. Ошибку выдает: Filter property cannot be used for detail tables. Как я понял, нельзя применить фильтрацию в подчиненной таблице. Надо какой-то другой способ искать.
Наверно, через запросы ADOQuery1.
Ответить с цитированием
  #12  
Старый 31.08.2012, 06:31
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Тогда убери фильтр.
Вообще OnCalcFields происходит в самом начале при открытии и при редактировании, может у тебя не открыта в этот момент вторая таблица?
Если вышлешь проект могу посмотреть

Последний раз редактировалось Lost_Fish, 31.08.2012 в 07:09.
Ответить с цитированием
  #13  
Старый 31.08.2012, 08:59
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
Восклицание

Цитата:
Сообщение от Lost_Fish
Тогда убери фильтр.
Вообще OnCalcFields происходит в самом начале при открытии и при редактировании, может у тебя не открыта в этот момент вторая таблица?
Если вышлешь проект могу посмотреть
Вторая таблица, думаю, открыта в этот момент.

Отправлю проект. Он готов практически. Эта единственная проблема из-за чего показать не могу его.

CalcFields закомментирован у меня пока.
В общем, не получается чтобы на главной форме третий столбец заработал "Сумма выставленных счетов", как справа Label-метки, которые показывают то что нужно. (На Оплату не смотри, этот столбец я потом сам сделаю, на основе Счетов. Метки-Лабел удалятся ест-но)
Вложения
Тип файла: rar project111.rar (397.9 Кбайт, 12 просмотров)

Последний раз редактировалось SFproG, 31.08.2012 в 09:02.
Ответить с цитированием
  #14  
Старый 31.08.2012, 10:36
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

намучено у тебя))

ADOTable при калькулировании не скролит таблицу в связи с чем будем сами скролить

отвязываешь ADOTable2 от МастерСурс в обработчик ADOTable4AfterScroll пихаешь
Код:
		ADOTable2.Filter:='Key1='+VarToStr(ADOTable4['ID']);
    	ADOTable2.Filtered:=True;

а в ADOTable4CalcFields

Код:
	ADOTable2.Filter:='Key1='+VarToStr(ADOTable4['ID']);
    ADOTable2.Filtered:=True;
y:=0;
While not ADOTable2.Eof do
begin
x:=ADOTable2['Ñóììà ïî ñ÷åòó'];
y:=x+y;
ADOTable2.Next;
end;

ADOTable4schet.Value:=y;  
Ответить с цитированием
Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение:
SFproG (01.09.2012)
  #15  
Старый 01.09.2012, 07:42
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

Да, все работает Спасибо тебе Lost_Fish огромное! Очень помог.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter