[NEWSboard IBMi Forum]

Threaded View

  1. #15
    Registriert seit
    Jun 2010
    Beiträge
    24
    Ich habe hier ein Beispiel, vielleicht hilft das ja weiter:

    Code:
        /**
        * Build LIMIT query
        */
        function _sql_query_limit($query, $total, $offset = 1, $max_records = 0, $cache_ttl = 0)
        {
            $this->query_result = false;
    
            // if $total is set to 0 we do not want to limit the number of rows
            if ($total == 0)
            {
                // Having a value of -1 was always a bug
                $total = '18446744073709551615';
            }
            if ($max_records == 0)
            {
                // Having a value of -1 was always a bug
                $max_records = '18446744073709551615';
            }
    
            $end_offset = $offset + $total - 1;
    
            if ( $end_offset > $max_records )
            {
                $diff = $end_offset - $max_records;
                $end_offset = $end_offset - $diff;
                $total = $total - $diff;
            }
    
    
            // DB2 UDB for iSeries (V5R4)
            $search_string = 'ORDER BY';
            $sort_order = 'ASC';
            $sort_order_desc = 'DESC';
            $reverse_order = '';
            $order_query = '';
            $h_query = strtoupper($query);
            if ( stripos($h_query, $search_string) !== false )
            {
                $pos = stripos($h_query, $search_string);
                $order_query = stristr($h_query, $search_string);
                $order_found = false;
                if ( stripos($order_query, $sort_order) !== false )
                {
                    $reverse_order = 'DESC';
                    $order_found = true;
                }
                if ( stripos($order_query, $sort_order_desc) !== false and !$order_found )
                {
                    $reverse_order = 'ASC';
                    $order_found = true;
                }
                if ( !$order_found )
                {
                    $reverse_order = 'DESC';
                }
            }
            else
            {
                    $reverse_order = 'DESC';
            }
    
            $query = 'With UR as (' . $query . ' FETCH First ' . $end_offset . ' Rows Only),
                           SR as (SELECT * FROM UR ' . $order_query . ' ' . $reverse_order . ' FETCH First ' . $total . ' Rows Only)
                      SELECT * FROM SR ' . $order_query;
    
            return $this->sql_query($query, $cache_ttl);
        }
    Man muss vorher nur ermitteln wie viele Datensätze insgesamt in der Abfrage zurück geliefert werden. Ein Schwachpunkt hat die Abfrage noch (bin leider noch nicht dazu gekommen das zu fixen), nämlich es darf beim ORDER BY nur ein Feld angegeben werden.

    EDIT: Bei Join Abfragen muss man die Felder eindeutig mit dem AS-Clause im Select definieren (t.PRICE as PRICE).
    Last edited by bussibaer; 30-09-10 at 12:48. Grund: Join Einschränkung nachgeschoben
    Schönen Gruß aus Kiel

    Jörg

Similar Threads

  1. Antworten: 6
    Letzter Beitrag: 26-07-06, 12:22
  2. IFS Datei Daten hinzufügen
    By sim in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 18-05-06, 08:00
  3. Antworten: 1
    Letzter Beitrag: 24-04-06, 10:37
  4. dspjrn mit minimierten aufgezeichneten Daten
    By rebe in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 28-04-05, 15:49
  5. Daten Import Tool + Dublettensuche für i5 CRM
    By Heinz Molter in forum Archiv NEWSblibs
    Antworten: 0
    Letzter Beitrag: 31-08-04, 09:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •