Форум - Ответы     (  К темам )
 ?  ledenezz: DateTime (18-05-2003 19:35:47)
Народ как же все-таки записать пустое поле в DateTime?
Вариант - 00.00.00 не записывается, т.к. считается, что даты такой нет.
Мне надо, чтобы в Grid-ах вместо такой даты было пустое поле, а сами записи мне редактировать запрещено, т.к. они только для чтения.
Что делать?
 _Владимир_ (18-05-2003 20:02:29)
Думаю, что никак. Дело в том что внутренне представление DateTime-
это double. У переменной типа double не бывает значения "пусто".
Это строка может быть пустой.
В таблице базы значение поля может иметь значаение NULL.
Для поля типа DateTime это значение соответствующее строковому
представлению "30.12.1899 12:00:00 am"
 Георгий (18-05-2003 20:50:44)
смутное подозрение, что на этапе проектирования БД была допущена ошибка:
<<надо, чтобы[...]вместо[...]даты было пустое поле, а сами записи[...]только для чтения>>
это лечится только перепланировкой БД или изменением условий постановки задачи
 ledenezz (19-05-2003 00:04:39)
Образование записей только для чтения объясняется использованием запроса из мн-ва таблиц.
Проблема действительно пока стоит, т.к. если поле с датой не было заполнено, то оно не должно отображаться (т.е. быть пустым). Сейчас я сделала проверку зачений некоторых полей на определенное значение, и если оно удовлетворяется, то эти значения рисуются белым цветом. Но веь это не решение проблемы!?
Георгий, а не могли бы Вы подсказать, какие типы полей мне можно использовать для перепланировки?
 Георгий (19-05-2003 01:12:50)
ledenezz
не очень понимаю "Образование записей только для чтения объясняется использованием запроса из мн-ва таблиц" не могли бы вы привести ER диаграмму или (из-за скудности возможностей этого форума, который не позволяет рисунки вставлять) привести:
запрос, в котором как я понял необходимы эти поля только для чтения
и все create table, таблицы которых используются в этом запросе

возможно удастся написать изяшный SQL запрос или изменить структуру некоторых таблиц, чтоб этой сложности с записями только для чтения не было

кстати какая СУБД?
 Владимир (19-05-2003 10:45:58) http://cbuilder.ru
Извините, я не понял, у Вас проблема с отображением информации из базы
на экране монитора в Gride или стоит вопрос о хранении информации в таблице
базы данных ?

>>Мне надо, чтобы в Grid-ах вместо такой даты было пустое поле

Если речь идет о Gride - о компоненте отображения информации на экране,
в нужном вам виде, в зависимости от значения в поле, вам нужно
создать объекты полей и для этого поля воспользоваться событием
onGetText для этого поля, что-то типа:

void __fastcall TForm1::Table1NameGetText(TField *Sender, AnsiString &Text,
bool DisplayText)
{
Text = .... // то что будет отражаться на экране в Gride !!!

// например в зависимости от значания поля
if(Table1Name->AsString == "Moscow") Text = "Great city Moscow - Russia";
else if(Table1Name->AsString == "Kiev") Text = "Great city Kiew - Ukraine";
else Text = "";
}

----------------
>>Народ как же все-таки записать пустое поле в DateTime?

Если речь идет о вставке пустого значения в саму таблицу базы данных,
(значения типа TDateTime), то об этом тоже уже было сказано.
Если у вас в базе создана таблица, и в ней поле типа TDateTime, то возможны 2
варианта - это поле допускает ввод значений NULL (по умолчанию), тогда
вы можете записать в это поле NULL
Table1->Edit();
Table1->FieldByName("myDate")->Clear(); // запишет NULL в поле myDate
Table1->Post();

либо это поле создано как NOT NULL, тогда ввод значения NULL в это поле
база не допустит, и тогда выход: можете вводить какое-либо значение
(ну например 01.01.9999), которое в своей программе будете обрабатывать
как пустое, либо значение даты 0 (а это 30.12.1899)


//---------------------------------

то Георгий:
Идет поиск подходящего форума, надеюсь к середине лета поставить новый,
с регистрацией(необязательной), с выделением текста жирным и/или цветом,
с вставкой картинок(графики) и файлов(rar zip)
Этот форум конечно имеет очень скудные возможности и нуждается
в замене на другой, что и будет сделано.
 ledenezz (20-05-2003 00:41:33)
Спасибо за подробные ответы!!
Буду разбираться и делать.
А Через Grid я как-нибудь могу достучаться до Field-ов? Чтобы событие OnGetText обрабатывалось не с помошью Query или Table, а Grid-ом?
 Владимир (20-05-2003 11:41:54) http://cbuilder.ru
Grid - это компонент, предназначен для визуального отображения информации
из компонентов-наборов данных Table, Query

Событие OnGetText в нем нет

Мне кажется, вы пытаетесь переложить работу на компонент, который для
этого не предназначен.
Сами данные "находятся" в компонентах Table, Query, которые и содержат
массу свойств и методов для их обработки, а Grid лишь связывается
с Table, Query и отображает информацию из них

Но - проверить, что у вас в ячейке Grid и изменить это как вам надо
вы можете, обычно это делатся в событии DrawDataCell или DrawColumnCell

Этот пример уже приводился:(c небольшим изменением)

//---------------------------------------------------------------------------
// в обработчике GridDrawColumnCell выводите в нужной ячейке через TextOut

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
if(Column->FieldName == "Name" && Column->Field->AsString == "ПЕТРОВ ВАСЯ"){
DBGrid1->Canvas->FillRect(Rect);
DBGrid1->Canvas->Font->Color = clRed;
DBGrid1->Canvas->Brush->Color = clInfoBk;
int x = Rect.Left + 2;
int y = Rect.Top + 2;
DBGrid1->Canvas->TextOut(x,y,"LEDENEZZ");
// вместо значения ПЕТРОВ ВАСЯ будет выведено LEDENEZZ
}

// else DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);

}
//---------------------------------------------------------------------------

или

//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid1DrawDataCell(TObject *Sender,
const TRect &Rect, TField *Field, TGridDrawState State)
{
if(Field->FieldName == "Name" && Field->AsString == "AVER"){
((TDBGrid*)Sender)->Canvas->FillRect(Rect);
((TDBGrid*)Sender)->Canvas->Font->Color = clRed;
((TDBGrid*)Sender)->Canvas->Brush->Color = clYellow;

int x = Rect.Left+2;
int y = Rect.Top+2;
((TDBGrid*)Sender)->Canvas->TextOut(x,y,"NEW VALUE");
}
}
//----------------------------------------------------------------------

Если захотите убрать выделение цветом шрифта или фона ячейки - уберите

Причем удобнее использовать для отображения информации из
Table-Query не "родной" компонент DBGrid,

а RxDBGrid из компонентов RXLib
(http://www.rxlib.ru/rx/rxlib.htm)

или TDBGridEh из библиотеки EhLib v 3.0
(http://www.farpost.com/personal/dmitryb/RUS/)

или wwDBGrid из компонентов InfoPower3000
(http://woll2woll.com - они платные, ищите на наших пиратских дисках)

они обладают большими возможностями вывода информации
в удобном пользователю виде, чем Grid, поставляемый с C++Builder
 ledenezz (20-05-2003 20:02:46)
Спасибо, Владимир!
Очень признательна.
Я понимаю, что по идее нужно работать с источником данных, а не с их транслятором, просто у меня только таким ненормальным способом и можно было работать.
Спасибо!!!


support@cbuilder.ru