Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Подскажите, какая концепция в cxGid убирания нулевых значений? На их форуме рекомендуют в событии колонки onGetDisplayText менять 0 на пустую строку. Ну для простых колонок это работает, а если у меня колонки с форматированием или даже с денежной единицей? Менять '0.00р.' на пустую строку - не катит, так как формат могут изменить на 0.0 или 0,000 - не важно. Должна ж быть какая-то универсальная приблуда для этого? У меня например колонка со скидками имеет форма 0,00%, денежная - 0,00р., но у многих в винде денежная единица задается символом ₽.
В фастрепорте есть специальная галка HideZeros, а тут что-то не найду.
Кто виноват и что делать ? )

Сообщение было отредактировано: 25 июл 20, 21:32
25 июл 20, 21:33    [22173657]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
DimaBr
Member

Откуда:
Сообщений: 11800
в запросе nullif()
25 июл 20, 21:45    [22173661]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
DimaBr,

он null все равно как 0 будет интерпретировать со всеми вытекающими. Это надо именно в гриде делать
25 июл 20, 22:21    [22173669]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
DimaBr
Member

Откуда:
Сообщений: 11800
null в гиде это не НОЛЬ
25 июл 20, 22:44    [22173673]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
DimaBr, все равно - это костыль. ради того, что грид что-то НЕ показывал, надо дополнительно пилить запросы и вместо просто го select * from emplyes лепить монстра?
25 июл 20, 23:10    [22173676]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 307
Я бы сделал так. В обработчике OnDrawDataCell извлекал бы значение, а дальше его обрабатывал и рисовал бы ячейки сам.
Что-то типа:
Value := tlData.DataController.GetNodeValue(AViewInfo.Node, tlValue.ItemIndex);
25 июл 20, 23:29    [22173680]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Virtual Student,
рисовать ячейки самому - это не кроссплатформенно и не идеологически. в 21-м веке рисовать GDI - моветон
25 июл 20, 23:43    [22173685]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1035
GrigoriyFomin
DimaBr, все равно - это костыль. ради того, что грид что-то НЕ показывал, надо дополнительно пилить запросы и вместо просто го select * from emplyes лепить монстра?
Надо просто не лениться и один раз освоить SQL до приемлемого уровня, чтобы запросы сложнее SELECT * FROM MyTable не казались "монстрами" (и про * в запросе забыть).
В событиях грида сравнивать надо не текст, а значение.
26 июл 20, 00:16    [22173694]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Gluck99,

ну меня joinами и вложенными запросами не испугать, просто зачем для того, чтобы клиент не показывал нулевые значения, надо напрягать сервер? ну не по-христиански это, неправильно.
26 июл 20, 00:21    [22173697]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Gluck99

В событиях грида сравнивать надо не текст, а значение.

И как это сделать нативно?
26 июл 20, 00:24    [22173698]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
DimaBr
Member

Откуда:
Сообщений: 11800
В Гриде нет HideZeros, можете даже не искать.
26 июл 20, 00:44    [22173701]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
DimaBr
Member

Откуда:
Сообщений: 11800
просто зачем для того, чтобы клиент не показывал нулевые значения, надо напрягать сервер

Вы думаете, что сервер сильно напряжётся, прогнав конечный результат через nullif ?
26 июл 20, 00:48    [22173702]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
DimaBr,

я думаю, что не серверное это дело - на клиенте нули в пустоту превращать. сервера дело - вернуть результат, нулевый или нулевой и клиенту нужно это отобразить. а то потом будем форматировать дату на сервере по национальным настройкам клиента. вообщем, красивого решения в девках нет, как я понял?
26 июл 20, 01:00    [22173705]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
DimaBr
Member

Откуда:
Сообщений: 11800
Красивое решение, это показывать те значения, которые есть.
26 июл 20, 01:09    [22173706]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
DimaBr
Member

Откуда:
Сообщений: 11800
вот вам ответ тех поддержки
26 июл 20, 01:11    [22173707]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2354
DimaBr
Красивое решение, это показывать те значения, которые есть.
+1
Для тех кто путает юзверя, визуально приравнивая 0 к null - в аду отдельный котел
26 июл 20, 01:38    [22173708]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
DimaBr
вот вам ответ тех поддержки

спасибо, конечно, но об этом я в стартовом топике писал
26 июл 20, 05:05    [22173715]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1035
GrigoriyFomin
спасибо, конечно, но об этом я в стартовом топике писал
Где у вас задаётся формат поля?
26 июл 20, 13:13    [22173783]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Polesov
Member

Откуда:
Сообщений: 750
Привет.

GrigoriyFomin
Подскажите, какая концепция в cxGid убирания нулевых значений?

Достаточно в запросе вернуть null.
Только что проверил для TcxCalcEditProperties (формат - ',0.00 "кв.м."')
Для null значений в ячейке пустая строка.

P.S. Firebird + FibPlus
26 июл 20, 13:26    [22173785]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Gluck99
Где у вас задаётся формат поля?

В свойствах колонки, которая CalcEdit
26 июл 20, 13:34    [22173790]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1035
GrigoriyFomin, вы как игрок в "Поле Чудес", который угадал все буквы, но не смог назвать слово. У вас есть всё для решения задачи.

Во-первых, NULL преобразуется в пустое поле при любом значении DisplayFormat в гриде (см. скриншот). Не знаю, какой у вас сервер, на MySQL именно так. Polesov подсказывает, что на Firebird то же самое. То есть никаких проблем написать пару лишних преобразований в запросе нет. Это намного удобнее, чем возиться на клиенте.

Во-вторых, показывать пользователю пустое поле и в случае 0 (нуля), и NULL - дурной тон. Это плохо и с т.з. отладки. Потом будете гадать, почему периодически вываливаются кривые данные или ошибки преобразования типов. Хорошее решение - не скрывать нули, а делать их бледно-серым цветом, чтобы они только чуть-чуть подсвечивались. Так пользователь не будет цепляться за них глазами, но в случае необходимости проверки, всегда видно, какое значение на самом деле содержит поле.

В-третьих, если вы всё-таки настаиваете на своём странном решении, то ответ я вам уже дал выше: "В событиях грида сравнивать надо не текст, а значение".

Вот пример решения. Properties = CalcEdit (как у вас), DisplayFormat = '### ##0.000 mm'.
{ onGetDisplayText вашего столбца в гриде }
...
  var
     FieldValue: Variant;   { значение }
     ColumnIndex: Integer;  { индекс колонки }
begin
       ColumnIndex := MyColumn.Index;                        { Определяем индекс столбца }
       FieldValue := ARecord.Values[ColumnIndex];            { Определяем значение поля }
       if FieldValue = 0 then AText := '';                   { Если значение = 0, то отображаем пустую строку }     
       if VarIsNull(FieldValue) then AText := 'здесь NULL';  { Если значение is NULL, отображаем соотв. текст }    
end;


К сообщению приложен файл. Размер - 4Kb
26 июл 20, 14:40    [22173802]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Dmitri Krizhanovski
Member

Откуда:
Сообщений: 502
GrigoriyFomin,

Gluck99 немного опередил. Но идея таже.

procedure TForm1.FormCreate(Sender: TObject);
var
  Index: Integer;
begin
  for Index := 0 to cxGrid1DBTableView1.ColumnCount - 1 do
    if not Assigned(cxGrid1DBTableView1.Columns[Index].OnGetDisplayText) then
      cxGrid1DBTableView1.Columns[Index].OnGetDisplayText := HideZero;
end;

procedure TForm1.HideZero(Sender: TcxCustomGridTableItem;
  ARecord: TcxCustomGridRecord; var AText: string);
var
  Val: Variant;
begin
  Val := ARecord.Values[Sender.Index];
  if VarType(Val) in [ varSmallint, varInteger, varSingle, varDouble,
                       varCurrency, varShortInt, varByte, varWord,
                       varLongWord, varInt64 ]
  then
    if Val = 0 then
      AText := '';
end;
26 июл 20, 14:49    [22173806]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Gluck99
GrigoriyFomin, вы как игрок в "Поле Чудес", который угадал все буквы, но не смог назвать слово. У вас есть всё для решения задачи.

Спасибо за развернутый ответ. Идея с отрисовкой серым - очень даже интересная, и за код спасибо, буду его использовать. А в оправдание показа пустоты вместо 0 - это например скидка на товар - ну напрягает зрение колонка из 0.00% - она не несет смысла. Внимание должно привлекать именно ненулевАя скидка. или цена за товар, который служебный и дается бесплатно - их немало - упаковки, стаканчики, мешалки и т.д. В моей задаче нул и 0 - это как раз тождественные понятия. кстати, функция
.FielByName('SomeFloatField').asFloat 

как раз верно (для моих задач) истолковывает null как 0, не вываливаясь в ошибку преобразования типов.
26 июл 20, 14:52    [22173807]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
GrigoriyFomin
Member

Откуда:
Сообщений: 104
Dmitri Krizhanovski
GrigoriyFomin,

Gluck99 немного опередил. Но идея таже.


Тоже спасибо за решение. Идея задавать обработчик при создании формы - респект! Кстати, тут вот говорят про то, что некошерно 0 истолковывать визуально как пустоту, но однако в фастрепорте - это есть и никто анафеме авторов FR не предает.
26 июл 20, 14:57    [22173810]     Ответить | Цитировать Сообщить модератору
 Re: DevExpress cxGrid - убрать нулевые значения  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1035
GrigoriyFomin
.FielByName('SomeFloatField').asFloat
как раз верно (для моих задач) истолковывает null как 0, не вываливаясь в ошибку преобразования типов.
Естественно, просто зависит от того, как вы обрабатываете значения в датасете. Если ваш клиент различает NULL и 0, NULL и пустую строку, то вам нужен тип Variant для этого. Т.е.
.FielByName('SomeFloatField').Value
и вот тут возможны нюансы с преобразованиями типов.
26 июл 20, 15:08    [22173812]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить