Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Убрать нули из визуализации


Александр_2012 ©   (2014-03-24 16:04:00) 

Добрый день.
Ещё один вопрос. В таблице БД (Oracle) много полей типа integer. В компонентах dbedit они выводятся нулями, если значение не внесено, что сильно мешает операторам. Хотелось бы убрать незначащие нули из визуализации. Как я понимаю для этого можно использовать свойство DisplayFormat со спецификатором формата '#'. Но для этого загрузить в компонент OraTable все поля таблицы, что не хотелось бы делать. Фактически у меня используется минимум процедур, т.е. процедуры описаны только для одного компонента DBEdit, остальные ссылаются на данную процедуру, например для:

procedure TMainFormKart.DBEdit1Change(Sender: TObject);
begin
if DM.DataQ.State<>dsInactive then
 begin
 if DM.DataQ.FieldByName((Sender as TDBEdit).Field.FieldName).asString<>(Sender as TDBEdit).Text then
   begin
   flgupd:=True;
   flgupdgl:=True;
   bufpole:=(Sender as TDBEdit).Field.FieldName;
   buftext:=(Sender as TDBEdit).Text;
   buftype:=(Sender as TDBEdit).Field.DataType;
   end;
 end;
end;

Как я предполагаю, надо использовать событие AfterScroll компонента OraTable, чтобы обновлялась информация при пролистывании значений таблицы БД или OnChange компонента DBEdit. Но вот вопрос не пойму как докопаться до свойства поля DisplayFormat.
Что-то по принципу (Sender as TDBEdit).Field.... Подскажите как получить доступ к этому свойству не загружая все поля в компонент OraTable.


Александр_2012   (2014-03-31 09:43:00) [1]

clickmaker ©   (28.03.14 16:15) [12]
if (DM.Data.Fields[i] is TNumericField) then TNumericField(DM.Data.Fields[i]).DisplayFormat :=

Спасибо. Вставил в onOpen. Всё работает отлично.


clickmaker   (2014-03-28 16:15:00) [2]

if (DM.Data.Fields[i] is TNumericField) then TNumericField(DM.Data.Fields[i]).DisplayFormat :=


Александр_2012   (2014-03-28 16:09:00) [3]

Доброго дня.
Нули идут по умолчанию, поэтому и визуализируются. Когда создавали БД, то её просто содрали с древнего компьютера (СМ ЭВМ ОС РВ), где про Oracle речь вообще не шла. Нули мешают тем, что при большом количестве окошек DBEdit в глазах начинает рябить. Поэтому (учитывая, что все поля заполнены крайне редко) и хочу их спрятать. Если загрузить в OraTable все поля БД, то установив каждому свойство DisplayFormat удаётся нули спрятать. Но мне очень не нравиться такой способ написания программы - много бессмысленно однообразного кода. Хотел сделать всё одной процедурой, но не хватает знаний. Уверен, что можно докопаться до свойства DisplayFormat и не загружая все поля, но как это сделать? Когда поля загружены, то всё просто:

OraTableNumber.DisplayFormat:='#'; //для поля number

а вот если не загружать, то как докопаться?

Пробовал так:
For i:=0 to DM.DataQ.FieldCount-1 do
if DM.Data.Fields[i].AsInteger=0 then
  DM.Data.Fields[i].
но там нет свойства DisplayFormat.

и так тоже не получается:

for i:=0 to MainForm.ComponentCount-1 do
 begin
 Temp:=MainForm.Components[i];
 if (Temp is TDBEdit) and ((Temp as TDBEdit).Field.DataType=ftinteger) then
   (Temp as TDBEdit).Field.

и тут нет свойства DisplayFormat. Как решить задачу мастера?


sniknik   (2014-03-25 12:00:00) [4]

> В полях по умолчанию реальный ноль, а не null. В этом и проблема.
как он туда попадает, если не нужен? если найдешь, то возможно это будет решением проблемы...
прятать нули "не айс", ноль нормальное значение, и вполне может потребоваться внести/показать именно ноль в поле.


австрийкий художник   (2014-03-25 11:42:00) [5]

В полях по умолчанию реальный ноль, а не null. В этом и проблема.

Ну и зачем он там если нули не нравятся?
А если уж позарез нужны нули то

decode(number_field,0,null,number_field) as number_field


clickmaker   (2014-03-25 10:50:00) [6]

> не так надо?

не так
OnGetText - это событие. Достаточно одного обработчика на все нужные поля


Александр_2012   (2014-03-25 10:48:00) [7]

Что-то запутался...
Пытаюсь добавить в AfterScroll компонента OraTable:

For i:=0 to DM.DataQ.FieldCount-1 do
 if DM.Data.Fields[i].AsInteger=0 then
   DM.Data.Fields[i].GetText=???

Что сюда написать? Или вообще не так надо?


Александр_2012   (2014-03-25 09:38:00) [8]

В полях по умолчанию реальный ноль, а не null. В этом и проблема.

sniknik ©   (24.03.14 17:44) [2]

>не, если поле = null то в db компонентах оно и так пустое.
а у него похоже где-то вариант к конкретно integer-у приводится, поэтому и нули... т.е. проверку надо на 0 делать -
if field.AsInteger = 0 then Result := '';

Спасибо. Попробую.


это все...   (2014-03-24 19:37:00) [9]

Как я предполагаю, надо использовать событие AfterScroll компонента OraTable,

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


Inovet   (2014-03-24 19:25:00) [10]

> [0] Александр_2012   (24.03.14 16:04)
> DM.DataQ.FieldByName((Sender as TDBEdit).Field.FieldName)

Это что за окольные пути. Когда есть прямые
(Sender as TDBEdit).Field


clickmaker   (2014-03-24 17:47:00) [11]

вообще, мне это тоже показалось странным.
Может там либо поле not null default 0, либо в запросе что-то типа isnull(field,0)


sniknik   (2014-03-24 17:44:00) [12]

не, если поле = null то в db компонентах оно и так пустое.
а у него похоже где-то вариант к конкретно integer-у приводится, поэтому и нули... т.е. проверку надо на 0 делать -
if field.AsInteger = 0 then Result := '';


clickmaker   (2014-03-24 17:13:00) [13]

OnGetText
if field.IsNull then Result := '';


Наверх

Титульная страница Поиск, карта сайта Написать письмо