Topic: TTableGrid - отображение данных и типы полей

Обратил внимание, что формат отображения данных в таблице зависит от того, какую информацию содержит 1-я строка выборки. Пример с отображением количества

Тип данных - вещественное число
Вычисляемое поле Приход:

(ifnull((            
select amount from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where docType.isIncrement and (dd.id = docDetail.id)
),0 ))  

Вычисляемое поле Расход:

(ifnull((      
select amount from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where not docType.isIncrement and (dd.id = docDetail.id)
),0))     

Если первое число ноль, то вся колонка отображается, как целые числа
http://f6.s.qip.ru/SwgAVRzA.png

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

Меняем сортировку в детальной части и меняется формат отображения:
http://f4.s.qip.ru/SwgAVRzB.png

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

Изначально я хотел использовать вычисляемые поля без отображения нулей

(            
select amount from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where docType.isIncrement and (dd.id = docDetail.id)
)

но тогда не работает автоматическое вычисление итогов:
http://f1.s.qip.ru/SwgAVRzC.png

а числа с плавающей запятой отображаются, как строки, если первая ячейка в колонке пустая.

Вопросы:
1. Можно ли как-то явно определить желаемый формат отображения данных в колонке?
2. Можно ли подавить отображение нулевых значений в выбранной колонке?

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

попробуйте так

1.

(
CAST(
    ifnull((            
        select amount from docDetail as dd
        left join doc on doc.id = docDetail.id_doc
        left join docType on docType.id = doc.id_docType
        where docType.isIncrement and (dd.id = docDetail.id)
        ),0) AS REAL
    )
)  

2. Про нулевые значения не понял

Dmitry.

5 (edited by k245 2017-10-30 17:34:53)

Re: TTableGrid - отображение данных и типы полей

Про нулевые значения:  первоначальные настройки вычисляемых полей были такими:

(
select cast( amount as REAL) from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where docType.isIncrement and (dd.id = docDetail.id)
)  

а результат очень странный:

http://f5.s.qip.ru/SwgAVRzJ.png

Если первая запись содержала null, то данные начинали отображаться, как текст ( 100.45 ), а сумма не считалась.

Хотя так правильней, пришлось заменять пустые строки нулями, хотя это  перегружает экран.  Вопрос был в том, можно ли как-нибудь избавиться от нулей, но чтобы отображение и суммирование работало корректно?

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

Дмитрий, спасибо за вариант с CAST, сумма отображается верно!

Однако, хотелось бы иметь такой результат:

http://f3.s.qip.ru/SwgAVRzL.png

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

Однако, хотелось бы иметь такой результат:

что конкретно?

Dmitry.

Re: TTableGrid - отображение данных и типы полей

Вместо нулей - пустышки:
http://f4.s.qip.ru/SwgAVRzM.png

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

Нужны вместо нулей пустышки? Или пустышки вместо нулей? )

Dmitry.

Re: TTableGrid - отображение данных и типы полей

Видимо, это из разряда "хотелок" : "Отображать нулевые значения как пустую строку". Именно отображать, потому что, если "пустышки" будут в наборе данных, то не будет работать функция SUM().


У стандартного компонента TDBGrid  есть два замечательных события,

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);

обработчики на которые легко справляются с подобными задачами по изменению способа отображения ячеек таблицы. Планируется ли что-либо подобное для TTableGrid ?


P.S. Почитал про типы данных SQLite http://xbb.uz/db/Tipy-dannyh-v-SQLite-versii-3 , теперь многое становится понятным в поведении визуальных компонентов, в частности  - возможность в одной колонке отображать данные различных типов.

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

А вообще - печалька:  не получается нормально отобразить бухгалтерскую информацию. Для вычисляемых полей (выделены красным), даже если их кастовать в REAL,

( 
cast(
 (select sum(summ) from docDetail
  where docDetail.id_doc = doc.id) AS REAL)
)

   

не получается отобразить денежный формат:

http://f1.s.qip.ru/SwgAVRAe.png

внизу обычные поля с типом "ДЕНЬГИ"

Визуальное программирование: блог и телеграм-канал.

Re: TTableGrid - отображение данных и типы полей

Применить необходимое форматирование для колонки можно так

procedure Form1_TableGrid1_OnChange (Sender: string);
begin
   if Form1.TableGrid1.Columns[3] is TNxNumberColumn then
    begin
        TNxNumberColumn(Form1.TableGrid1.Columns[3]).FormatMask := '#,##0.00';
        TNxNumberColumn(Form1.TableGrid1.Columns[3]).Footer.FormatMask := '#,##0.00';
    end;
end;
Dmitry.

Re: TTableGrid - отображение данных и типы полей

Спасибо, Дмитрий!  Подправил форматирование,

TNxNumberColumn(frmMain.tgrDetail.Columns[3]).FormatMask := '#,##0.00; ; ';

и теперь всё выглядит великолепно, как я и хотел: ненулевые значения выводятся в денежном формате, а вместо нулевых - пустышки smile
http://f3.s.qip.ru/SwgAVRAn.png

Визуальное программирование: блог и телеграм-канал.