Delphi 2010 + firebird 2.5 wartość null dla TDateTimePicker lub Tedit

0

Witam
Mam duży problem posiadam prostą bazę danych w firebird. Kilka pól ma format DATE i nie są polami obowiązkowymi. Jak w delphi stworzyć formularz dodawania oparty na TEdit oraz TDateTimePicker aby można była nie wpisywać w tych polach daty i dodać dane do bazy

np.

 procedure TForm1.BitBtn13Click(Sender: TObject);
begin
if not IBQuery1.Transaction.DefaultDatabase.Connected then exit;
 if IBQuery1.Active then IBQuery1.close;
 IBQuery1.SQL.Clear;
 IBQuery1.SQL.ADD('Insert INTO POS (RODZAJ,NIP,NAZWA,PODATEK,DATA_WPLYWU) VALUES (:rodzaj,:nip,:nazwa,:podatek,''' + datetostr(DateTimePicker1.Date)+ ''')');
 IBQuery1.ParamByName('rodzaj').AsString:=ComboBox7.Text;
 IBQuery1.ParamByName('nip').AsString:=Edit13.Text;
 IBQuery1.ParamByName('nazwa').AsString:=Edit14.Text;
 IBQuery1.ParamByName('podatek').AsString:=Edit15.Text;
 IBQuery1.ExecSQL;
 if IBTransaction1.InTransaction then IBTransaction1.Commit;
 IBTransaction1.StartTransaction;
end;

Chciałbym raz pole NIP oraz pole DATA_WPLYWU pozostawić w bazie z wartością null a innym razem coś w nich wpisać
592e797910.png
Jak ustawić TDateTimePicker na wartość null

0

Nie da się nullowej daty podać do wyświetlenia. Nie znam się na bazach danych opartych na silnikach. Ale według mnie musisz reagować na zmiany i kiedy nie chcesz zapisać daty do bazy to zapisać pusty ciąg znaków lub jakiś "znacznik" jak tekst <nic> i tym podobne. Na który będziesz reagował i odpowiednio zmieniał to co pokazuje kontrolka TDateTimePicker. Ewentualnie sprawdzał zapis z pola bazy poprzez TryStrToDate.

A o ile wiem to można tylko "sterować" formatem wyświetlania w taki sposób jak poniżej (pusty ciąg nie jest przyjmowany, więc należy dać na przykład niewidoczną wtedy dla oka użytkownika spację). Jednak nie wiem czy takie rozwiązanie Tobie pasuje. Wedle mnie innej metody dla tej kontrolki, opartej na systemowej i obsłudze jej poprzez te macro na WinAPI - chyba nie ma.

//...
uses
  CommCtrl;

procedure TForm1.FormCreate(Sender : TObject);
begin
  DateTime_SetFormat(DateTimePicker1.Handle, #32);
end;

procedure TForm1.DateTimePicker1Change(Sender : TObject);
begin
  DateTime_SetFormat(DateTimePicker1.Handle, 'yyyy.MM.dd');
end;
//...
0

ale format daty w firebird nie pozwoli wprowadzić ' ' spacji bądź pustego pola do pola DATE

0

No to ustal sobie jakąś wartość, która będzie oznaczać, że pola nie wypełniono; Niech to będzie np. 0 dla typu TDateTime; Podczas wyświetlania sprawdź jaka jest wartość i jeśli jest równa tej ustalonej, to po prostu nic nie wyświetlaj.

0
brylek101 napisał(a):

Witam
Mam duży problem posiadam prostą bazę danych w firebird. Kilka pól ma format DATE i nie są polami obowiązkowymi. Jak w delphi stworzyć formularz dodawania oparty na TEdit oraz TDateTimePicker aby można była nie wpisywać w tych polach daty i dodać dane do bazy

A dlaczego nie użyjesz kontrolek TDBEdit i TDBDateEdit?

np.

 procedure TForm1.BitBtn13Click(Sender: TObject);
begin
if not IBQuery1.Transaction.DefaultDatabase.Connected then exit;
 if IBQuery1.Active then IBQuery1.close;
 IBQuery1.SQL.Clear;
 IBQuery1.SQL.ADD('Insert INTO POS (RODZAJ,NIP,NAZWA,PODATEK,DATA_WPLYWU) VALUES (:rodzaj,:nip,:nazwa,:podatek,''' + datetostr(DateTimePicker1.Date)+ ''')');
 IBQuery1.ParamByName('rodzaj').AsString:=ComboBox7.Text;
 IBQuery1.ParamByName('nip').AsString:=Edit13.Text;
 IBQuery1.ParamByName('nazwa').AsString:=Edit14.Text;
 IBQuery1.ParamByName('podatek').AsString:=Edit15.Text;
 IBQuery1.ExecSQL;
 if IBTransaction1.InTransaction then IBTransaction1.Commit;
 IBTransaction1.StartTransaction;
end;

Dlaczego startujesz transakcję (na końcu), kiedy nie jest potrzebna?
Powinieneś startować tę transakcję przed aktualizacją i zatwierdzać ją na końcu, a nie na odwrót.

Chciałbym raz pole NIP oraz pole DATA_WPLYWU pozostawić w bazie z wartością null a innym razem coś w nich wpisać
592e797910.png
Jak ustawić TDateTimePicker na wartość null

I właśnie od tego są kontrolki db aware...

1 użytkowników online, w tym zalogowanych: 0, gości: 1