![]() |
Problem mit NULL-Werten
Hi,
ich übernehme hier Daten aus einer Textdatei in eine Interbase Datenbank, bzw. will ich in diesem Fall bisher nicht vorhandene Felder mit einem gültigen Wert vorbesetzen:
Code:
Diese beiden Felder sind definiert als CHAR (1). Sehe ich mir in der Konsole die Werte an, steht bei dem ersten wirklich 0 drin, bei dem zweiten aber NULL ! Ändere ich das ganze von '0' auf '1' steht bei dem ersten 1 und bei dem zweiten wieder NULL !!! :shock: Sag mir mal einer, wie so etwas möglich ist. Die Showmessage zeigt '*0*' an, wegen der *chen sehe ich, daß da nicht noch andere Zeichen vorhanden sind.LiefDS.FindField ('ABHOLUNG').AsString := '0'; LiefDS.FindField ('BANKEINZUG').AsString := '0'; showmessage ('*'+LiefDS.FindField ('BANKEINZUG').AsString+'*'); Gruß Hansa |
hallo Hansa
Hast Du ev. auf der Tabelle einen Trigger, der den Wert zurücksetzt? Gruss Xaver |
Gute Idee !
die Trigger darf ich nicht aus den Augen verlieren, aber ich habe nur einen für die IDs gesetzt. Die Felder, die ich als Beispiel genommen habe sind relativ unwichtig, der Effekt aber nicht. Die Table, bei der mir das auffiel hat ca. 30 Felder, aber ich habe welche mit 300 oder noch mehr, soll ich die jetzt alle überprüfen, bei zig-tausend Datensätzen ? Bin gerade dabei, alle Programme neu zu compilieren und laufen zu lassen, dauert ewig, na denn :cheers: . Werde nachher mal sehen. Gruß Hansa |
Na ja war so eine Idee. Bin selber einmal in eine solche Falle gelaufen.
Hier noch eine Idee. Hast Du ev. eine Maske auf das Feld gelegt? Gruss Xaver PS: Ich glaube Du trinkst etwas zu viel :cheers: oder hast Du einen soooo langsamen Rechner, dass Du die Compile-Zeit mit einem Kühlen Blonden überbrücken musst? :lol: |
Hi Hansa,
was sein könnte - ohne dass ich Dir Schludrigkeit vorwerfen möchte - der Datentyp von BANKEINZUG ist eventuell doch nicht CHAR(1). Ich schätze, beide Felder sollen Boolean Charakter haben (man hat Bankeinzug oder nicht). Die Empfehlung zur Repräsentierung dieses Datentyps in Interbase ist ja eine Domain die in etwa so aussieht:
Code:
Also Integer. Falls der Aufwand vertretbar ist, würde ich die Datenbank entsprechend umbauen.
CREATE DOMAIN DM_BOOL AS SMALLINT DEFAULT 0 CHECK (VALUE BETWEEN 0 AND 1);
gruß, harrybo |
haha, Compilier-Zeit. Es geht um Datenübernahme. das ist purer Code und pure Daten. Nur ein Memo-Feld, damit man sieht, daß was passiert. Aber es sind ca. 100 MB Daten, die aus Textdatei in die DB rein müssen. Außerdem habe ich einen älteren Rechner für diese Aufgabe vorgesehen und das im Netz. Übernachten will ich aber trotzdem daheim. :mrgreen:
|
So kannst Du ja auch übernachten :duck:
|
Ich glaub ich werd noch verrückt. Ich habe die DB jetzt komplett neu aufgebaut, Null-Werte sind immer noch da. Ich hab jetzt einen näher unter die Lupe genommen. Und zwar email eines Lieferanten. Bei Kunden gibt es die auch. Jetzt ist folgender Effekt festzustellen : Der Wert, der mit FindField gesetzt wird, wird nicht angenommen (bei Lieferanten).
Mach ich nun folgendes:
Code:
und lasse das Programm, das die Konvertierung macht neu laufen, nachdem ich die Table komplett leer gemacht habe, so funktioniert alles.
ALTER TABLE LIEF8 ALTER EMAIL TO LIEFEMAIL
Alle Felder behandele ich ungefähr so :
Code:
Vor der Umbenennung des Feldes sah das ganze eben so aus:
LiefDS.FindField ('LIEFEMAIL').AsString := copy (zeile,585,30);
Code:
Wenn ein Feldname in zwei verschiedenen Tabellen benutzt wird, so gibt das doch keinen Fehler, oder doch? Dann dürfte ich aber doch keine ID benutzen, bzw. für jede Tabelle einen anderen Bezeichner. Also ich raffe das nicht mehr.
LiefDS.FindField ('EMAIL').AsString := copy (zeile,585,30);
:cry: Gruß Hansa |
Hallo Hansa
Zuerst eine Frage: Liest Du die Daten mit einem Select-Statement aus der Datenbank? Hast Du ev. in diesem Select beide Tabellen als Join drin? Zum Beispiel so:
Code:
Wenn das der Falle ist, dann funktioniert Dein Update oder Insert garantiert nicht mit den gleichen Feldnamen.
select * from Kunde, Lieferant
Ich nehme aber nicht an, dass eine alter Hase wie Du so einen Fehler macht! :mrgreen: Für mich sieht das nach einem Fehler im DB-Servers aus. Hatte das vor Jahren (10 Jahre) einmal auf einem Unify-DB-Server auf Unix. Ich habe mir damals angewöhnt, dass die Datenbank-Felder immer mit einem Kürzel der Tabelle versehen sind. Beispiel:
Code:
Das bringt zudem den Vorteil, dass Du nicht immer mit Substitutes arbeiten musst, wenn Du einen Join benötigst. Wahrscheinlich bringt Dir aber dieser Hinweis nichts, da Dein Programm ja schon steht. Wir mussten damals alle Applikationen anpassen :coder: Hatte uns im Zeitplan um zwei Monate zurück geworfen.
Tabelle: Address
Felder: Adr_Num, Adr_Name usw. Gruss Xaver |
Zitat:
Zitat:
Zitat:
Gruß Hansa |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz