Is er ergens een manier om ervoor te zorgen dat een clientdataset (string) veld NULL wordt als de string leeg is?
Of moet dat altijd geprogrammeerd worden, bijvoorbeeld in de BeforePost?
Is er ergens een manier om ervoor te zorgen dat een clientdataset (string) veld NULL wordt als de string leeg is?
Of moet dat altijd geprogrammeerd worden, bijvoorbeeld in de BeforePost?
Hangt een beetje van je dataset en gebruikte field-classes af. Bijvoorbeeld de IBX (die ik gebruik) heeft een TIBStringField met het volgende:
Delphi Code:
type TIBStringField = class(TWideStringField) private buffer : TValueBuffer; FEmptyAsNull: Boolean; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; class procedure CheckTypeSize(Value: Integer); override; function GetAsString: string; override; function GetAsVariant: Variant; override; function GetValue(var Value: string): Boolean; procedure SetAsString(const Value: string); override; property Value: UnicodeString read GetAsWideString write SetAsWideString; published property EmptyAsNull : Boolean read FEmptyAsNull write FEmptyAsNull default true; end;
Daar zie je dus een EmptyAsNull staan die default true is.
Ik geloof ook dat deze discussie voor de IBDAC van DevArt gevoerd is.
Welke componenten gebruik je precies?
MS SQL Server + DbExpress + TSQLDataSet + TClientDataSet.
TStringField heeft de property niet. Toch vreemd, want zou dit eigenlijk als standaard gedrag verwachten.
De database van het programma dat ik onderhoud zit dan ook vol met '' velden i.p.v. NULL velden :-(
Ik heb dat "Probleem" in het verleden ook eens gehad (ook met strings als " ", dus ook eigenlijk leeg) en
dat heb ik toen ook maar opgelost met een OnBeforePost-achtige constructie, omdat ik er verder niet veel
energie meer in wilde stoppen.
TMemoryLeak.Create(Nil);
Of iets in de EditChange van je TDBEdit.
(dit moest ik doen om ook velden met een EditMask goed op NULL te kunnen zetten)
Delphi Code:
if (Sender is TDBEdit) then with TDBEdit(Sender) do begin if Modified then begin // ModifiedForm:=true; if (Text = '') or (Text = FormatMaskText(Field.EditMask, '')) then begin Field.Clear; Modified := false; end; end; end;
Je zou het op NULL zetten zelfs in je TField.OnSetText kunnen doen.
@Rvk: too many events already...
@VideoRipper: same here...
Het meest globaal zou een interceptor class zijn om dit soort dingen te regelen.
Om alle designtime clientdatasets om de tuin te leiden :-)
Volgens mij heb ik ooit ook eens iets opgelost op SQL-niveau.
Iets in de trant van:
SQL Code:
INSERT INTO Adressen ( Woonplaats ) VALUES ( NULLIF(RTRIM(LTRIM(:WoonPlaats)), '') )
TMemoryLeak.Create(Nil);
Vooralsnog dus nu in de BeforePost gezet.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks