![]() |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Ich gehe mal davon aus, dass das Füllen der Tabellen nicht im Mehrbenutzerbetrieb stattfindet. Unter dieser Randbedingung würde ich die drei Lookup-Tabellen in jeweils einer sortierten StringList komplett zwischenspeichern.
Delphi-Quellcode:
marabu
var
slPlz: TStringList; begin slPlz := TStringList.Create; with slPlz do begin Sorted := true; Duplicates := dupIgnore; end; slPlz.Values['74072'] := '1'; slPlz.Values['60325'] := '2'; ShowMessage(slPlz.Values['74072']); end; |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Zitat:
Aus der CSV-datei erhälst du die Klartexte, damit meine ich z.b. sie Straße, und nicht die ID, welche du in die zuerstellende Tabelle einfügen willst. Deshalb mußt du ja eine Abfrage mache, welche dir die dazugehörige ID liefert. Am besten macht man das mit einer parametrisierten Abfrage. Dies ist eine Abfrage welche einen/mehrere Parameter enthält, welche(n) Wert(e) man später leicht verändern kann ohen die Abfrage neu formullieren zu müssen.
SQL-Code:
Den Paramter PLZ ( Im Querystring durch das vorangestellte : gesetzt) kannst su in der Schleife dann mit verändern.
z.B. SELECT PLZ_ID from Tab1 where PLZ = :PLZ;
Delphi-Quellcode:
Oder Lösung von marabu verwenden
AdoQuery.Parameters.ParamByName('PLZ').Value := 'Hauptstraße';
|
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Nein ich hatte vor gut einem jahr angefangen und war schon recht weit mit db-proggen. dann der cut und alles ist weg. ich sitze hier in meinem homeoffice umgeben von massen papier aus denen ich mir schnipsel heraussuchen muss oder darf - wie man es nimmt. ich kann programmieren - theoretisch. ich bin in der lage paps und struktugramme zu lesen und diese in einer sprache - wenn ich sie denn kann - umsetzen.
das deprimierende an der sache ist, daß ich euch verstehe nur nicht weiß wie ich und wo ich das einsetzen muss. das beispiel von marabu scheint so zu funktionieren. Berichtigt mich bitte wenn ich falsch liege: 1. nachdem ich - wie bisher meine datei in die Stringliste eingelesen habe, sortiere ich sie nach PLZ? oder sortiere ich sie gleich von vorn herein danach? 2. anschließend ignoriere ich die duplicate? 3. und ich übergebe den PLZ eindeutige ID's? was ich an dem schnipsel wieder nicht verstehe ist die klartextausgabe (wenn ich das richtig lese) und wie ich es an meinem code anwende, der im grunde von marabu übernommen wurde...??? mir platzt der schädel. ;o/ |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Zitat:
Du willst also die Tab1,Tab2 usw. auch durch die Werte der CSV-Datei aufbauen. Dann ist es am besten nach dem aktuellen Wert zu suchen (ob in der Datenbank oder einer Stringliste im Speicher ) wenn gefunden diese ID verwenden, sonst neuen Eintrag erzeugen. Zitat:
|
Re: CSV --> Stringlist --> Stringlist zerlegen -->
oki, ich bastel da mal was. mal sehen wie weit mich das bringt. ;o)
also mir ist es gelungen die daten des StringLists in eine tabelle zu schreiben. jedoch muss ich ja 4 anfassen. wenn ich mir das aber zusammenklicke, dann kann ich nur eine tabelle der db pro dbgrid anfassen. wie war es nochmal möglich in einem dbgrid mehrere tabellen zusammen anzuzeigen und diese dann zu bestücken oder im hintergrund diese gesondert anzusprechen? Mein Hintergrund: ich muss ja die DB ansprechen. das funzt. aber ich muss doch bitte nicht für jede tabelle eine neue ADOTable machen! Ich muss ja mit einem SQL-Statement in 4 verschiedene Tabellen schreiben... |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Ich würde nicht mit ADOTable sondern für jede Tabelle ein ADOQuery für das SELECT und eine für den INSERT erstellen, oder wenn natürlich Stringlisten verwenden.
Ich würde nicht über ein Grid auf die Daten zugreifen, sondern direkt auf die DataSet-Kompoenente (ADOTable,ADOQuery usw). Wenn du nicht weiterkommst kannst du ja mal deine Projekt hier einstellen. |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Delphi-Quellcode:
for i := 0 to SL.Count-1 do // ?
ADOQuery1. // ADOTable1.Fields[I].AsString := SL.Strings[i]; //? // ADOTable1.Post; // ? end; Okay. ich streich gleich die segel... Wie mache ich meinem Script an dieser stelle klar, welche SL.Strings[i] er in welche Tabelle in welches Feld zu schreiben hat? Das schlimme ist ja, ich müsste dann auch noch vergleiche anstellen. |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Poste mal den ganzen Source, ich habe so das Gefühl wir reden aneinander vorbei ;-)
|
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Okay, ist aber noch mächtig baustelle hier. Ich weiß nicht wo ich genau ansetzen soll. Also nicht wundern.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ActnList, ActnMan, ToolWin, ActnCtrls, ActnMenus, StdCtrls, Grids, DBGrids, DB, ADODB; type TForm1 = class(TForm) ActionMainMenuBar1: TActionMainMenuBar; ActionManager1: TActionManager; StrassenverzNeu: TAction; OpenDialog1: TOpenDialog; Memo2: TMemo; Edit1: TEdit; ADOQuery1: TADOQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; StringGrid1: TStringGrid; procedure StrassenverzNeuExecute(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.StrassenverzNeuExecute(Sender: TObject); var SL: TStringList; SG: TStringGrid; i: Integer; T: Textfile; SInString: String; begin if (OpenDialog1.Execute) then begin SL := TStringList.Create; // Objekt erzeugen try AssignFile(T,OpenDialog1.FileName); // öffnet die Datei Reset(T); Readln(T, SInString); // Erste Zeile laden // kann später gelöscht werden SInString := StringReplace(SInString, // Ersetze ' ' mit '~~' ' ', '~~', [rfReplaceAll, rfIgnoreCase]); SL.Delimiter := ';'; // Festlegung des Trennzeichens SL.DelimitedText := SInString; // Inhalt der Zeile Schreiben SL.Text := StringReplace(Sl.text, // Ersetze '~~' mit ' ' '~~', ' ', [rfReplaceAll, rfIgnoreCase]); Memo2.Lines.Clear; // Löscht das Memo2 Memo2.Text := SL.Text; // Zeigt erste Zeile in Memo2 // bis hier hin while (not Eof(T)) do begin // solange nicht EOF erreicht ReadLn(T,SInString); // lies die nächste Zeile SInString := StringReplace(SInString, // Ersetze ' ' mit '~~' ' ', '~~', [rfReplaceAll, rfIgnoreCase]); SL.Delimiter := ';'; // Festlegung des Trennzeichens SL.DelimitedText := SInString; // Inhalt der Zeile Schreiben SL.Text := StringReplace(Sl.text, // Ersetze '~~' mit ' ' '~~', ' ', [rfReplaceAll, rfIgnoreCase]); // kann später gelöscht werden Memo2.Lines.AddStrings(SL); // Listet die Felder in Memo2 //******* Tabelle ansprechen ********* // ADOTable1.TableName:='StrVerzeichnis'; // ADOTable1.Active:=true; // ADOTable1.Append; // ? // bis hier hin for i := 0 to SL.Count-1 do // ? ADOQuery1.Insert; ADOQuery1.SQL.Text:='INSERT // ADOTable1.Fields[I].AsString := SL.Strings[i]; //? // ADOTable1.Post; // ? end; finally i := SL.Count; ShowMessage(IntToStr(i)); SL.Free; // Objekt schließen end; end; CloseFile(T); // Datei schließen end; procedure TForm1.FormCreate(Sender: TObject); begin end; end. wenn ich nur mit ADOTable arbeite löft es nur werden die daten dann nicht dahin verschoben wo sie sollen, denn es ist ja nur eine Tabelle. Aber mit ADOQuery komm ich gar nicht klar... |
Re: CSV --> Stringlist --> Stringlist zerlegen -->
Also wenn du unbedingt alles über eine AdoTable arbeiten willst( wie gesagt parametrisierte Queries wären besser) dann mußt du mit Filtern arbeiten.
Schleife über die Felder entfernen.
Delphi-Quellcode:
oder in der IDE setzten : Erzeugt einen param. Query
ADOQuery1.Sql.Text := 'insert into PLZ, Straße, vonHausnr, vonHausnr_zusatz, bisHausnr, bisHausnr-zusatz, GU, Tour) values( :plz, ;str, ;von, ;von_zu, :bis, :bis_zu, :gu ,tour)';
Delphi-Quellcode:
ADOTable1.TableName:='PlzVerzeichnis';
ADOTable1.Filter='plz='''+ SL.Strings[0]+'''; ADOTable1.Filtered := true; ADOTable1.Open; AdoQuery1.Parameters.ParamByName('plz').value := AdoTable1.FieldByName('plzid').value; ADOTable1.TableName:='StrVerzeichnis'; ADOTable1.Filter='strasse='''+ SL.Strings[1]+'''; ADOTable1.Filtered := true; ADOTable1.Open; AdoQuery1.Parameters.ParamByName('str').value := := AdoTable1.FieldByName('plzid').value; //usw. für weitere Felder AdoQuery1.ExecSql; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 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