![]() |
Hilfe bei Stringlist
Liste der Anhänge anzeigen (Anzahl: 1)
Hi
Foldender Code Importiert den Inhalt von Textdateien in eine SQL Datenbank. Der Code stammt von Duffy. Habe ihn nur etwas angepasst. Es funktionier auch alles. Allerdings hat sich nun der Aufbau der Textdatei um eine zusätliche Angabe erweitert. "Papier: xx". Ich habe mal die alte und neue Datei angehängt. Was muss ich jetzt im Code ändern, damit es wieder funktioniert :gruebel: In der SQL Tabelle habe eine weiter Spalte angelegt mit dem Namen "Format". Hier soll dann die Zahl hinein die hinter Papier steht. Hier mal ein stück von dem Code:
Delphi-Quellcode:
Kann mir da jemand bei helfen? procedure TForm1.ProcessFile(Filename: TFileName); var I: Integer; Importfile: TStrings; StrToken: TStrings; Batchnr: string; DateStr: string; Format: string; Creationdate: TDateTime; begin Importfile := TStringList.Create; StrToken := TStringList.Create; Importfile.LoadFromFile(Filename); // Damit das ganze uebersichtlicher wird, werden // alle Leerzeilen entfernt und Tabulatoren zu Space ' ' gewandelt for I := Importfile.Count - 1 downto 0 do begin Importfile.Strings[I] := ChangeChars(Importfile.Strings[I], #9, #32); if Trim(Importfile.Strings[I]) = '' then Importfile.Delete(I); end; // Batchnummer und Datum der Datei holen Batchnr := Trim(Copy(Importfile.Strings[0], Pos('Batch-Nr.', Importfile.Strings[0]) + 10, Pos('Datum:', Importfile.Strings[0]) - (Pos('Batch-Nr.', Importfile.Strings[0]) + 10))); DateStr := Trim(Copy(Importfile.Strings[0], Pos('Datum:', Importfile.Strings[0]) + 7, 10)); Format := Trim(Copy(Importfile.Strings[0], Pos('Papier:', Importfile.Strings[0]) + 8, 10)); Creationdate := StrToDate(DateStr); // Datei zeilenweise zerlegen for I := 3 to Importfile.Count - 1 do begin StringPickToPieces(Importfile.Strings[I], ' ', StrToken); gauge1.maxvalue := zquery.FieldCount; gauge1.Visible:= True; ZQuery.Insert; // Datei in Appendmodus setzen with ZQuery do begin // Daten aus dem Header FieldByName('datum').AsDateTime := Creationdate; FieldByName('batchnummer').AsString := Batchnr; // Hier kommen die Daten FieldByName('lfdnr').AsInteger := StrToInt(StrToken.Strings[0]); FieldByName('auftrags_nr').AsInteger := StrToInt(StrToken.Strings[1]); FieldByName('kunden_nr').AsInteger := StrToInt(StrToken.Strings[2]); FieldByName('anzahl_bilder').AsInteger := StrToInt(StrToken.Strings[3]); FieldByName('summe').AsInteger := StrToInt(StrToken.Strings[4]); FieldByName('type').AsString := StrToken.Strings[5]; FieldByName('uhrzeit').AsDateTime := StrToTime(StrToken.Strings[6]); gauge1.progress := gauge1.progress + 1; end; ZQuery.Post; // Satz schreiben end; gauge1.progress := 0; gauge1.Visible:= false; Importfile.Free; StrToken.Free; end; //-----------------------------------------------------------------------// //#######################################################################// //## Procedure Processing: ##// //#######################################################################// //## Datum: Änderung: ##// //## ====== ========= ##// //## 08.10.2003 Initial Release ##// //#######################################################################// procedure TForm1.Processing; var Files: TStrings; I, J: Integer; begin Busy := True; // jetzt sind wir ersteinmal beschäftigt StringMsgToFile('Das Ereignis wurde ausgelöst.'); Files := TStringList.Create; // Dateiliste kreieren // MySQL Tabelle öffnen ZQuery.Open; // Die zu importierenden Dateien verarbeiten; for I := 0 to ImportFiles.Count - 1 do begin SHMoveFile2(0, AddBackSlash(SourceDir) + ImportFiles.Strings[I], CacheDir); Files.Clear; Sleep(5000); GetFilesInDirectory(AddBackSlash(CacheDir), ImportFiles.Strings[I], Files, False); StringMsgToFile('Es wurden ' + IntToStr(Files.Count) + ' Dateien zum verarbeiten gefunden.'); for J := 0 to Files.Count - 1 do begin ProcessFile(Files.Strings[J]); end; SHMoveFile(0, AddBackSlash(CacheDir) + ImportFiles.Strings[I], DestinationDir); end; // MySql Tabelle schliessen ZQuery.Close; Files.Free; // Dateiliste freigeben StringMsgToFile('Das Ereignis wurde beendet.'); RunTime := GetNetxRunTime; // Nächste Laufzeit ermitteln Busy := False; // wir sind wieder für alles offen end; //-----------------------------------------------------------------------// //#######################################################################// //## Procedure StringPickToPieces: ##// //#######################################################################// //## Datum: Änderung: ##// //## ====== ========= ##// //## 08.10.2003 Initial Release ##// //#######################################################################// procedure TForm1.StringPickToPieces(Str: AnsiString; Separator: Char; Strings: TStrings); var TmpStr: string; begin try Strings.Clear; // Stringliste löschen while AnsiPos(Separator, Str) > 0 do // solange es noch einen Separator gibt begin TmpStr := Copy(Str, 1, AnsiPos(Separator, Str) - 1); if Trim(TmpStr) <> '' then Strings.Add(TmpStr); // Token in der Stringliste sichern Str := Copy(Str, AnsiPos(Separator, Str) + 1, Length(Str)); // String um das Token mit Separator kürzen end; if Trim(Str) <> '' then Strings.Add(Str); // und das letzte Token auch mitnehmen except // hier könnte auch noch was gemacht werden end; end; Gruß Celina |
Re: Hilfe bei Stringlist
Den Wert hinter "Papier" scheinst du ja schon in die Variable "Format" zu schreiben. Ich kenne mich mit der SQL-Komponente zwar nicht aus, doch wenn der Wert genauso wie bspw. "Batch-Nr.", oder "Datum" gespeichert werden soll, dann müsstest du unter
Delphi-Quellcode:
nur folgende Zeile ergänzen:
FieldByName('batchnummer').AsString := Batchnr;
Delphi-Quellcode:
.
FieldByName('format').AsInteger := StrToInt(Format);
Kannst es ja mal versuchen. MfG Pr0g |
Re: Hilfe bei Stringlist
Hi PrOg
Ja das ist auf jedenfall richtig. Aber hier...
Delphi-Quellcode:
muss auch noch was gemacht werden, das er den Wert überhaupt erst mal aus der Datei holt!?
// Batchnummer und Datum der Datei holen
Batchnr := Trim(Copy(Importfile.Strings[0], Pos('Batch-Nr.', Importfile.Strings[0]) + 10, Pos('Datum:', Importfile.Strings[0]) - (Pos('Batch-Nr.', Importfile.Strings[0]) + 10))); DateStr := Trim(Copy(Importfile.Strings[0], Pos('Datum:', Importfile.Strings[0]) + 7, 10)); Format := Trim(Copy(Importfile.Strings[0], Pos('Papier:', Importfile.Strings[0]) + 8, 10)); Creationdate := StrToDate(DateStr); Folgendes Funktioniert jedenfalls nicht. Das habe ich in den Code geschrieben, weil ich dachte das es so gehen müsste.
Delphi-Quellcode:
Gruß CelinaFormat := Trim(Copy(Importfile.Strings[0], Pos('Papier:', Importfile.Strings[0]) + 8, 10)); Creationdate := StrToDate(DateStr); |
Re: Hilfe bei Stringlist
Die Formatangabe, also die Zahl hinter "Papier" befindet sich eine Zeile unter den anderen Werten, hat also nich den Index "0", sondern "1". Der Code müsste also so aussehen:
Delphi-Quellcode:
Format := Trim(Copy(Importfile.Strings[1], Pos('Papier:', Importfile.Strings[1]) + 8, 10));
|
Re: Hilfe bei Stringlist
Hi PrOg
:shock: :oops: :oops: :oops: Klar, das ist die Lösung :mrgreen: :thuimb: Danke für deine Hilfe Gruß Celina :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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