Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 3)

Автор: ukflrj
Дата сообщения: 17.02.2009 22:46
to jicoff

а такую конструкцию в рамках одного бэнда возможно?
+----+------------------+
| | |
| |------------------+
| | |
| | |
+----+------------------+

Автор: vladman
Дата сообщения: 18.02.2009 00:41
brookson

Цитата:
with SummaryItems.Add as TcxGridDBTableSummaryItem do begin
Column := vGrid1.Columns[2];
Kind := skSum;
Format := ',0.00 $;-,0.00 $';
Position:=spFooter;


Position:=spGroup - должно помочь
Автор: brookson
Дата сообщения: 18.02.2009 09:43
vladman
Пробовал. Не помогло. Собственно Footer группы я вижу, но пустой
Автор: f3ka
Дата сообщения: 18.02.2009 10:05
brookson
а стоит у грида OptionView.GroupFooters = gfAlwaysvisible?
Автор: jicoff
Дата сообщения: 18.02.2009 12:39
ukflrj


Нет, структура такая:

-----------------------------------------
| 1 | 2 | 3 | ...
-----------------------------------------
4
-----------------------------------------
5
-----------------------------------------
Автор: vladman
Дата сообщения: 18.02.2009 13:58
brookson
ну тогда давайте весь модуль/часть модуля где создается полностью грид, вью, и т.д., посмотрим.
Автор: brookson
Дата сообщения: 18.02.2009 15:32

Код:
procedure TF_REPORTS.LabZv1FClick(Sender: TObject);
var
fld: tfield;
AColumn: TcxGridDBcolumn;
begin
cxGrid1.Visible:=false;
tvGrid1.ClearItems;
if QueryRep.Active then QueryRep.Close;
QueryREP.sql.text:='select * from ZV1F';
QueryRep.Prepare;
QueryRep.Open;
// создаём dxMemdata с нужными полями
dxMem3i.close;
dxmem3i:=TdxMemData.Create(nil);
dxmem3i.active:=false;
dxmem3i.FieldDefs.Clear;

fld := TStringField.Create(nil);
fld.FieldName := 'mastername';
fld.Size := 250;
fld.DataSet:=dxmem3i;

fld := TdateField.Create(nil);
fld.FieldName := 'vdate';
fld.DataSet:=dxmem3i;
....
fld:=TBCDField.Create(nil);
fld.FieldName:='sumtotal';
fld.DataSet:=dxmem3i;
ds3i.DataSet:=dxMem3i;
dxmem3i.Open;
dxmem3i.DisableControls;
while not QueryRep.Eof do begin
dxMem3i.Append;
// добавляем записи в dxMemDataset dxMem3i.FieldByName('mastername').AsString:=Queryrep.FieldByName('mastername').AsString;
dxMem3i.FieldByName('vdate').AsVariant:=Queryrep.FieldByName('vdate').AsVariant;
...
dxMem3i.FieldByName('sumtotal').AsFloat:=QueryREP.FieldByName('sumtotal').AsFloat;
dxMem3i.Post;
Queryrep.Next;
end;
dxMem3i.EnableControls;
tvgrid1.BeginUpdate;
tvgrid1.DataController.DataSource:=DS3i;
tvGrid1.OptionsView.GroupFooters:=gfAlwaysVisible;
// создаём вью в гриде
acolumn:=tvgrid1.CreateColumn;
acolumn.Width:=70;
acolumn.DataBinding.FieldName:='vdate';
acolumn.DataBinding.valuetype:='Date';
acolumn.Caption:='Дата';
acolumn:=tvgrid1.CreateColumn;
acolumn.Width:=150;
acolumn.DataBinding.FieldName:='mastername';
acolumn.DataBinding.ValueType:='String';
AColumn.GroupIndex:=0;
acolumn.Visible:=false;
acolumn.Caption:='Мастер';
...
acolumn:=tvgrid1.CreateColumn;
acolumn.Width:=100;
acolumn.DataBinding.FieldName:='sumtotal';
acolumn.DataBinding.valuetype:='Currency';
acolumn.Caption:='ВСЕГО';

with tvGrid1.DataController.Summary do begin
SummaryGroups.Clear;
// И ВОТ ЭТОГО ИТОГА В ГРУППЕ НЕТ
with SummaryGroups.add do begin
TcxGridTableSummaryGroupItemLink(Links.Add).Column := tvgrid1.Columns[8];
with SummaryItems.Add as TcxGridDBTableSummaryItem do begin
Column := tvgrid1.Columns[8];
FieldName:='sumtotal';
Kind := skSum;
Format := ',0.00 $;-,0.00 $';
Position:=spFooter;
end;
end;
// А ЭТИ ОБЩИЕ ВНИЗУ - ЕСТЬ
with FooterSummaryItems.Add as TcxGridDBTableSummaryItem do
begin
Column := tvGrid1.Columns[2];
Kind := skSum;
Format := ',0.00 $;-,0.00 $';
end;
...
with FooterSummaryItems.Add as TcxGridDBTableSummaryItem do
begin
Column := tvgrid1.Columns[8];
Kind := skSum;
Format := ',0.00 $;-,0.00 $';
end;
end;
tvgrid1.EndUpdate;
tvGrid1.ViewData.Expand(true);
cxGrid1.Visible:=true;

Автор: sldaac
Дата сообщения: 18.02.2009 16:04

Цитата:
ukflrj


Нет, структура такая:


кинь скрин с вида вьюшки или кусок кода,
может ты не тот тып вьюшки выбрал

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


Добавлено:
TForm1 = class(TForm)
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
cxGrid1DBBandedTableView1: TcxGridDBBandedTableView;
у тебя наверное простой, без DBBanded или без Banded

Автор: vladman
Дата сообщения: 18.02.2009 19:06
brookson

Цитата:

......
acolumn:=tvgrid1.CreateColumn;
acolumn.Width:=100;
acolumn.DataBinding.FieldName:='sumtotal';
acolumn.DataBinding.valuetype:='Currency';

AColumn.Summary.GroupFooterKind := skSum;

acolumn.Caption:='ВСЕГО'
........

Автор: brookson
Дата сообщения: 18.02.2009 19:49
vladman
Спасибо! Это оно! Огромное еще раз спасибо
Честно говоря, я в лёгком шоке. Весь тот код в конце с созданием итогов, который был в примере, не нужен.
Не удержусь от нескромного вопроса - где это можно было прочесть? В документации, что шла с исходниками не нашёл нигде.
Автор: afiget
Дата сообщения: 18.02.2009 21:56

Цитата:
В документации, что шла с исходниками не нашёл нигде.

А в раздел Task Based Help смотрел?
Автор: X11
Дата сообщения: 18.02.2009 23:08

Цитата:
// создаём dxMemdata с нужными полями
dxMem3i.close;
dxmem3i:=TdxMemData.Create(nil);

странно, ты вначале обращаешься к несуществующему dxMem3i чтобы закрыть его, а потом только создаешь.
Автор: vladman
Дата сообщения: 19.02.2009 00:01
brookson

Цитата:
Весь тот код в конце с созданием итогов, который был в примере, не нужен.

Ну, честно говоря, приведенные код не идеален (без обид, раз вы это уж упомянули ). Есть возможность то же реализовать немного по-другому. Но это к вопросу ведь не относилось . У каждого ведь свой стиль, понимание и подход ...

Цитата:
где это можно было прочесть?

как-то разбирался с логикой построения summary во View, вот и вспомнил, что помимо свойств в самих View существуют еще и свойства в Column отвечающие за summary.

Цитата:
А в раздел Task Based Help смотрел?

afiget - прав! Creating Summaries ->Creating Footer and Group Summaries и в самом конце:
"As for the group summary, you can set the position where a summary will be displayed by using the Position property or specify the corresponding column's GroupKind or GroupFooterKind properties. A group summary can be displayed either in a group row or in a group footer panel"
Автор: brookson
Дата сообщения: 19.02.2009 13:20
Спасибо за критику и за помощь ))
vladman
Касаемо последней цитаты - было неважно, где отображать Group Summary - внизу или вверху. Они просто нигде не отображались.
Раздел я этот тоже видел.... Да, на тот кусочек не обратил внимание, наверно потому, что в другом месте хелпа нашёл другой пример. Но кто мне объяснит, почему

Код:
with FooterSummaryItems.Add as TcxGridDBTableSummaryItem do
begin
Column := tvGrid1.Columns[2];
Kind := skSum;
Format := ',0.00 $;-,0.00 $';
end;
Автор: ukflrj
Дата сообщения: 19.02.2009 13:44
to sldaac

хотелось бы такие заголовки сделать



Возможно ли в одном бэнде?

спасибо

Автор: f3ka
Дата сообщения: 19.02.2009 14:31
ukflrj
в одном не получиться
Автор: sldaac
Дата сообщения: 19.02.2009 14:34

Цитата:
хотелось бы такие заголовки сделать


Ге-ге, дебет-кредит, можно,
тебе надо использовать в гриде TcxGridDBBandedTableView а ты наверное
TcxGridDBTableView
Автор: f3ka
Дата сообщения: 19.02.2009 14:42
sldaac
вопрос был про то

Цитата:

хотелось бы такие заголовки сделать
Возможно ли в одном бэнде?

про TcxGridBandedTableView видать уже узнал...
ukflrj
у меня получилось это сделать только при помощи 3-х бэндов и скрытия самих заголовков бэндов...
Автор: sldaac
Дата сообщения: 19.02.2009 14:46
to ukflrj

сорри, но при помощи одного никак (ну не порезать-же его). Часто люди незнают что есть TcxGridBandedTableView, кинул на форму cxGrid, он автоматом создает простую вьюшку.
Автор: Trasnev
Дата сообщения: 19.02.2009 15:17
afiget
спасибо. помогло.
Но теперь возникла другая проблема

Подскажите, пожалуйста, как заставить работать такое:
в Grid есть LookupComboBox поле(показывается название, редактируется id). При выборе значения в этом поле нужно провести дополнительную проверку. если id=определенному значению(или назнание='дата'), то нужно удалить значения из другой колонки( 'col1') этой записи.
Для этого на onValidate вешается обработчик, в котором
if DisplayValue='дата' then
begin
OracleDataSet1.Edit;
OracleDataSet1.FieldValues['col1']:='AAAA';
OracleDataSet1.Post;
end;
В таков виде это не работает - изменяется значение в col1, но при этом не изменяется id(для редактирования которого и предназначено LookupComboBox поле).
можно было попробовать обойти эту проблему и тем же OracleDataSet1.FieldValues['id'] присвоить значение. Вопрос только в том как это самое значение получить? DisplayValue содержит название, а не необходимый id. И cxGridDBTableView1.DataController.Values[dc.FocusedRecordIndex,cxGridDBTableView1ID.Index] возвращает null.
Или есть другой способ редактирования данных, при котором бы сохранялось и значения из лукап поля?

Автор: ukflrj
Дата сообщения: 19.02.2009 15:34
to jicoff sldaac f3ka

Все ясно.

спасибо за участие.
Автор: f3ka
Дата сообщения: 19.02.2009 15:37
Trasnev
ну вообще-то думаю это поможет....
if DisplayValue='дата' then
begin
//OracleDataSet1.Edit; запись и так в режиме редактирования...
OracleDataSet1.FieldValues['col1']:='AAAA';
//OracleDataSet1.Post; фиксировать изменения надо только после OnValidate
end;
Автор: Trasnev
Дата сообщения: 19.02.2009 16:00
f3ka
спасибо. это именно оно.
Но возник следующий вопрос. а если необходимо редактирование в нескольких записях. (ввели значение в ячейку, нужно подогнать остальные значения в колонке, чтобы их сумма давала 100). если пробегать по всем записям при помощи Next, то когда нужно открывать на редактирование и когда фиксировать изменения?
Автор: afiget
Дата сообщения: 19.02.2009 16:27
Trasnev
Я бы использовал событие OnChange поля (к которому прикручен lookup) в редактируемом DataSet.
Автор: vladman
Дата сообщения: 19.02.2009 18:12
brookson

Цитата:
Но кто мне объяснит, почему
Код:
...
работает, а
Код:
...
нет.


Потомучто для колонки tvgrid1.Columns[8] вы строите и общее (для всего View) summary в Footer и summsry в group. Вот как раз в этом случае и нужно явно указывать AColumn.Summary.GroupFooterKind либо AColumn.Summary.GroupKind в зависимости от того где вы хотите отображать summary для сгруппированного столбца.


Цитата:
было неважно, где отображать Group Summary - внизу или вверху.

не совсем понятно что имелось ввиду "внизу или вверху". Group Summary может отображаться либо in a group row or in a group footer panel.


Цитата:
Если нетрудно, как бы Вы поступили?

приблизительно так и поступаю, более подробно постараюсь показать позже..

а по-поводу кода - X11 уже написал что вызывает некоторую неидеальность
Но, в любом случае, как по мне, идеального кода не существует .

Добавлено:
Trasnev

Цитата:
если пробегать по всем записям при помощи Next,

можно пробегать не по датасету, а по DataController методом ForEachRow.

Более подробно - TcxCustomDataController.ForEachRow -> Example: Changing selected records in bound mode
Автор: sldaac
Дата сообщения: 20.02.2009 08:55

Цитата:
Более подробно - TcxCustomDataController.ForEachRow -> Example: Changing selected records in bound mode

все-бы неплохо, но в хелпе что-то не нашел. А как проитись по строкам и изменить значение в какой-то колонке, что-бы при этом и произошли изминения в DataSet (при установленом фильтре на вьюшке). Обратное, и по строкам наити запись и изменить ее значение в DataSet тоже реализуемо. Вопрос еше проще, как програмно в колонке поставь Чек (CheckBox) на все видимые строки и при этом изменились данные в DataSet. Знаю что где-то рядом, но ХЗ
Спсб. всем.
Автор: X11
Дата сообщения: 20.02.2009 09:55
sldaac, вот я из справки взял:


Код:
procedure TfmNewArrival.RecalcSelected(ARowIndex: Integer; ARowInfo: TcxRowInfo);
Var
id:integer;
begin
with dbgArrivalDet.DataController do begin
//Test whether a row is a data record
if ARowInfo.Level = Groups.GroupingItemCount then
//unbound or provider mode
with dm do begin
id := Values[ARowInfo.RecordIndex, dbgArrivalDetID.Index];
if tArrivalDet.Locate('ID',id,[]) then begin
tArrivalDet.Edit;

if tArrivalDetIS_FIXED_NACENKA.Value = true then begin
tArrivalDetPRICE_RETAIL.AsVariant := tArrivalDetPRICE_W_VAT.AsVariant * tArrivalDetVAL_FIXED_NACENKA.Value;
end else begin
tArrivalDetPRICE_RETAIL.AsVariant := tArrivalDetPRICE_W_VAT.AsVariant * ceCoeff.Value;
end;


tArrivalDet.post;
end;//if tArrivalDet.Locate('ID',id,[]) then begin
end;//with dm do begin
end;//with dbgArrivalDet.DataController do begin
end;
Автор: sldaac
Дата сообщения: 20.02.2009 10:12
X11

это я видел, это не то что мне надо
есть вьюшка в ней колонка ChecxBo, мышкой можно на записи поставить-снять чек (почекать). При этом изменятся данные для этого поля в DataSet,
Задача, на форме есть кнорка, при клике на ней, должны все записи прочекаться или сняться чек. при этом должны измениться и данные в DataSet. Повторюсь, вообще не затрагивая DataSet, как будто на чекали по записям мышкой.
Выделеные записи это одно,я говорю про видимые, установлен фильтр на вьюшке

А в этом примере используется tArrivalDet.Locate('ID',id,[]) поиск записи.


Добавлено:
to X11 вот самый простой вариант, но опять-же с поиском в DataSet


for yyy := 0 to (GV_EML.ViewData.RecordCount-1) do
begin
ARow :=GV_EML.ViewData.Rows[yyy];
kkk:= ARow.Values[GV_EMLID.Index];
dm:= ARow.Values[GV_DM.Index];
if DS_QEml.DataSet.Locate('id; dm',VarArrayOf([kkk,dm]), [loCaseInsensitive,loPartialKey]) = true then
begin
DS_QEml.DataSet.Edit;
if DS_QEml.DataSet.FieldByName('chbx').AsInteger=0 then
DS_QEml.DataSet.FieldByName('chbx').AsInteger:=1 else
DS_QEml.DataSet.FieldByName('chbx').AsInteger:=0;
end;
end;
Автор: X11
Дата сообщения: 20.02.2009 11:22
Не забывай про DisableControls или BeginUpdate


Цитата:
Повторюсь, вообще не затрагивая DataSet,

т.е. ты чекаешь чекбоксы, а данные в датасете не должны меняться?
Есть свойство: DataController.options, там есть dcoImmediatePost. У колонки также есть такое свойство. Хотя странное у тебя желание. Ведь грид, связан с набором данных. И направлен заведомо на то, что если в гриде что-то меняется, то и в наборе данных тоже.
Автор: sldaac
Дата сообщения: 20.02.2009 11:50

Цитата:
Не забывай про DisableControls или BeginUpdate

это есть я не привел весь код

Цитата:
т.е. ты чекаешь чекбоксы, а данные в датасете не должны меняться?

да должны, изменились данные в гриде, и автоматом в датасет, а не делать поик по ID, и в датасет менять значение.



Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.