Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Разница столбцов DBGrid-?

Автор: 1147 14.11.2009 4:06

В DBGrid есть 2 столбца (А, В). В столбец А находятся некоторые значения. Нужно создать столбец С, который бы отображал разницу столбцов А и В. Если например в ячейку столбца В вводятся те же значения что есть в ячейке столбца А, то они как бы взаимно уничтожаются (условно, т.к. в самих ячейках и в базе никаких изменений не происходит) а столбец С отображает результат этого (он также доложен находиться в БД как и остальные), как показано на рисунке. Если в ячейки столбца В вводятся какие-то посторонние значения, столбец С их игнорирует.
Помогите реализовать столбец С?


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: volvo 14.11.2009 4:59

Ну, и в чем проблема? Как создаются calculated fields уже было здесь, как определить, какие числа есть в одной строке, какие - в другой - тоже есть. Собери из них одну процедуру, и добавь ее в OnCalcField

Автор: 1147 14.11.2009 23:03

проблема в том что значения calculated fields не заносятся в базу данных. а мне нужно чтобы они там были

Автор: volvo 14.11.2009 23:24

А что, тебе кто-то мешает иметь и calculated и обычное поле? Допустим, поле X - вычислимое, поле Xtbl - присутствует в таблице AdoTable2. Тогда просто на OnBeforePost делаешь:

procedure TForm1.ADOTable2BeforePost(DataSet: TDataSet);
begin
ADOTable2Xtbl.AsString := ADOTable2X.AsString;
end;
, и содержимое X копируется в базу. При этом Xtbl может быть невидимым, то есть отображаться будет только вычислимое поле, но перед записью в базу его содержимое будет копироваться в Xtbl, и соответственно тоже переноситься в базу.

Автор: 1147 15.11.2009 5:33

Значит в calculated field я должен написать чтото вроде этого да?

procedure TForm5.ADOTable1CalcFields(DataSet: TDataSet);
ADOTable1C.Value:=
ADOTable1WideStringField3.value-
ADOTable1WideStringField6.value;


Автор: volvo 15.11.2009 6:03

Нет... Тебе надо вычислять, какие значения есть в одном поле, а в другом - нету. Вычитания строк пока еще не придумали. Вот так (по аналогии с выделением красным отсутствующих элементов):

procedure TForm1.ADOTable2CalcFields(DataSet: TDataSet);

var
first, second: TStringList;
s: string;
i: integer;
begin
first := TStringList.Create();
second := TStringList.Create();

ExtractStrings([','], [], PChar(ADOTable2first.AsString), first); // первое поле
ExtractStrings([','], [], PChar(ADOTable2second.AsString), second); // второе поле

for i := first.Count - 1 downto 0 do // проход от конца к началу, так проще
begin
if second.IndexOf(first.Strings[i]) <> -1 then
begin
first.Delete(i);
end;
end;

s := '';
for i := 0 to first.Count - 1 do
begin
if i <> 0 then s := s + ', ';
s := s + first.Strings[i];
end;
second.Free;
first.Free;

ADOTable2XX.Value := s; // "разность" полей
end;
(XX - вычислимое поле типа String)

Автор: 1147 15.11.2009 6:44

В событии OnBeforePost данные из CalcField копируются в поле находящееся в БД. В случае ввода данных в DBGrid все прекрасно работает, но если данные вводятся через DBEdit, копирования не происходит, хотя там у меня указано:

if Form5.ADOTable1.modified then
form5.ADOTable1.Post;
Может нужно использовать какое-нибудь другое событие, или в OnKeyPress DBEdita внести изменения?
Проблема решена. Спасибо