Delphi

Операции над данными

Подскажите, пожалуйста, как сделать так, чтобы данные брались из одной таблицы, над ними производились математические действия, результат сравнивался с данными из другой таблицы и в зависимости от результата сравнения в третью таблицу заносились определенные данные. Спасибо.
какие данные из каких таблиц и какие операции, точнее пожалуйста если можно...
У меня база данных InterBase. В одной таблице находятся числа, их надо умножить на числа из другой таблицы, сложить и сравнить с числом из другой таблицы. Потом в зависимости от результата надо чтобы данные из одной таблицы автоматически заносились в другую таблицу на нужное место.
т.е. если я вас правильно понял, то у вас есть 4 таблицы. Взять числа с первой таблицы перемножить их на числа со второй таблицы, сложить с числами из третьей таблицы, сравнить с числами из четвертой таблицы... а дальше с чем сравнивать и куда записывать какие результаты...
У меня есть таблицы CHILDREN, TEACHER, MARKS, COEF. Мне надо числа из таблицы MARKS умножить на числа из таблицы KOEF и то что получилось сложить. Потом результат сравнить с числом из таблицы TEACHER и если оно больше или равно, то соответствующего преподавателя занести в таблицу CHILDREN.
Используйте 4 Table, 4 DataSet, 4 DBGrid.
Для выбора номера строки в таблице используйте:
Table_CHILDREN.RecNo:= i ;
Table_MARKS.Fields[N]) - значение N столбца, i строки.
//////////////////////////////////////
Для мат. операцийнапример)
var
K:integer;
..
begin
// Для расчетов выбираем первые строки БД
Table_CHILDREN.RecNo:=1;
Table_TEACHER.RecNo:=1;
Table_MARKS.RecNo:=1;
Table_COEF.RecNo:=1;
K:=strtoint(Table_MARKS.Fields[номер поля])*strtoint(Table_KOEF.Fields[номер поля]);
// сравниваем произведение на превышение
if К>strtoint(Table_TEACHER.Fields[нгомер поля]) then
begin
// если то записываем
Table_KOEF.Fields[нгомер поля]:=inttostr(k);
end;
end;
Пример показан для первой строки!!! Для всех записей добавить цикл for i и переводить RecNo:=i во всех таблицах.
Сообщение от Alex21
Для выбора номера строки в таблице используйте:
Table_CHILDREN.RecNo:= i ;
Table_MARKS.Fields[N]) - значение N столбца, i строки.
Читать: Первая и Вторая таблы с одним именем!!!
Table_CHILDREN.RecNo:= i ;
Table_CHILDREN.Fields[N])
Спасибо большое!!! Буду пробовать... ))))
K:=strtoint(Table_MARKS.Fields[номер поля])*strtoint(Table_KOEF.Fields[номер поля]);
А что делать, если оно мне в этой строчке выдает:
Incompatible types: 'String' and 'TField'
????
K:=Table_MARKS.Fields[номер поля].AsInteger*Table_KOEF.Fields[номер поля].AsInteger;
Не проверял, но должно работать, НО только в том случае, если тип поля числовой.
Работает, спасибо )))
begin
k:=0;
DShkola.Children.RecNo:=1;
for j:=1 to 6 do begin
DShkola.Teacher.RecNo:=j;
for i:=3 to 6 do begin
k:=k+(DShkola.Children.Fields[i+2].AsInteger*DShkola.teacher.Fields[i].AsInteger);
if (k>=DShkola.Teacher.Fields[7].AsInteger) then begin
DShkola.Children.Append;
DShkola.Children.Fields[9]:=DShkola.Teacher.Fields[0];
exit;
end;
вот какая процедура у меня в итоге получилась. Она работает, но записывает, то что мне надо в таблицу CHILDREN, добавляя новую строку. А как сделать, чтобы записывалось в туже строку из которой брались данные для подсчета, т.е. вот в эту DShkola.Children.RecNo:=1;
Table1.RecNo:= //Перевести указатель
Table1.Delete;//Стереть строку
Table1.InsertRecord([Form2.edit1.Text,Form2.Edit2.Text...Все поля через ЗПТ]);//Вставить новую
P.S.:Должен быть способ и попроще.
begin
k:=0;
DShkola.Children.RecNo:=1;
for j:=1 to 6 do begin
DShkola.Teacher.RecNo:=j;
for i:=3 to 6 do begin
k:=k+(DShkola.Children.Fields[i+2].AsInteger*DShkola.teacher.Fields[i].AsInteger);
if (k>=DShkola.Teacher.Fields[7].AsInteger) then begin
DShkola.Children.Append;
DShkola.Children.Fields[9]:=DShkola.Teacher.Fields[0];
exit;
end;
Если в этой процедуре заменить строчку DShkola.Children.Append;
на строчку DShkola.Children.Edit , тогда оно у меня строку не добавляет, но записывает результат в выделенную строку, а как сделать чтобы оно записывало во все строки подряд, т.е начинало и с первой и автоматически после каждой записи переводило курсор?
Чем неподходит то-что выше?
После Edit надо вобще-то ApplyRange;
Странный у Вас алгоритм!
Append - добавляет запись в конец(!)
DShkola.Children.RecNo:=i; // переход на нужную строку
DShkola.Teacher.RecNo:=j; // переход на нужную строку
DShkola.Children.Delete; // удаляем эту строку со старыми записями
DShkola.Children.InsertRecord([DShkola.Teacher.Fields[0].text,DShkola.Teacher.Fields[1].text,DShkola.Teacher.Fields[2].text.......]); // вставляем новую
Не проверял, но в [ ] должен быть тип String
То что віше не подходит, т.к. у меня неоткуда потом заново данніе в єту строку записывать. Это надо ставить дополнительные компоненты и бросать все туда-сюда. Я потом это пробую, если больше ничего не придумаю )))
А что делает ApplyRange?
В том-то и дело, что мне не надо всю строку менять, а просто дописать значение в одно поле.
А алгоритм у меня странный, потому что я абсолютно ничего в этом не смыслю и с БД первый раз пришлось дело иметь. )))))
Я уже тут такого намутила и такими способами, что кошмар!!! Оно уже почти делает то что надо, ну конечно не до конца еще....
begin
for s:=1 to DShkola.Children.RecordCount do begin
DShkola.Teacher.RecNo:=1;
DShkola.Children.RecNo:=1;
k:=0;
for j:=1 to 6 do begin
k:=0;
for i:=3 to 6 do
k:=k+(DShkola.Children.Fields[i+2].AsInteger*DShkola.teacher.Fields[i].AsInteger);
//ShowMessage(inttostr(k));
if (k>=DShkola.Teacher.Fields[7].AsInteger) then begin
DShkola.Children.Edit;
DShkola.Children.Fields[9]:=DShkola.Teacher.Fields[0]; end else
DShkola.Teacher.Next;
end;
DShkola.Children.Next;
DShkola.Teacher.RecNo:=1;
end;
теперь оно у меня вот так выглядит