Re: @Profis - leidiges Problem mit Filtern Zeiträume in Zeitfenstern - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Montag, 7.April.2003, 09:39.
    Re: @Profis - leidiges Problem mit Filtern Zeiträume in Zeitfenstern

      so - nun ist dieses Prob auch gelöst!
      Vielleich interessiert es ja irgendjemand und er kann es weiterverwenden - die Arbeit soll ja nicht für die Katz sein ;-)
      Hier meine Variante zum Ausgeben von Zeiträumen in variablen Zeitfenstern mit Auswahl eines Teilkriteriums im get für bessere Laufzeit (zusätzlich gruppiert hier nach Orten (werden vorher aus DB-Feld Typ Option in Liste geschrieben) und sortiert nach Zeitpunkt des Beginns des Termines)
      Im get wird eine Teilmenge aller DS geholt, und zwar werden die DS geholt, die zum einen die Kriterien für den Ort der forech-Schleife und die resu_id erfüllen, zum anderen für möglicherweise übergebene weitere Suchkriterien (hier: spezieller Ort, Terminart, Veranstalter, Zeitraum für den Anzeige erfolgen soll - diese werden Standardmäßig, also wenn nicht gefiltert mit * im Template belegt für passt auf alles - sowie für das Anfangsdatum des Termines bis einschließlich dem Datum, das das Ende des ausgewählten (bzw. voreingestellten) Ausgabezeitfensters markiert:
      ---- schnipp
      $cnt_ges = 0 ;
      foreach(@l_ort)
      { my $akt_ort = $_;
        $anz_gruppe=<<EOF;
        <table width=100% align=center cellspacing=0 cellpadding=0>
         ${ \&_tz(1,5) }
         <tr><td class=dunkel><span class=mittelg><b> Veranstaltungen in $akt_ort:</b></span></td></tr>
         ${ \&_tz(1,5) }
      EOF
           # Filterwerte f. Datum für Vergleich formatieren, Workaround f. bp-Datumsvergleich einbauen ($fzeit_e1 auf letzte Minute vom Vergleichstag setzen)
           my $fzeit_a =substr(datum($fzeit_a, intern),0,10); my $fzeit_e1= datum("$fzeit_e,23:59", intern); my $fzeit_e = substr(datum($fzeit_e, intern),0,10);
            get "verans_ort==$_ resu_id==!$r verans_ort~=$fort verans_art~=$fkat k_veranstalter~=$fvst verans_datum<=$fzeit_e1 sort=verans_datum ", "$db1";
         $cnt_ds = 0;
          while(get_next("$db1"))
         {  my $datum1 = datum($verans_datum,intern); my $datum2 = datum($verans_datum2,intern);
         if ($datum2 le $datum1){
         $vstat = 0
         }elsif ($datum2 ge $datum1){
         $vstat = 1;
         }else{
         $vstat = "ungültig!"; # else-Zweig nur für Debugging, kann entfallen
         }
         if ( ($vstat == 0 && $datum1 ge $fzeit_a) || ($vstat == 1 && $datum2 ge $fzeit_a) )
           {
           $cnt_ds++;     # Datensatz-Zähler f. gef. Datensätze der Gruppe
            my $anz_datum = datum($verans_datum, "Wochentag, Tag.Monat.Jahr"); # Ausgabe f. Datum formatieren
            my $anz_datum2 = datum($verans_datum2, "Wochentag, Tag.Monat.Jahr");
            my $a_verans_datum2 = " <br> bis<br> $anz_datum2" if  datum($verans_datum2, "intern") ge datum($verans_datum, "intern");
            my $anz_zeit = datum($verans_datum, "Stunde:Minute")." Uhr";  # Ausgabe f. Zeit formatieren
            $verans_bild=~s/\s//; my $bild_breite = 120;
            my $anz_verans_bild ="<img src=/files/$verans_bild width=$bild_breite>" if $verans_bild ne "";
      
            $anz_ortstab.=<<EOF;            <table>
                 hier HTML-Code für jeden DS entsprechend Wunschlayout in Tabelle einbauen
                 </table> 
      EOF
            } #ende if datum
         }  #ende while get next
         if ($cnt_ds > 0)
            {# Gruppen-Überschrift mit Anker auf Ort und Link zum Seitenanfang am Ende der Gruppe - Zusammenstellg. aller Gruppenanzeigen zur Gesamtanzeige
            $anz_atab.= "<a name=$akt_ort> </a>$anz_gruppe<br>$anz_ortstab<table width=95% border=0 cellspacing=2 cellpadding=2><tr><td class=klein align=left><a href=#oben>Seitenanfang</a></td></tr></table>";
            # interne Links f. Seiten"kopf", damit Sprung zur Gruppe erfolgen kann
            $linkreihe.= " [ <a href=#$akt_ort>$akt_ort</a> ] ";
            }
            # Gruppenanzeige leeren, damit neue Gruppe im nächsten Schleifendurchlauf ausgegeben werden kann
         $anz_ortstab = "";    $cnt_ges = $cnt_ges + $cnt_ds; #Datensatzzähler f. ges. gef. Datens.
      }    #ende foreach ort
      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#
      
      -----schnapp
      Für Kritik und Hinweise bin ich natürlich wie immer dankbar, vielleicht gehts ja noch besser.....
      Ruben


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Sonntag, 6.April.2003, 15:54.
    @Profis - leidiges Problem mit Filtern Zeiträume in Zeitfenstern

      Hallo,
      das leidige und mehrjährige Problem mit der Filterung von Zeiträumen in ein variables Ausgabe-Zeitfenster beschäftigt mich eben wieder mal.
      Ich hab zwar unterdessen ne Lösung gefunden - die ist aber mehr als Ka...., wenn ne Menge Datensätze vorhanden sind, wird das so langsam wie ein Schweizer beim Schneckenfangen....
      Hat jemand vielleicht ne Idee oder gar ne Lösung wie man das innerhalb des gets machen könnte oder irgendwie anders, damit nicht immer alle DS durchlaufen werden sondern nur die betreffenden DS geholt werden?

      Nochmal kurz die Zielvorstellung:
      eine Termindatenbank hat sowohl eintägige als auch mehrtägige Termine abgespeichert - zwei Datumsfelder dazu - datBeginn und datEnde, sortiert .
      Bei der Eingabe neuer Termine wird bei eintägigen Terminen automatisch datEnde auf das Eingabedatum gesetzt (hab noch keine bessere Idee, wie man das Nutzerfreundlich in nem eigenen Formular anders machen könnte) und datBeginn muß eigegeben werden (JS-Check), bei mehrtägigen Terminen dann halt datBeginn und datEnde jeweils mit den Datumswerten.
      Nun soll die Ausgabe aber dann in variablen Zeitfensterrahmen erfolgen (aktuelle Woche, nächste Woche, aktueller Monat, nächster Monat, diese Jahr, nächstes Jahr) - Errechnung der Filterwerte ist klar und funzt.
      Die Filterwerte werden im Template aus den Übergabewerten errechnet, es gibt dafür jeweils fzeit_a und fzeit_e für Filterzeitraum_anfang und Filterzeitraum_ende als Datumswerte.
      Bei eintägigen Terminen ist die Filterung ja kein Thema, die Abfrage wäre dann wie folgt:
      --------------schnipp
      foreach(@l_ort)
      { get "verans_ort==$_ resu_id==!$r sort=-verans_datum verans_ort~=$fort verans_art~=$fkat k_veranstalter~=$fvst", "$db1";
        while(get_next("$db1")
         {                                           
          if (datum($verans_datum, "intern") ge datum($fzeit_a, "intern") && datum ($verans_datum, "intern") le datum($fzeit_e, "intern")) 
             { gib das Zeug aus ...
             }
         }
      }
      
      -------schnapp
      Ist zwar auch nicht optimal, da foreach - get - while(get_next), aber erst mal egal - diese Variante ist eh unterdessen unbrauchbar geworden.
      Nun aber mit den Zeiträumen im Zeitfenster:
      ------schnipp
      foreach(@l_ort)
      {  $fzeit_a = datum($fzeit_a, intern); $fzeit_e = datum($fzeit_e, intern);
         get "verans_ort==$_ resu_id==!$r verans_ort~=$fort verans_art~=$fkat k_veranstalter~=$fvst sort=-verans_datum ", "$db1";
         $cnt_ds = 0;
         while(get_next("$db1"))
         { my $datum1 = datum($datBeginn,intern); my $datum2 = datum($datEnde,intern); #Datum zum Vergleich wandeln
         my $vstat = $datum1 ge $datum2 ? $vstat = "eintag" : $vstat = "mehrtag"; #Status des Termins bestimmen
         if ( ($vstat eq "eintag" && $datum1 >= $fzeit_a && $datum1 le $fzeit_e) || ($vstat eq "mehrtag" && $datum2 ge $fzeit_a && $datum1 le $fzeit_e)  )
           {
           $cnt_ds++;     # Datensatz-Zähler f. gef. Datensätze
           gib das zeugs aus
           }
         }
      }
      
      ------schnapp
      Hab stundenlang im Forum und in der Bib gegrast, keine der bisherigen Postings bzw. Beispiele hat eine Lösung gebracht. Irgendwie hab ich in den letzten 2 Tagen versucht, das im get zu "erschlagen" wie das Sander mal vorgeschlagen hat, aber das geht nicht. Irgendwie kommt das get mit kombinierten und/oder Filtern nicht klar (na sagen wir mal ich mit dem get und den filterbedingungen *gg*)
      Vielleicht hat einer der Experten sowas mal hingekriegt - ich denke da an Sander oder auch an Harald Fehde - Christoph steht ja mit dem Datum selbst auch auf "kriegsfuss" ;-)
      Vielen Dank
      Ruben

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Montag, 7.April.2003, 09:39.
    Re: @Profis - leidiges Problem mit Filtern Zeiträume in Zeitfenstern

      so - nun ist dieses Prob auch gelöst!
      Vielleich interessiert es ja irgendjemand und er kann es weiterverwenden - die Arbeit soll ja nicht für die Katz sein ;-)
      Hier meine Variante zum Ausgeben von Zeiträumen in variablen Zeitfenstern mit Auswahl eines Teilkriteriums im get für bessere Laufzeit (zusätzlich gruppiert hier nach Orten (werden vorher aus DB-Feld Typ Option in Liste geschrieben) und sortiert nach Zeitpunkt des Beginns des Termines)
      Im get wird eine Teilmenge aller DS geholt, und zwar werden die DS geholt, die zum einen die Kriterien für den Ort der forech-Schleife und die resu_id erfüllen, zum anderen für möglicherweise übergebene weitere Suchkriterien (hier: spezieller Ort, Terminart, Veranstalter, Zeitraum für den Anzeige erfolgen soll - diese werden Standardmäßig, also wenn nicht gefiltert mit * im Template belegt für passt auf alles - sowie für das Anfangsdatum des Termines bis einschließlich dem Datum, das das Ende des ausgewählten (bzw. voreingestellten) Ausgabezeitfensters markiert:
      ---- schnipp
      $cnt_ges = 0 ;
      foreach(@l_ort)
      { my $akt_ort = $_;
        $anz_gruppe=<<EOF;
        <table width=100% align=center cellspacing=0 cellpadding=0>
         ${ \&_tz(1,5) }
         <tr><td class=dunkel><span class=mittelg><b> Veranstaltungen in $akt_ort:</b></span></td></tr>
         ${ \&_tz(1,5) }
      EOF
           # Filterwerte f. Datum für Vergleich formatieren, Workaround f. bp-Datumsvergleich einbauen ($fzeit_e1 auf letzte Minute vom Vergleichstag setzen)
           my $fzeit_a =substr(datum($fzeit_a, intern),0,10); my $fzeit_e1= datum("$fzeit_e,23:59", intern); my $fzeit_e = substr(datum($fzeit_e, intern),0,10);
            get "verans_ort==$_ resu_id==!$r verans_ort~=$fort verans_art~=$fkat k_veranstalter~=$fvst verans_datum<=$fzeit_e1 sort=verans_datum ", "$db1";
         $cnt_ds = 0;
          while(get_next("$db1"))
         {  my $datum1 = datum($verans_datum,intern); my $datum2 = datum($verans_datum2,intern);
         if ($datum2 le $datum1){
         $vstat = 0
         }elsif ($datum2 ge $datum1){
         $vstat = 1;
         }else{
         $vstat = "ungültig!"; # else-Zweig nur für Debugging, kann entfallen
         }
         if ( ($vstat == 0 && $datum1 ge $fzeit_a) || ($vstat == 1 && $datum2 ge $fzeit_a) )
           {
           $cnt_ds++;     # Datensatz-Zähler f. gef. Datensätze der Gruppe
            my $anz_datum = datum($verans_datum, "Wochentag, Tag.Monat.Jahr"); # Ausgabe f. Datum formatieren
            my $anz_datum2 = datum($verans_datum2, "Wochentag, Tag.Monat.Jahr");
            my $a_verans_datum2 = " <br> bis<br> $anz_datum2" if  datum($verans_datum2, "intern") ge datum($verans_datum, "intern");
            my $anz_zeit = datum($verans_datum, "Stunde:Minute")." Uhr";  # Ausgabe f. Zeit formatieren
            $verans_bild=~s/\s//; my $bild_breite = 120;
            my $anz_verans_bild ="<img src=/files/$verans_bild width=$bild_breite>" if $verans_bild ne "";
      
            $anz_ortstab.=<<EOF;            <table>
                 hier HTML-Code für jeden DS entsprechend Wunschlayout in Tabelle einbauen
                 </table> 
      EOF
            } #ende if datum
         }  #ende while get next
         if ($cnt_ds > 0)
            {# Gruppen-Überschrift mit Anker auf Ort und Link zum Seitenanfang am Ende der Gruppe - Zusammenstellg. aller Gruppenanzeigen zur Gesamtanzeige
            $anz_atab.= "<a name=$akt_ort> </a>$anz_gruppe<br>$anz_ortstab<table width=95% border=0 cellspacing=2 cellpadding=2><tr><td class=klein align=left><a href=#oben>Seitenanfang</a></td></tr></table>";
            # interne Links f. Seiten"kopf", damit Sprung zur Gruppe erfolgen kann
            $linkreihe.= " [ <a href=#$akt_ort>$akt_ort</a> ] ";
            }
            # Gruppenanzeige leeren, damit neue Gruppe im nächsten Schleifendurchlauf ausgegeben werden kann
         $anz_ortstab = "";    $cnt_ges = $cnt_ges + $cnt_ds; #Datensatzzähler f. ges. gef. Datens.
      }    #ende foreach ort
      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#
      
      -----schnapp
      Für Kritik und Hinweise bin ich natürlich wie immer dankbar, vielleicht gehts ja noch besser.....
      Ruben

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Montag, 7.April.2003, 19:10.
    Re: Filtern Zeiträume in Zeitfenstern - in die bib! ;-)

      Rein damit in die bib ;-) Du könntest wahrscheinlich inzwischen ne kleine Toolsammlung mit allerlei Problemen & Lösungen rund ums Datum zusammenstellen, oder? ;-)

     Antworten


     
 Liste der Einträge von 39001 bis 39151:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.06s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!