Autor |
Beitrag |
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 15.06.16 14:56
Hallo Community,
ich habe ein Problem beim Speichern. Ich bekomme beim Speichern folgende Fehlermeldung (Die angegebene Datei wurde nicht gefunden). Wo ist den mein Denkfehler oder der Fehler. Auf Anhieb finde ich den Fehler nicht.
Mein Code sieht so aus.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| procedure TFormHaupt.DoExport(ps_csvdatei : string;p_zieldb : TMSQuery); var ls_titel : string; ls_autor : string; ls_verlag : string; ls_isbn : string; li_jahr : integer;
csv: TextFile; S: string; Zeile : string;
zaehler : integer;
ls_zeile : string; begin AssignFile(csv,ps_csvdatei); Reset(csv);
ReWrite(csv,S); while not EoF(csv) do begin ReWrite(csv,S); S := S + ';'; zaehler := 0; while Pos(';',S)>0 do begin zaehler := zaehler + 1; ls_zeile := Copy(S,1,Pos(';',S)-1); S := Copy(S,Pos(';',S)+1,length(S)); if zaehler = 1 then ls_titel := ls_zeile; if zaehler = 2 then ls_autor := ls_zeile; if zaehler = 3 then ls_verlag := ls_zeile; if zaehler = 4 then ls_isbn := ls_zeile; if zaehler = 5 then li_jahr := StrToInt(ls_zeile); end;
ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr)); WriteLn(csv, ls_zeile); end; CloseFile(csv); end; |
Moderiert von Christian S.: Code- durch Delphi-Tags ersetztModeriert von Christian S.: Topic aus Grafische Benutzeroberflächen (VCL & FireMonkey) verschoben am Mi 15.06.2016 um 16:02
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mi 15.06.16 15:10
Dein Code versucht folgendes:
1. Reset = Öffnet eine vorhandene Datei.
2. Rewrite = Erstellt eine neue Datei und öffnet sie anschließend.
3. Solange das Dateiende nicht erreicht wurde : Rewrite = Erstellt eine neue Datei und öffnet sie anschließend.
Das ReWrite(csv,S); dürfte sich schon mal gar nicht kompilieren lassen, da der zweite Übergabeparameter ein Integerwert, der die RecSize beinhaltet, sein müsste.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 15.06.16 15:32
Ah ok.
Habe erstmal Reset weg. Nun kommt ein E/A 105 Fehler ^^ vermutlich liegt es nun an Punkt 3.
aber kompilieren tut es. Ich kann auf den Button klicken und ein Name zuweisen, aber beim klick auf Speichern im Anschluss taucht der Fehler auf.
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mi 15.06.16 15:43
Was möchtest du denn eigentlich erreichen? Woher kommen die Daten und wohin sollen sie gehen, denn zur Zeit eierst du auf einer CSV-Datei rum, auf der du gleichzeitig versuchst zu lesen und zu schreiben.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 15.06.16 16:01
Also. Ich habe eine cxGrid. Dort habe ich nun Daten drin stehen. Diese will ich nun durch ein klick auf den Button exportieren als CSV.
Arbeite mittlerweile mit DX (also Delphi 10).
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mi 15.06.16 16:30
Wahrscheinlich kannst du dir den ganzen selbst geschriebenen Export sparen, indem du ExportGridToExcel benutzt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| uses cxGridExportLink;
procedure TForm1.btnExportToExcelClick(Sender: TObject); begin cxGridExportLink.ExportGridToExcel('c:\temp\test.xls', mycxGrid); end; |
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 15.06.16 16:33
Wenn ich es in die uses eintrage, kommt als Meldung (kann nicht aufgelöst werden)
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 15.06.16 16:35
Vertippt? Ich mache es mit den cxGrids genauso wie baumina schreibt.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 15.06.16 16:43
ich kopiere es von hier in die uses, aber dann kommt direkt die Meldung.
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.16 08:22
Ein wenig OT und bitte nicht falsch verstehen. Es soll nur zum Nachdenken anregen.
@GiuStyler:
Du machst eine Ausbildung zum Anwendungsentwickler. Die Ausbildung muss mindestens schon im letzten Jahr begonnen haben.
Du hast ja schon ein paar der wichtigen Befehle dazu gefunden. Aber hast du auch deren Bedeutung geprüft? ReWrite ist was anderes als eine Zeile aus der CSV-Datei zu lesen. Es öffnet nur die Datei zum Lesen. ReadLn liest dann eine Zeile. WriteLn hast du ja schon gefunden. Daher wundert es mich, dass du das passende Gegenstück nicht kennst.
Du willst aus dem Grid etwas lesen und in eine CSV-Datei schreiben. Wo liest du denn etwas aus dem Grid? Dazu kann ich in deinem Source nichts finden. Für mich stellt sich daher die Frage, ob du überhaupt verstehst, was du da machst.
Natürlich weiß ich, dass dein Ausbilder schuld ist, weil er dir das nicht erklärt hat. Man kann den Ausbilder aber auch fragen oder sich mit den Befehlen beschäftigen. Da gibt es in Delphi etwas, dass sich Hilfe nennt. Oft sind da auch Code-Beispiele verfügbar.
Ich habe selbst schon ausgebildet und kann dir nur sagen, dass du nach einem Jahr mehr können solltest. So etwas einfaches, wie aus einem Grid lesen und in eine Datei schreiben ist trivial.
Die Lösung mit der Funktion für den Export aus einem cxGrid ist auch nicht hilfreich, weil dein Ausbilder vermutlich ein anderes Ziel hatte. Da ich kein cxGrid einsetze kann ich dazu aber auch nicht sagen, wo der Fehler ist.
Wie gesagt, dass soll nur zum Nachdenken anregen und ist auch nicht böse gemeint. Ich will damit keine Diskussion auslösen.
So, und jetzt wieder zum Thema:
AssignFile ist schonmal richtig.
Du musst natürlich dein GRID Zeilenweise durchgehen, um die Daten für die CSV-Datei zu bekommen und nicht die Datei, in die du schreiben willst.
Dementsprechend muss das Reset natürlich weg, weil dieses eine Datei nur zum Lesen öffnet.
Das Rewrite ist ist richtig, aber ohne den zweiten Parameter. Du bedienst schließlich ein TextFile. Das Rewrite darf nur einmal VOR der Schleife ausgeführt werden und öffnet eine Datei zum Schreiben (vergleiche Reset dazu).
In der Schleife bereitest du den String auf, den du in die Datei schreiben willst und schreibst diesen dann mit WriteLn in die Datei.
Nach der Schleife kommt das CloseFile.
Bis dahin sind noch keinerlei Prüfroutinen enthalten. Z.B. kann ein Rewrite auch fehlschlagen, bei ungültigen Dateinamen, fehlenden Schreibrechten, schon geöffneten Dateien, ...
Mache dir nächstes mal einen kleinen Plan:
- Datei zuweisen
- Datei zum Schreiben öffnen
- In einer Schleife das Grid durchlaufen
- In der Schleife die Daten einer Grid-Zeile aufbereiten
- Die aufbereiteten Daten in die Datei schreiben
- Nach der Schleife die Datei schließen
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 16.06.16 10:23
Hallo,
Guten Morgen erstmal.
@jasocul, das ich es mittlerweile können sollte stimmt schon, aber da wir eine kleine Firma sind und ich mit Delphi gut 6 Monate nichts mehr gemacht habe, habe ich da meine Probleme. Da ich hier in der Firma mitkriege was zur Zeit für Aufträge kommen, mache ich meinen Chefs keinen Vorwurf. Aber anderes Thema.
Zum Thema nun. Mein Code sieht nun so aus. Aber irgendwie ist da immer noch ein Fehler drin und kriege diese Meldung [Datenmenge weder im Editier. noch im Einfügemodus]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TFormHaupt.DoExport(ps_csvdatei : string;p_zieldb : TMSQuery); var ls_titel : string; ls_autor : string; ls_verlag : string; ls_isbn : string; li_jahr : integer;
csv: TextFile; S: string;
zaehler : integer;
ls_zeile : string; begin AssignFile(csv,ps_csvdatei);
ReWrite(csv); while not MSQBuecher.EoF do begin S := S + ';'; zaehler := 0; while Pos(';',S)>0 do begin zaehler := zaehler + 1; ls_zeile := Copy(S,1,Pos(';',S)-1); S := Copy(S,Pos(';',S)+1,length(S)); if zaehler = 1 then p_zieldb.FieldByName('Titel').AsString := ls_titel; if zaehler = 2 then p_zieldb.FieldByName('Autor').AsString := ls_autor; if zaehler = 3 then p_zieldb.FieldByName('Verlag').AsString := ls_verlag; if zaehler = 4 then p_zieldb.FieldByName('ISBN').AsString := ls_isbn; end;
ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr)); WriteLn(ps_csvdatei, ls_zeile); end; CloseFile(csv); end; |
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.16 10:49
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| procedure TFormHaupt.DoExport(ps_csvdatei : string;p_zieldb : TMSQuery); var ls_titel : string; ls_autor : string; ls_verlag : string; ls_isbn : string; li_jahr : integer;
csv: TextFile; S: string;
zaehler : integer;
ls_zeile : string; begin AssignFile(csv,ps_csvdatei);
ReWrite(csv); MSQBuecher.First; while not MSQBuecher.EoF do begin S := S + ';'; zaehler := 0; while Pos(';',S)>0 do begin zaehler := zaehler + 1; ls_zeile := Copy(S,1,Pos(';',S)-1); S := Copy(S,Pos(';',S)+1,length(S)); if zaehler = 1 then p_zieldb.FieldByName('Titel').AsString := ls_titel; if zaehler = 2 then p_zieldb.FieldByName('Autor').AsString := ls_autor; if zaehler = 3 then p_zieldb.FieldByName('Verlag').AsString := ls_verlag; if zaehler = 4 then p_zieldb.FieldByName('ISBN').AsString := ls_isbn; end;
ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr)); WriteLn(ps_csvdatei, ls_zeile); MSQBuecher.Next; end; CloseFile(csv); end; |
Ich habe da ein paar Hinweise in den Source geschrieben. Meine Sachen sind extra nicht eingerückt, damit du es besser erkennen kannst.
Kann es sein, dass du den Source aus einer anderen Routine für den Import aus einer CSV als Vorlage verwendet hast?
Für diesen Beitrag haben gedankt: Nersgatt
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.16 11:04
Da ich glaube, dass du inzwischen völlig durcheinander bist, lasse ich mal meine soziale Ader anspringen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TFormHaupt.DoExport(ps_csvdatei : string;p_zieldb : TMSQuery); var ls_titel : string; ls_autor : string; ls_verlag : string; ls_isbn : string; li_jahr : integer; csv: TextFile; ls_zeile : string; begin AssignFile(csv,ps_csvdatei);
ReWrite(csv); MSQBuecher.First; while not MSQBuecher.EoF do begin ls_titel := MSQBuecher.FieldByName('Titel').AsString; ls_autor := MSQBuecher.FieldByName('Autor').AsString; ls_verlag := MSQBuecher.FieldByName('Verlag').AsString; ls_isbn := MSQBuecher.FieldByName('ISBN').AsString; li_jahr := MSQBuecher.FieldByName('Erscheinungsjahr').AsInteger;
ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr)); WriteLn(csv, ls_zeile);
MSQBuecher.Next; end; CloseFile(csv); end; |
Ich kenne natürlich nicht die Feldnamen der Tabelle und würde das auch etwas anders programmieren, aber du sollst ja eine Chance haben, das noch zu durchschauen.
Für diesen Beitrag haben gedankt: GiuStyler, Nersgatt
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 16.06.16 11:09
Da dein Quellcode dieser procedure gerade ziemlich aus dem Ruder läuft, empfehle ich dir diesen komplett zu entfernen und neu zu schreiben (ja, ich weiß, das habe ich früher auch immer gehasst, wenn das mein Chef wollte, heute weiß ich allerdings, dass es nur Sinn macht). Danach gehe bitte folgendermaßen vor, um ihn neu zu schrieben:
1. Setze erst das Lesen der Quelle um (in deinem Fall ist das wahrscheinlich eine DB-Tabelle)
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| QuellDB.Open; while not QuellDB.EOF do begin QuellDB.Next; end; QuellDB.Close; |
2. Wenn das Lesen der Quelle soweit geklappt hat, kannst du dich jetzt ans Schreiben vom Ziel machen (in deinem Fall eine CSV-Datei)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| AssignFile(csv,ps_csvdatei); Reset(csv); while not QuellDB.EOF do begin ... S := QuellDB.FieldByName('xxx').AsString + ';' + QuellDB.FieldByName('yyy').AsString; Writeln(csv, S) ... end; CloseFile(csv); |
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 22.06.16 08:42
Hallo,
sry das ich mich jetzt erst wieder melde. Hatte dazwischen viel zu erledigen außerhalb des Programmierens.
Hat funktioniert der Code von jasocul. Danke erstmal.
@baumina: Die Idee ist nicht schlecht, habe ich mal mein Chef so erzählt. Er will es aber so haben wie jasocul es am Ende hatte. Wieso auch immer.
Für diesen Beitrag haben gedankt: jasocul
|
|