Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2 Daten -> durchlaufen und verarbeiten. (https://www.delphipraxis.net/72517-2-daten-durchlaufen-und-verarbeiten.html)

xSkaschY 2. Jul 2006 06:39


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:
Tage := DaysBetween(StartDateTimePicker.Date, StopDateTimePicker.Date);
Showmessage(IntToStr(Tage));

for i := 0 to <whatever> do begin
   // Datum von start bis ende
end;
Doch wie kann ich es nun in meiner for / while - Schleife durchlaufen, dass ich das durch die Datenbankabfrage quetschen kann?


Bis dahin!

King regards
Toby

marabu 2. Jul 2006 07:28

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:
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;
Getippt und nicht getestet.

Grüße vom marabu

xSkaschY 2. Jul 2006 07:43

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:
for ....... begin
  statement := 'SELECT `mycolumns..` FROM `table'+currentdate+'` ' + extwhere;

  // Ab ins StringGrid
end;
Hoffe es ist nun verständlich genug!

Grüsse Toby

marabu 2. Jul 2006 08:25

Re: 2 Daten -> durchlaufen und verarbeiten.
 
Zitat:

Zitat von xSkaschY
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.

Du solltest alle Daten in der selben Datenbanktabelle speichern. Es gibt keinen Grund, warum das im Chaos enden sollte. Die übergreifende Suche funktioniert dann nach dem von mir gezeigten Muster.

marabu

xSkaschY 2. Jul 2006 08:33

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]

marabu 2. Jul 2006 16:24

Re: 2 Daten -> durchlaufen und verarbeiten.
 
Okay - die Tabellennamen in deiner Schleife kannst du beispielsweise so bilden:

Delphi-Quellcode:
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;
marabu

xSkaschY 2. Jul 2006 17:57

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:
for i := Trunc(StartDateTimePicker.Date) to Trunc(StopDateTimePicker.Date) do
begin
  tn := 'table_' + FormatDateTime('dd_mm_yy', i);
  showmessage(tn);
end;
Dürfte etwas schneller sein :)

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 00:56 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