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.


Anmelden zum Antworten