Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Убрать нули из визуализации   Найти похожие ветки 

 
Александр_2012   (2014-03-24 16:04) [0]

Добрый день.
Ещё один вопрос. В таблице БД (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.


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

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


 
sniknik ©   (2014-03-24 17:44) [2]

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


 
clickmaker ©   (2014-03-24 17:47) [3]

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


 
Inovet ©   (2014-03-24 19:25) [4]

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

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


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

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

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


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

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

sniknik ©   (24.03.14 17:44) [2]

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

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


 
Александр_2012   (2014-03-25 10:48) [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=???

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


 
clickmaker ©   (2014-03-25 10:50) [8]

> не так надо?

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


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

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

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

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


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

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


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

Доброго дня.
Нули идут по умолчанию, поэтому и визуализируются. Когда создавали БД, то её просто содрали с древнего компьютера (СМ ЭВМ ОС РВ), где про 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. Как решить задачу мастера?


 
clickmaker ©   (2014-03-28 16:15) [12]

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2015.09.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.056 c
2-1394111347
Михаил
2014-03-06 17:09
2015.09.10
FireBird возврат результата запроса из ХП


15-1418746443
Erracado
2014-12-16 19:14
2015.09.10
Прерывание выполнения ADOQuery


15-1413815317
Юрий Зотов
2014-10-20 18:28
2015.09.10
Встроенный в Windows 7 программный RAID


15-1420234204
Юрий
2015-01-03 00:30
2015.09.10
С днем рождения ! 3 января 2015 суббота


15-1419531172
Rouse_
2014-12-25 21:12
2015.09.10
Задачка для разминки мозга