![]() |
2 Daten -> durchlaufen und verarbeiten.
Guten Morgen alle mit einander.
Vorhaben: Ich arbeite zur Zeit an einer Import Schnittstelle für Excel -> MySQL/MSSQL/Postgree Jedoch möchte ich auch die importierten Datensätze durchsuchen. Eine Funktion wo ich gerade nicht weiter weiss, ist die Durchsuchung zwischen 2 Daten. Situation: Ich habe für alle Datensätze, sprich *.xls's, seperat eine Tabelle angelegt welche den Tabellennamen "table_<dd_mm_yyyy>" erhalten. Dan benutze ich für die Such-FKT. 2x TDateTimePicker, 1x Start Datum & 1x End Datum. Brainstorming Fakt ist, ich hab das Start und Datum, mit dem ich mir schon via Daysbetween(); die Anzahl der Tage zwischen den Daten herraus gefischt hab.
Delphi-Quellcode:
Doch wie kann ich es nun in meiner for / while - Schleife durchlaufen, dass ich das durch die Datenbankabfrage quetschen kann?
Tage := DaysBetween(StartDateTimePicker.Date, StopDateTimePicker.Date);
Showmessage(IntToStr(Tage)); for i := 0 to <whatever> do begin // Datum von start bis ende end; Bis dahin! King regards Toby |
Re: 2 Daten -> durchlaufen und verarbeiten.
Guten Morgen, Toby.
Wenn ich dich richtig verstehe, dann schreibst du ein Programm, welches (spezielle, gleichförmige) Excel-Dateien liest und deren Inhalte in einer relationalen Datenbank speichert. In den gespeicherten Daten möchtest du solche Zeilen finden, bei denen eine bestimmte Spalte (mit einem Datumswert) in ein bestimmtes Intervall fällt. Mit SQL kannst du eine solche Abfrage prinzipiell so vornehmen:
Delphi-Quellcode:
Getippt und nicht getestet.
const
FMT_SELECT = 'SELECT * FROM %s WHERE datum BETWEEN :start AND :stop' ; begin with Query do begin SQL.Text := Format(FMT_SELECT, tableName); Parameters.ParamByName('start').AsDateTime := dtpStart.Date; Parameters.ParamByName('stop').AsDateTime := dtpStop.Date; ExecSQL; end; end; Grüße vom marabu |
Re: 2 Daten -> durchlaufen und verarbeiten.
Hallo marabu,
So funktioniert das leider nicht. Also nochmal von vorne, - kaffee hol -. Ich habe eine Exceldatei, welche alle Auftrage der jeweiligen Telekommunikationsmontuere ausgefüllt wird und am Ende des Tages vom jeweiligen IT-Spezi in die Datenbank eingepflegt werden soll. Bei diesem Importvorgang wird automatisch eine neue Tabelle in der Datenbank erstellt, welche den Namen "table_<dd_mm_yy>" bekommt. (<dd_mm_yy> für das "heutige" Datum.) Demnach habe ich nun in der Datenbank folgende Tabellen, table_01_07_06 table_02_07_06 table_03_07_06 Der Grund warum ich solch eine Struktur gewählt habe dürfte klar sein, bei ~500 Aufträge pro Exceldatei / Tag, könnte es leicht im Chaos enden wenn ich alle Datensätze in eine Tabelle speicher. Zumal die Datensätze nach 30 Tagen wieder gelöscht werden. Fakt ist nun, das ich die einzellnen Tabellen durch suchen muss. Zeitlich gesehen ist es egal wenn die Datensätze zusammen gesucht sind, da die Leute im Büro eh Zeit haben. Und das ehrlich gesagt auch nicht so wichtig ist. Hauptsache die Daten sind drin! Und das läuft schon. :) Um es noch verständlicher zumachen:
Delphi-Quellcode:
Hoffe es ist nun verständlich genug!
for ....... begin
statement := 'SELECT `mycolumns..` FROM `table'+currentdate+'` ' + extwhere; // Ab ins StringGrid end; Grüsse Toby |
Re: 2 Daten -> durchlaufen und verarbeiten.
Zitat:
marabu |
Re: 2 Daten -> durchlaufen und verarbeiten.
So möchte ich es aber nicht machen!
Weil die Excel-Tabelle auch mal aktualisiert wird (mehr mals am Tag). Dann müsste ich erst alle daten Überprüfen, die richtigen mit einem UPDATE versorgen usw. viel zu aufwändig für sowas. [offtopic] Wieso heut mir die TSQLQuery Kompi, bei Query.Open eine Access Violation rein und bei Query.Execsql; nicht? [/offtopic] |
Re: 2 Daten -> durchlaufen und verarbeiten.
Okay - die Tabellennamen in deiner Schleife kannst du beispielsweise so bilden:
Delphi-Quellcode:
marabu
var
i: Integer; y, m, d: Word; begin for i := Trunc(dtpStart.Date) to Trunc(dtpStop.Date) do begin DecodeDate(i, y, m, d); tn := Format('tabelle_%.4d_%.2d_%.2d', [y, m, d]); ShowMessage(tn); end; end; |
Re: 2 Daten -> durchlaufen und verarbeiten.
Danke ! genau soetwas habe ich gesucht.
Wenn ich 2 Daten in einer Schleife benutze, werden diese automatisch immer um 1 Tag pro durchlauf erhöht, oder wie sehe ich das? By the way:
Delphi-Quellcode:
Dürfte etwas schneller sein :)
for i := Trunc(StartDateTimePicker.Date) to Trunc(StopDateTimePicker.Date) do
begin tn := 'table_' + FormatDateTime('dd_mm_yy', i); showmessage(tn); end; Soo.. nun meine Procedure.... Wie könnte ich Sie übersichtlicher gestalten?
Delphi-Quellcode:
procedure TformSuchmaske.searchItems(Sender: TObject);
var i, k, count: integer; statement, currenttable: string; extwhere, tn: String; y: Integer; status: boolean; begin count:= 0; loading.Position := 0; grid_result.Visible := False; label_result.Visible := False; grid_result.Margins.Top := 47; loading.Visible := True; label_loaddata.Visible := True; label_loaddata.Caption := 'Lade Daten...'; try grid_result.RowCount := 2; grid_result.FixedRows := 1; grid_result.Cells[0,0] := 'Auftragsnummer'; grid_result.Cells[1,0] := 'MontuerID'; grid_result.Cells[2,0] := 'Montuer'; grid_result.Cells[3,0] := 'AKI'; grid_result.Cells[4,0] := 'ONKZ'; grid_result.Cells[5,0] := 'ASB'; grid_result.Cells[6,0] := 'Rufnummer'; grid_result.Cells[7,0] := 'Strass / Standort'; grid_result.Cells[8,0] := 'LSZ'; grid_result.Cells[9,0] := 'LSZZ'; grid_result.Cells[10,0] := 'KU-Zeit'; if MySQLConnection.Connected then begin MySQLQuery.SQL.Clear; MySQLQuery.SQLConnection := MySQLConnection; extwhere := ' WHERE `' + searchby.Text + '` LIKE ''%' + value_searchby.Text + '%'''; k := 1; for i := Trunc(StartDateTimePicker.Date) to Trunc(StopDateTimePicker.Date) do begin Application.ProcessMessages; for y := 0 to value_table.Count - 1 do begin currenttable := value_table.Items[y]; tn := 'table_' + FormatDateTime('dd_mm_yy', i); if currenttable = tn then begin status := true; end else status := false; if status then begin statement := 'SELECT `auftragsnr`, `montuerid`, `montuer`, `aki`, `onkz`, `asb`, `rufnr`, `strstandort`, `lsz`, `lszz`, `kuzeit` FROM `'+tn+'` ' + extwhere; count := count + mysql_num_rows(statement); loading.Max := count; MySQLQuery.SQL.Clear; MySQLQuery.SQL.Add(statement); MySQLQuery.Open; while not MySQLQuery.EOF do begin grid_result.Cells[0,k] := MySQLQuery.FieldByName('auftragsnr').AsString; grid_result.Cells[1,k] := MySQLQuery.FieldByName('montuerid').AsString; grid_result.Cells[2,k] := MySQLQuery.FieldByName('montuer').AsString; grid_result.Cells[3,k] := MySQLQuery.FieldByName('aki').AsString; grid_result.Cells[4,k] := MySQLQuery.FieldByName('onkz').AsString; grid_result.Cells[5,k] := MySQLQuery.FieldByName('asb').AsString; grid_result.Cells[6,k] := MySQLQuery.FieldByName('rufnr').AsString; grid_result.Cells[7,k] := MySQLQuery.FieldByName('strstandort').AsString; grid_result.Cells[8,k] := MySQLQuery.FieldByName('lsz').AsString; grid_result.Cells[9,k] := MySQLQuery.FieldByName('lszz').AsString; grid_result.Cells[10,k] := MySQLQuery.FieldByName('kuzeit').AsString; k := k + 1; MySQLQuery.Next; loading.Position := k; Application.ProcessMessages; end; end; end; end; grid_result.RowCount := k; MySQLQuery.Close; end else begin showmessage('Es besteht keine Verbindung zur Datenbank, bitte überprüfen Sie Ihre Einstellungen...'); end; finally label_loaddata.Caption := 'Es wurden ' + IntToStr(count) + ' Datensätze gefunden'; label_result.Visible := True; grid_result.Margins.Top := 70; grid_result.Visible := True; loading.Visible := False; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 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