Autor Beitrag
GiuStyler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-Quelltext
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
  // CSV - Datei öffnen
  AssignFile(csv,ps_csvdatei);
  Reset(csv);

  // Schreiben Zeilenweise
  ReWrite(csv,S);
  while not EoF(csv) do
  begin
    ReWrite(csv,S);
      // Aufteilen lt. ; Semikola
      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;

      //  In CSV-Datei schreiben


      ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr));
      WriteLn(csv, ls_zeile);
  end;
  CloseFile(csv);
end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus Grafische Benutzeroberflächen (VCL & FireMonkey) verschoben am Mi 15.06.2016 um 16:02
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 304
Erhaltene Danke: 61

Win 7
Delphi XE5 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 304
Erhaltene Danke: 61

Win 7
Delphi XE5 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 304
Erhaltene Danke: 61

Win 7
Delphi XE5 Enterprise
BeitragVerfasst: Mi 15.06.16 16:30 
Wahrscheinlich kannst du dir den ganzen selbst geschriebenen Export sparen, indem du ExportGridToExcel benutzt.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mi 15.06.16 16:33 
Wenn ich es in die uses eintrage, kommt als Meldung (kann nicht aufgelöst werden)
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1556
Erhaltene Danke: 265


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mi 15.06.16 16:43 
ich kopiere es von hier in die uses, aber dann kommt direkt die Meldung.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6213
Erhaltene Danke: 94

Windows 7
XE2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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]

ausblenden volle Höhe Delphi-Quelltext
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
  // CSV - Datei öffnen
  AssignFile(csv,ps_csvdatei);

  // Schreiben Zeilenweise
  ReWrite(csv); // ReWrite vor der Schleife, damit die Datei geöffnet und reingeschrieben werden kann
  while not MSQBuecher.EoF do
  begin
      // Aufteilen lt. ; Semikola
      S := S + ';';
      zaehler := 0;
      while Pos(';',S)>0 do
        begin // Aufteilung der einzelnen Spalten die in der CSV-Datei kopiert werden sollen
           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;
           //if zaehler = 5 then p_zieldb.FieldByName('Erscheinungsjahr').AsString := IntToStr(li_jahr);
        end;

      //  In CSV-Datei schreiben
      ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr));
      WriteLn(ps_csvdatei, ls_zeile);
  end;
  CloseFile(csv); // Datei wieder schliessen
end;
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6213
Erhaltene Danke: 94

Windows 7
XE2
BeitragVerfasst: Do 16.06.16 10:49 
ausblenden volle Höhe Delphi-Quelltext
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
  // CSV - Datei öffnen
  AssignFile(csv,ps_csvdatei);

  // Schreiben Zeilenweise
  ReWrite(csv); // ReWrite vor der Schleife, damit die Datei geöffnet und reingeschrieben werden kann
// Hier solltest du sicherstellen, dass du von vorne anfängst
MSQBuecher.First;
  while not MSQBuecher.EoF do
  begin
      // Aufteilen lt. ; Semikola
      S := S + ';';
      zaehler := 0;
      while Pos(';',S)>0 do
        begin // Aufteilung der einzelnen Spalten die in der CSV-Datei kopiert werden sollen
           zaehler := zaehler + 1;
           ls_zeile := Copy(S,1,Pos(';',S)-1);
           S := Copy(S,Pos(';',S)+1,length(S));
// Ab hier versuchst du in die Datenbank-Tabelle zu schreiben. Das ist doch nicht dein Ziel
// Außerdem nutzt hier eine andere Tabelle, als die, die du für die Schleife verwendest.
           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;
           //if zaehler = 5 then p_zieldb.FieldByName('Erscheinungsjahr').AsString := IntToStr(li_jahr);
        end;

      //  In CSV-Datei schreiben
      ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr));
      WriteLn(ps_csvdatei, ls_zeile);
//Hier fehlt noch eine Anweisung, damit du nicht in einer Endlos-Schleife landest
MSQBuecher.Next;
  end;
  CloseFile(csv); // Datei wieder schliessen
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6213
Erhaltene Danke: 94

Windows 7
XE2
BeitragVerfasst: Do 16.06.16 11:04 
Da ich glaube, dass du inzwischen völlig durcheinander bist, lasse ich mal meine soziale Ader anspringen:
ausblenden volle Höhe Delphi-Quelltext
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
  // CSV - Datei öffnen
  AssignFile(csv,ps_csvdatei);

  // Schreiben Zeilenweise
  ReWrite(csv); // ReWrite vor der Schleife, damit die Datei geöffnet und reingeschrieben werden kann
  // Hier solltest du sicherstellen, dass du von vorne anfängst
  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;

    //  In CSV-Datei schreiben
    ls_zeile := (ls_titel + ';' + ls_autor + ';' + ls_verlag + ';' + ls_isbn + ';' + IntToStr(li_jahr));
    WriteLn(csv, ls_zeile);

    MSQBuecher.Next; // Nächster Datensatz
  end;
  CloseFile(csv); // Datei wieder schliessen
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. :wink:

Für diesen Beitrag haben gedankt: GiuStyler, Nersgatt
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 304
Erhaltene Danke: 61

Win 7
Delphi XE5 Enterprise
BeitragVerfasst: 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)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  QuellDB.Open; //  Tabelle öffnen
  while not QuellDB.EOF do
  begin // Tabelle bis EOF lesen
    QuellDB.Next;
  end;
  QuellDB.Close; // Tabelle schliessen


2. Wenn das Lesen der Quelle soweit geklappt hat, kannst du dich jetzt ans Schreiben vom Ziel machen (in deinem Fall eine CSV-Datei)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  AssignFile(csv,ps_csvdatei);
  Reset(csv); // neue CSV-Datei erstellen

  while not QuellDB.EOF do
  begin // Tabelle bis EOF lesen
...
    // innerhalb der Lese-Whileschleife String zusammenbasteln
    S := QuellDB.FieldByName('xxx').AsString + ';' + QuellDB.FieldByName('yyy').AsString;
  
    Writeln(csv, S) // String in CSV-Datei schreiben
...
  end;
  CloseFile(csv); // CSV-Datei schließen
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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