Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
Александр_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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.08 c
15-1413405004
Юрий
2014-10-16 00:30
2015.09.10
С днем рождения ! 16 октября 2014 четверг


15-1419975002
Юрий
2014-12-31 00:30
2015.09.10
С днем рождения ! 31 декабря 2014 среда


1-1330436331
Chrom
2012-02-28 17:38
2015.09.10
Отработка оператора Case


2-1394454003
FMX
2014-03-10 16:20
2015.09.10
SQLite + FireDAC


15-1412408657
Pavia
2014-10-04 11:44
2015.09.10
ошибка в XE5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский