Jemand ein Vorschlag für temporäres Abspeichern von Daten?



  • Hallo Alle zusammen,

    ich würde gerne wissen, ob Ihr einen besseren Vorschlag für mich habt, als ich bis jetzt den angedacht habe, jedoch gefällt er mir nicht so gut, weil eben die Ladezeiten viel zu lange sind.

    Also, in meiner Anwendung habe ich eine Tabelle mit Adress-Daten von Kunden samt Geburtstagdaten. Jetzt würde ich gerne in meiner Anwendung die Geburtsdaten der Kunden in einem Grid anzeigen lassen, jedoch auch mit der Möglichkeit die Daten zu filtern zu können, also alle Daten, in 4, 2, 1 Woche und heute, die Geburtstag haben...

    Das habe ich bisjetzt so gemacht, dass ich die Daten aus der Adressen-Tabelle rauslese und in eine separate Tabelle schreibe, nach jederAuswahl, wird die Adressen-Tabellen wieder neu ausgelesen und die gefilterten Daten werden in die Tabelle geschrieben. Diese Tabelle zeige ich wiederrum über den DB-Grid an.
    Das ganze ist jedoch ziemlich langsam, so dass ich jedes mal für ne Berechnung bis zu einer Minute bräuchte, das ist zuviel...

    ...gibt es auch einen anderen Weg?

    Danke schonmal im Vorraus...

    Gruss,
    chullain



  • Hallo

    bei deiner Beschreibung vermute ich, das du eine Paradox-Datenbank benutzt.
    Dann sehe ich nicht wo du Probleme mit dieser Filterung hast, denn genau dafür ist doch TQuery und SQL da, und die Zugriffszeiten sind selbst bei Hunderten Datensätzen nicht merkbar. Eine Zwischendatei brauchst du aber auf keinen Fall.

    Wenn du keine dedizierte Datenbank verwendest, sondern ein eigenes Dateiformat, ist es jetzt Zeit auf eine SQL-Datenbank umzusteigen, und dann gleich auf Firebird embedded o.ä.

    bis bald
    akari



  • ja, das stimmt Akari, ich benutze ne Paradox-Datenbank, hast mir schon öfters ausgeholfen, und ich bin immer noch an der gleichen Anwendung dran 🙄

    ok, wenn das schnell gehen soll, warum habe ich dann so langsame Ladezeiten, ich hab noch ein Prozessbalken in der Anwendung, und bei jedem Schreibvorgang auf die Tabelle, bewegt sich der Balken, und das geht so langsam, wie gesagt, fast ne Minute, und das sind keine 100 DS...

    ...v. liegts ja an einem Laptop, ist noch ein p4 desktop drin mit 256MB... 😞

    Gruss,
    chullain



  • Hallo

    dann zeig doch mal, wie du deine Datensätze zusammenstellst. So wie du es beschreibst, bestimmt nicht mit einer SQL-Anweisung.

    bis bald
    akari



  • klar, gerne, nur vorsichtig, ist nicht wenig... 🙂

    { Word Jahr_h, Monat_h, Tag_h;   // heutiges Datum
      Word Jahr_d,Monat_d, Tag_d;    // ausgewähltes Datum heute + Puffer
      Word Jahr,Monat, Tag;          // Geburtstagsdatum
      int Nr,Nr_h, Nr_d,i;             // Anzahl der Tage ((Monat*30) + Tag)
      int KundenNr,Alter;
      TDateTime dtPresent = Now();  // aktuelles Datum
      DecodeDate(dtPresent, Jahr_h, Monat_h, Tag_h);
    ...
      ProgressBar_Geb->Visible = true;
    
      ProgressBar_Geb->Position = 0;
      ProgressBar_Geb->Min = 0;
      i = 0;
      ProgressBar_Geb->Max = DataModule1->tAdress->RecordCount;
      FAdress->Refresh();
    
        if (FAdress->RB_heute->Checked)
          {TDateTime dtPresent = Now();  // aktuelles Datum
           DecodeDate(dtPresent, Jahr_d, Monat_d, Tag_d);
          }
        if (FAdress->RB_Woche1->Checked)
          {TDateTime dtPresent = Date()+7;  // Heutiges Datum plus puffer
           DecodeDate(dtPresent, Jahr_d, Monat_d, Tag_d);
          }
        if (FAdress->RB_Woche2->Checked)
          {TDateTime dtPresent = Date()+14;  // Heutiges Datum plus puffer
           DecodeDate(dtPresent, Jahr_d, Monat_d, Tag_d);
          }
        if (FAdress->RB_Woche4->Checked)
          {TDateTime dtPresent = Date()+30;  // Heutiges Datum plus puffer
           DecodeDate(dtPresent, Jahr_d, Monat_d, Tag_d);
          }
        if (FAdress->RB_alle->Checked)
          {Jahr_d  = 0;  // alles Anzeigen
           Monat_d = 0;
           Tag_d   = 0;
          }
        while (DataModule1->tGeb_temp->RecordCount!=0){ DataModule1->tGeb_temp->Delete();}
        KundenNr = DataModule1->tAdress->FieldByName("Kunden_Nr")->AsInteger;
      //  ShowMessage(IntToStr(KundenNr));
        DataModule1->tAdress->First();
        while (!DataModule1->tAdress->Eof)
          // Nur Daten eintragen die ein Geburtsdatum haben !!
         {// ShowMessage(DataModule1->tAdress->FieldByName("Kunden_Nr")->AsInteger);
          i = i+1;
          ProgressBar_Geb->Position = i;
    
          if(DataModule1->tAdress->FieldByName("Geburtsdatum")->AsString != "")
           {dtPresent = DataModule1->tAdress->FieldByName("Geburtsdatum")->AsDateTime;
            DecodeDate(dtPresent, Jahr, Monat, Tag);
      // Berechnung des Alters
            Alter = Jahr_h - Jahr;
            if (Monat >= Monat_h)
              {if (Monat == Monat_h)
                {if (Tag_h < Tag)
                  {Alter = Alter -1;
                  }
                }
               else
                {Alter = Alter -1;
                }
              }
            if (Monat_h == Monat_d)
            {if ((Monat >= Monat_h && Monat <= Monat_d)&&(Tag >= Tag_h && Tag <= Tag_d))
              {DataModule1->tGeb_temp->Insert();
               DataModule1->tGeb_temp->FieldByName("Kunden_Nr")->AsInteger  = DataModule1->tAdress->FieldByName("Kunden_Nr")->AsInteger;
               DataModule1->tGeb_temp->FieldByName("Name")->AsString  = DataModule1->tAdress->FieldByName("Name")->AsString;
               DataModule1->tGeb_temp->FieldByName("Vorname")->AsString  = DataModule1->tAdress->FieldByName("Vorname")->AsString;
               DataModule1->tGeb_temp->FieldByName("Telefon_P")->AsString  = DataModule1->tAdress->FieldByName("Telefon_P")->AsString;
               DataModule1->tGeb_temp->FieldByName("Telefon_G")->AsString  = DataModule1->tAdress->FieldByName("Telefon_G")->AsString;
               DataModule1->tGeb_temp->FieldByName("Telefon_M")->AsString  = DataModule1->tAdress->FieldByName("Telefon_M")->AsString;
               DataModule1->tGeb_temp->FieldByName("Geburtsdatum")->AsString  = DataModule1->tAdress->FieldByName("Geburtsdatum")->AsString;
               DataModule1->tGeb_temp->FieldByName("Alter")->AsInteger = Alter;
               DataModule1->tGeb_temp->Post();
              }
            }
            else
            {Nr = ((Monat*30)+Tag);
             Nr_d = ((Monat_d*30)+Tag_d);
             Nr_h = ((Monat_h*30)+Tag_h);
             if ((Nr >= Nr_h && Nr <= Nr_d )|| (Monat_d == 0))
              {DataModule1->tGeb_temp->Insert();
               DataModule1->tGeb_temp->FieldByName("Kunden_Nr")->AsInteger  = DataModule1->tAdress->FieldByName("Kunden_Nr")->AsInteger;
               DataModule1->tGeb_temp->FieldByName("Name")->AsString  = DataModule1->tAdress->FieldByName("Name")->AsString;
               DataModule1->tGeb_temp->FieldByName("Vorname")->AsString  = DataModule1->tAdress->FieldByName("Vorname")->AsString;
               DataModule1->tGeb_temp->FieldByName("Telefon_P")->AsString  = DataModule1->tAdress->FieldByName("Telefon_P")->AsString;
               DataModule1->tGeb_temp->FieldByName("Telefon_G")->AsString  = DataModule1->tAdress->FieldByName("Telefon_G")->AsString;
               DataModule1->tGeb_temp->FieldByName("Telefon_M")->AsString  = DataModule1->tAdress->FieldByName("Telefon_M")->AsString;
               DataModule1->tGeb_temp->FieldByName("Geburtsdatum")->AsString  = DataModule1->tAdress->FieldByName("Geburtsdatum")->AsString;
               DataModule1->tGeb_temp->FieldByName("Alter")->AsInteger = Alter;
               DataModule1->tGeb_temp->Post();
              }
            }
           }
    

    Gruss,
    chullain



  • Hallo

    Ja du suchst deine Datensätzte manuell zusammen, da brauchst du dich nicht über die mangelnde Performance zu beschweren.

    Du solltest unbedingt auf TQuery und SQL umsteigen.
    Dazu gibt es auch ein paar Beispiele von Borland unter <BCB-Path>/Examples/DBTasks

    Wenn du genau beschreibst was wie gefiltert werden soll, helfen wir dir auch beim Zusammenstellen des/der SQL-String(s).

    bis bald
    akari



  • Danke erstmal, komme gerne auf Deinen Vorschlag zurück, bin im Moment noch an ne anderen Baustelle dran, aber ich meld mich 😉


Anmelden zum Antworten