Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi E/A Fehler 105 (https://www.delphipraxis.net/38641-e-fehler-105-a.html)

chrissy 22. Jan 2005 00:29


E/A Fehler 105
 
Hi!
Ich will Dateien in ein Worddokument von Delphi aus schreiben, ohne dies in Word expliziet anzeigen zu lassen.
Soweit so gut, Datei wird erzeugt, und dann soll mit Writeln hineingeschrieben werden.

Nur leider bekomme ich dabei diese unschöne Fehlermeldung....

hier mal mein Quellcode. Hab irgendwie keine Idee mehr was daran falsch sein könnte....

Delphi-Quellcode:
with Daten.DSSonstigeBefehle.DataSet do
     begin
       if not fileExists(Pfad+'\Dokumente\RechnungK.csv') then document:= TFileStream.Create(Pfad+'\Dokumente\RechnungK.csv', fmCreate)
                                                          else begin
                                                                 AssignFile(f, Pfad+'\Dokumente\RechnungK.csv');
                                                                 Erase(f);
                                                                 document:= TFileStream.Create(Pfad+'\Dokumente\RechnungK.csv', fmCreate);
                                                          end;
       //ShowMessage('Datei angelegt!');
       Open;
       First;
       AssignFile(f, Pfad+'Dokumente\RechnungK.csv');
       while (not eof) do
        begin
          writeln(Pfad+'Dokumente\RechnungK.csv', FieldByName('Rechnungsnummer').AsString+';'+FieldByName('Anrede').AsString+';'+FieldByName('Name').AsString+';'+FieldByName('Vorname').AsString+';'+FieldByName('Strasse').AsString+';'+FieldByName('Hausnummer').AsString+';'+FieldByName('PLZ').AsString+';'+FieldByName('Ort').AsString+';'+FieldByName('Kundennummer').AsString+'K'+';'+FieldByName('Vermittlungsdatum').AsString+';'+FieldByName('Modul').AsString+';'+FieldByName('Preis').AsString+';');
          ShowMessage('Ins Worddokument wurde geschrieben ;)');
          with Daten.tVermittlung do
            begin
              locate('Id', Daten.QSonstigeBefehle.FieldValues['Rechnungsnummer'], []);
              Edit;
              FieldByName('Rechnungsdatum').AsDateTime:=Date;
              FieldByName('Rechnung').AsBoolean := true;
              ShowMessage('Das Rechnungsdatum steht jetzt auch schon in der Vermittlung...');
              post;
              prior;
            end;
          next;
        end;
        CloseFile(f);
     end;
    document.Free;
Gruß
Chrissy

Luckie 22. Jan 2005 01:08

Re: E/A Fehler 105
 
Ein Blick in die Hilfe was Fehler 105 bedeutet und mal das Beispiel zu AssigneFile angeguckt (eventuell mal die unbekannten Prozeduren verglichen) und dir sollte klar sein, warum dieser Fehler auftaucht und was du falsch machst, bzw. nicht machst.

chrissy 22. Jan 2005 01:26

Re: E/A Fehler 105
 
Blick in die Hilfe habe ich getätigt, bevor ich das ganze gepostet habe.

So wich ich das verstanden habe tritt der Fehler 105 bei Writeln auf, wenn keine Konsole existiert.

Füge ich ein AllocColsole(); ein, schreibt er die Daten zwar, aber nicht ins Word Dokument, oder in csv-Datei sondern direkt in die Konsole...

Eine weitere Idee die mir noch gekommen war, ist einfach mal Die Datei zu öffnen, um dann reinschreiben zu können, geht aber auch nicht... :(

AssignFile(f, filename); und danach Reset(f); habe ich vorher auch schon ausprobiert... dann kommt nach Reset(f); die Fehlermeldung 32, Verletzung bei der gemeinsamen nutzung, aber wo nutze ich die Datei dann gemeinsam?! gehe ich vorher auf CloseFile(f); bekomme ich die Fehlermeldung, dass die Datei gar nicht geöffnet ist....

Auch wenn du meinst, ich könnte jetzt verstehen, was ich falsch gemacht habe, oder worin der Fehler liegt, vielleicht bin ich auch einfach nur Blind, hab aber echt keine Idee...

Gruß
Chrissy

Luckie 22. Jan 2005 01:34

Re: E/A Fehler 105
 
Korrektur:
Reset war es. Und wenn die Datei gemsinsam genutzt wird, dann hast du sie entweder noch offen oder sie wurde exklusiv geöffnet. Und ich sehe auch schon, wo du sie nicht geschlossen hast - denke ich mal.

chrissy 22. Jan 2005 01:45

Re: E/A Fehler 105
 
ok, fehler soweit entdeckt... Reset sollte die offene Datei ja automatisch schließen, wenn sie schon offen ist... Es mag am filemode gelegenhaben, durch hinzufügen der Zeile Filemode = 2 konnte er das ganze dann ohne weiteres ausführen....
Das ganze hat nur noch den haken, dass nacher in der datei trotzdem nichts dirn steht, obwohl writeln ausgeführt wird.

Hansa 22. Jan 2005 03:02

Re: E/A Fehler 105
 
Zitat:

Zitat von chrissy
... Reset sollte die offene Datei ja automatisch schließen, wenn sie schon offen ist...

Also, mir wäre das völlig neu. :shock:

Luckie 22. Jan 2005 03:08

Re: E/A Fehler 105
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von chrissy
... Reset sollte die offene Datei ja automatisch schließen, wenn sie schon offen ist...

Also, mir wäre das völlig neu. :shock:

Dann lies mal die Hilfe:
Zitat:

If F is already open, it is first closed and then reopened.
Aber ich würde trotzdem immer selber sicherstellen, dass die Datei geschlossen ist. So was läuft bei mir unter "sauberes Programmieren". ;)

Hansa 22. Jan 2005 03:15

Re: E/A Fehler 105
 
Ist ja schon gut. Ist spät. 8) Reset ? :gruebel: Du hast mich mit Assign auf die falsche Spur gelockt. Also gilt § 1 : Moderator hat immer Recht, sofern er Recht hat. :mrgreen:

chrissy 22. Jan 2005 03:41

Re: E/A Fehler 105
 
Ist ja schon ok,... es gibt ja keine Fehlermeldung mehr... ;)
bin ja dankbar für die Hilfe...

Naja, ärgert mich halt nur noch, dass die Datei trotzdem lehrbleibt...

Luckie 22. Jan 2005 04:18

Re: E/A Fehler 105
 
Der Code oben mit dem Reset und dem CloseFile sollte aber in Ordnung sein. Stimmen die Pfade?

Christian Seehase 22. Jan 2005 04:21

Re: E/A Fehler 105
 
Moin Chrissy,

ich weiss jetzt nicht, wohin Dein WriteLn schreibt, aber

Code:
writeln([b][color=red]f[/color][/b],....
statt

Delphi-Quellcode:
writeln(Pfad+'Dokumente\RechnungK.csv',
wär wahrscheinlich besser.

chrissy 22. Jan 2005 07:04

Re: E/A Fehler 105
 
ich Probiers mal aus, aber erst mal doch jetzt schlafen.... ;)

chrissy 28. Jan 2005 12:32

Re: E/A Fehler 105
 
hym, wenn ich das f statt der Pfadangabe in Writeln schreibe, bekomme ich eine Fehlermeldung beim Compilieren bzg. ungültiger Typ in write/writeln anweisung.

Hansa 28. Jan 2005 12:36

Re: E/A Fehler 105
 
Ist das "f" auch überhaupt deklariert ?
Delphi-Quellcode:
var f : Text;

chrissy 28. Jan 2005 12:45

Re: E/A Fehler 105
 
s.o.
Ja, f ist als File deklariert.
Nur, warum soll ich F als text deklarieren, wenn ich dann letztenendes genau das in der variablen abspeicher, was ohnehin in meiner anweisung steht?!

Muetze1 28. Jan 2005 13:47

Re: E/A Fehler 105
 
Moin!

Zitat:

Zitat von chrissy
s.o.
Ja, f ist als File deklariert.
Nur, warum soll ich F als text deklarieren, wenn ich dann letztenendes genau das in der variablen abspeicher, was ohnehin in meiner anweisung steht?!

Klingt komisch, ist aber fast richtig.

Hansa hat sich verschrieben und meint:
Delphi-Quellcode:
Var f : TextFile;
.

f steht dann für eine Textdatei die du dann mit Read/ReadLn lesen und mit Write/WriteLn schreiben kannst, wobei du aber bei den Funktionen immer als erstes entweder einen Dateiidentifier angeben musst (also hier f), damit es in die Datei geht. Wenn du dies nicht tust, dann liest Read/ReadLn vom stdin (Standard Input) und Write/WriteLn schreibt in den stdout (Standard Output).

Und die Read(Ln)/Write(Ln) Funktionen sind nicht kompatibel bzw. nutzbar mit untypisierten Dateitypen bzw. Binärtypen wie z.B. File of Integer oder einfach nur File.

MfG
Muetze1

Hansa 28. Jan 2005 15:55

Re: E/A Fehler 105
 
poste den letzten Source, sonst wird das nichts.

chrissy 6. Feb 2005 14:45

Re: E/A Fehler 105
 
Delphi-Quellcode:
procedure TForm1.Kunde2Click(Sender: TObject);
var
  document : TFileStream;
  f : file;
begin
   // Rechnungen Drucken KUNDE
   Daten.QSonstigeBefehle.DatabaseName:=pfad+'\Daten';
   Daten.QSonstigeBefehle.Active:=false;
   Daten.QSonstigeBefehle.SQL.Clear;
   Daten.QSonstigeBefehle.SQL.Add('Select V.Id AS Rechnungsnummer, A.Anrede, K.Vorname, K.Name, K.Strasse, K.Hausnummer, K.PLZ, OV.Ort, K.Id AS Kundennummer, V.Datum AS Vermittlungsdatum, M.Modul, V.Preis FROM "'+pfad+'\Daten\anrede.DB" A INNER JOIN "'+pfad+'\Daten\kunde.DB" K ON (A.Id = K.Anrede) INNER JOIN "'+pfad+'\Daten\vermittlung.DB" V ON (K.Id = V.Kunde) INNER JOIN "'+pfad+'\Daten\ort_vorwahl.db" Ov ON (Ov.Id = K."Ort/Vorwahl") INNER JOIN "'+pfad+'\Daten\modul.db" M ON (M.Id = V.Modul) WHERE (V.RechnungK = false)');
   Daten.QSonstigeBefehle.Active:=true;
   with Daten.DSSonstigeBefehle.DataSet do
     begin
       if not fileExists(Pfad+'\Dokumente\RechnungK.doc') then document:= TFileStream.Create(Pfad+'\Dokumente\RechnungK.doc', fmCreate)
                                                          else begin
                                                                 AssignFile(f, Pfad+'\Dokumente\RechnungK.doc');
                                                                 Erase(f);
                                                                 document:= TFileStream.Create(Pfad+'\Dokumente\RechnungK.doc', fmCreate);
                                                          end;
       //ShowMessage('Datei angelegt!');
       Open;
       First;
       {$I-}
       AssignFile(f, Pfad+'Dokumente\RechnungK.doc');
       FileMode := 2;
       Reset(f);
       while (not eof) do
        begin
          writeln(Pfad+'Dokumente\RechnungK.doc', FieldByName('Rechnungsnummer').AsString+';'+FieldByName('Anrede').AsString+';'+FieldByName('Name').AsString+';'+FieldByName('Vorname').AsString+';'+FieldByName('Strasse').AsString+';'+FieldByName('Hausnummer').AsString+';'+FieldByName('PLZ').AsString+';'+FieldByName('Ort').AsString+';'+FieldByName('Kundennummer').AsString+'K'+';'+FieldByName('Vermittlungsdatum').AsString+';'+FieldByName('Modul').AsString+';'+FieldByName('Preis').AsString+';');
          with Daten.tVermittlung do
            begin
              locate('Id', Daten.QSonstigeBefehle.FieldValues['Rechnungsnummer'], []);
              Edit;
              FieldByName('Rechnungsdatum').AsDateTime:=Date;
              FieldByName('RechnungK').AsBoolean := true;
              post;
            end;
          next;
        end;
       //Writeln('klappts?');
       //SaveFile(Pfad+'Dokumente\RechnungK.doc');
       CloseFile(f);
       {$I+}
     end;
    document.Free;
    ShowMessage('Datei RechnungK kann nun in Serienbrief eingebunden werden.')
end;

So, etwas spät, ich weiss, aber das ist mein letzter Source Code. wenn ich zusätzlich noch die console öffne, schreibt er das da rein, was nicht gan meine idee ist... :(

Gruß
Chrissy

chrissy 6. Feb 2005 14:47

Re: E/A Fehler 105
 
Hi, etwas spät aber hier mein letzter colde

Delphi-Quellcode:
procedure TForm1.Kunde2Click(Sender: TObject);
var
  document : TFileStream;
  f : file;
begin
   // Rechnungen Drucken KUNDE
   Daten.QSonstigeBefehle.DatabaseName:=pfad+'\Daten';
   Daten.QSonstigeBefehle.Active:=false;
   Daten.QSonstigeBefehle.SQL.Clear;
   Daten.QSonstigeBefehle.SQL.Add('Select V.Id AS Rechnungsnummer, A.Anrede, K.Vorname, K.Name, K.Strasse, K.Hausnummer, K.PLZ, OV.Ort, K.Id AS Kundennummer, V.Datum AS Vermittlungsdatum, M.Modul, V.Preis FROM "'+pfad+'\Daten\anrede.DB" A INNER JOIN "'+pfad+'\Daten\kunde.DB" K ON (A.Id = K.Anrede) INNER JOIN "'+pfad+'\Daten\vermittlung.DB" V ON (K.Id = V.Kunde) INNER JOIN "'+pfad+'\Daten\ort_vorwahl.db" Ov ON (Ov.Id = K."Ort/Vorwahl") INNER JOIN "'+pfad+'\Daten\modul.db" M ON (M.Id = V.Modul) WHERE (V.RechnungK = false)');
   Daten.QSonstigeBefehle.Active:=true;
   with Daten.DSSonstigeBefehle.DataSet do
     begin
       if not fileExists(Pfad+'\Dokumente\RechnungK.doc') then document:= TFileStream.Create(Pfad+'\Dokumente\RechnungK.doc', fmCreate)
                                                          else begin
                                                                 AssignFile(f, Pfad+'\Dokumente\RechnungK.doc');
                                                                 Erase(f);
                                                                 document:= TFileStream.Create(Pfad+'\Dokumente\RechnungK.doc', fmCreate);
                                                          end;
       //ShowMessage('Datei angelegt!');
       Open;
       First;
       {$I-}
       AssignFile(f, Pfad+'Dokumente\RechnungK.doc');
       FileMode := 2;
       Reset(f);
       while (not eof) do
        begin
          writeln(Pfad+'Dokumente\RechnungK.doc', FieldByName('Rechnungsnummer').AsString+';'+FieldByName('Anrede').AsString+';'+FieldByName('Name').AsString+';'+FieldByName('Vorname').AsString+';'+FieldByName('Strasse').AsString+';'+FieldByName('Hausnummer').AsString+';'+FieldByName('PLZ').AsString+';'+FieldByName('Ort').AsString+';'+FieldByName('Kundennummer').AsString+'K'+';'+FieldByName('Vermittlungsdatum').AsString+';'+FieldByName('Modul').AsString+';'+FieldByName('Preis').AsString+';');
          with Daten.tVermittlung do
            begin
              locate('Id', Daten.QSonstigeBefehle.FieldValues['Rechnungsnummer'], []);
              Edit;
              FieldByName('Rechnungsdatum').AsDateTime:=Date;
              FieldByName('RechnungK').AsBoolean := true;
              post;
            end;
          next;
        end;
       //Writeln('klappts?');
       //SaveFile(Pfad+'Dokumente\RechnungK.doc');
       CloseFile(f);
       {$I+}
     end;
    document.Free;
    ShowMessage('Datei RechnungK kann nun in Serienbrief eingebunden werden.')
end;

Ausgeben tut er im moment direkt in die Console was nicht ganz meiner Idee entspricht. Wo der fehler genau liegt, weiss ich aber nicht.

Gruß
Chrissy

Hansa 6. Feb 2005 15:24

Re: E/A Fehler 105
 
Da sind etliche Fehler oder zumindest Ungereimtheiten.

Zitat:

Zitat von chrissy
f : file;
AssignFile(f, Pfad+'Dokumente\RechnungK.doc');
FileMode := 2;
Reset(f);
while (not eof) do
begin
writeln(Pfad+'Dokumente\RechnungK.doc', FieldByName

1. f : Text; statt f : file
2. Reset öffnet zum NUR-Lesen. Rewrite verwenden.
3. was ist Filemode, bzw. wieso weist du dem einen Wert zu ??
4. EOF ohne Parameter bezieht sich auf Konsole EOF (f) wäre richtig.
5. was ist, wenn eine Datei nicht da ist ? Wozu gibt es (*$I-*) usw.?

Oh je, das ist ja eine mittlere Katastrophe. :wall:
statt writeln (f,....) verwendest du den Dateinamen selbst, der muß in assign zugewiiesen werden an das f. Danach darf nur das f benutzt werden.

In den 5 analysierten Zeilen dürften mit Folgefehlern mind. 20 weitere auftauchen. :???: Na denn, viel Spaß. Ich empfehle dringend das Delphi-Handbuch. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz