AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 Daten -> durchlaufen und verarbeiten.

Ein Thema von xSkaschY · begonnen am 2. Jul 2006 · letzter Beitrag vom 2. Jul 2006
Antwort Antwort
xSkaschY

Registriert seit: 19. Jun 2006
Ort: Bünde
95 Beiträge
 
Delphi 2007 Professional
 
#1

2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 07:39
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: 2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 08:28
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
  Mit Zitat antworten Zitat
xSkaschY

Registriert seit: 19. Jun 2006
Ort: Bünde
95 Beiträge
 
Delphi 2007 Professional
 
#3

Re: 2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 08:43
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: 2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 09:25
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
  Mit Zitat antworten Zitat
xSkaschY

Registriert seit: 19. Jun 2006
Ort: Bünde
95 Beiträge
 
Delphi 2007 Professional
 
#5

Re: 2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 09:33
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]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: 2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 17:24
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
  Mit Zitat antworten Zitat
xSkaschY

Registriert seit: 19. Jun 2006
Ort: Bünde
95 Beiträge
 
Delphi 2007 Professional
 
#7

Re: 2 Daten -> durchlaufen und verarbeiten.

  Alt 2. Jul 2006, 18:57
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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