Форум: "Начинающим";
Текущий архив: 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