Interbase: Muss Feld gesetzt sein?
-
Hallo.
Ich habe ein Problem: Ich fummel in einer Datenbank rum... ich muss alle Datensätze (Jahreszahlen) verändern. Wenn ich die Datenbank nun durchgehe, dafür hab ich schon den Code) und diese Änderungen vornehme, kommt an einigen Stellen folgende Meldung: "Feld 'Bla' muss einen Wert haben". Wie kann ich feststellen, ob das angegebene Feld gesetzt sein muss oder nicht? In der Hilfe hab ich nichts gefunden.
MfG Windoof
-
Dazu brauchst du ein Tool, daß dir die interne Tabellenstruktur zeigt. Nach der Installation von Interbase müßte im Unterverzeichnis "bin" ein Programm "ibconsole.exe" zu finden sein, damit geht das z.B.
Wenn Du eine Tabelle öffnest und ein Feld mit "ALLOW NULLS = no" markiert ist, darf dieses Feld keine NULL-Werte enthalten. Das DBMS verweigert alle Änderungen, bei denen solch ein Feld den Wert NULL bekommen würde.
-
Gibt es keinen Weg im Quelltext zu gucken, ob das angegebene Feld gesetzt werden muss oder nicht...?
-
OK, ich mach das ja in Delphi, aber es sollten die selben Methoden sein, wenn überhaupt. Also hier mein Quelltext:
procedure TForm1.BitBtn4Click(Sender: TObject); var i,j,k:integer; begin Screen.Cursor:=crHourGlass; for j:=0 to Files.Count-1 do begin FileName:=Files[j]; BitBtn2Click(Sender); for i := 0 to TableBox.Items.Count - 1 do Begin IBTable.TableName:=TableBox.Items.Strings[i]; IBTable.Active:=True; FieldBox.Items.Assign(IBTable.FieldList); IBTable.First; while not IBTable.Eof do begin for k := 0 to FieldBox.Items.Count - 1 do Begin IBTable.Edit; IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'2003','2004',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'2002','2003',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'2001','2002',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'2000','2001',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'1999','2000',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'1998','1999',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'1997','1998',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'1996','1997',[rfReplaceAll]); IBTable.Fields[k].AsString:=StringReplace(IBTable.Fields[k].AsString,'1995','1996',[rfReplaceAll]); if IBTable.Fields[k].AsString='' then begin if not IBTable.FieldList.Fields[k].HasConstraints then IBTable.Fields[k].AsString:='0'; end; IBTable.ApplyUpdates; Memo1.Lines.add(IBTable.TableName+' - '+IBTable.FieldList.Strings[k]+' wurde aktualisiert.'); Application.ProcessMessages; End; IBTable.Next; end; IBTable.Active:=False; FieldBox.Clear; end; end; Memo1.Lines.Add('*** Aktualisierung erfolgreich ***'); Screen.Cursor:=crDefault; end;
Diese Funktion geht mehrere Datenbanken druch, in diesen Datenbanken befinden sich verschiedene Tabellen und in diesen Tabellen verschiedene Felder. Ich will jedes Feld für jeden Tabelleneintrag verändern, aber nur diese Felder, die ein Datum beinhalten. Weil ich Fehlermeldungen bekomme bei einigen Feldern, dass sie gesetzt sein müssen, aber nicht gesetzt sind, will ich die dann mit nullen füllen. Soweit so gut, ich habe also geguckt, welche Felder nach meinem Eintrag immernoch leer sind und habe in ihnen eine null eingetragen, doch es sind mehrere tabellen miteinander verknüpft, weshalb auch Fremdschlüssen vorhanden sind, und wenn die leer sind, und ich sie ändern will, bekomme ich wieder eine fehlermeldung. Aber Fremdschlüssel haben eigentlich nie die Eigenschaft, dass sie gesetzt sein müssen, deshalb frage ich.
-
WAHHHHHHH!
diese Funktion willst du auf die Datenbank los lassen?
Du klatscht einfach überall in den leeren DB-Feldern auch wenn Sie keine
Jahresangaben beinhalten eine "0"?
Soll die Datenbank auch weiterhin laufen, natürlich mit richtigen Werten/Daten?Such dir lieber die Datenfeldnamen raus die Jahresdaten beinhalten
und verändere diese.
-
Nene, ich hab die Funktion geändert, funktioniert jetzt.