Форум по 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, 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.
Ответить с цитированием
  #8  
Старый 30.08.2012, 14:42
SFproG SFproG вне форума
Прохожий
 
Регистрация: 24.08.2012
Адрес: Тюмень
Сообщения: 12
Версия Delphi: 7
Репутация: 10
По умолчанию

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

Можно кстати обойтись без объявления переменных в процедуре
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter