Форум — Ответы ( К темам )
? | 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) | |
Извините, я не понял, у Вас проблема с отображением информации из базы на экране монитора в 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) | |
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) | |
Спасибо, Владимир! Очень признательна. Я понимаю, что по идее нужно работать с источником данных, а не с их транслятором, просто у меня только таким ненормальным способом и можно было работать. Спасибо!!! |