Announcement

Collapse
No announcement yet.

KOPFNUS!! Matrix: Wie kann ich mittels TIBQuery Datensätze von Satz x bis y einlesen um Datenmengen klein zu halten.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • KOPFNUS!! Matrix: Wie kann ich mittels TIBQuery Datensätze von Satz x bis y einlesen um Datenmengen klein zu halten.

    Hallo Delphianer,

    (Ich nutze IB 6.0 und D5 c/s)

    ich muss in einem StringGrid eine Matrix abbilden. derzeit läuft es wie folgt:

    1. select auf die Daten (USer) der Spalte (id-x)

    2. select auf die Daten (Rechte) der Zeile (id-y)

    3. Durchlauf der Matrix (Verknüpfung der User und deren Rechten)und lesen der einzelnen Funktionen (Leer, "X" oder sonstige Zeichen)

    for i := 1 bis anzahl spalte_User

    for y := 1 bis anzahl zeile_Rechte

    select aus funktion f where f.x = spalte_user.id-x and y=zeile_Rechte.id-y
    den Inhalt aus Funktion dann im StringGrid an der Position i,y eintragen.

    Bei einer Matrix von ca.150 Spalten und ca.6000 Zeilen sind das 900.000 Zugriffe. Das bringt jeden Server in die Knie!!! Sowas sollte man sicherlich nicht machen. *g* zumal der sichtbare Bereich vielleicht nur 50 * 25 = 1250 zellen beträgt.
    Wie kann man den Zugriff begrenzen? Vorschläge?
    Ich dachte da einen Cursor, der nur die Spalten/Zeilen lädt, die auch auf dem Bildschirm sichtbar sind.
    Ich bin für jede idee dankbar. Die Matrix muss dann editierbar sein und die Änderungen werden entsprechend gespeichert.

    Kopfrauchenden Gruß

    Axel

  • #2
    Hallo Axel,

    eine fertige Lösung kann ich Dir nicht bieten, aber vielleicht einen Gedankenanstoß. Vielleicht kannst Du einen Index so mißbrauchen, daß Du nur eine bestimmte Anzahl von Sätzen, nämlich diejenigen, die Du anzeigen kannst. Dabei würde ich auch die Anzahl der anzuzeigenden Spalten reduzieren. Den zu ändernden Datensatz würde ich per Select-Abfrage(mit allen Feldern und dem eindeutigen Schlüssel) holen und dann in Editierfeldern ändern. Ich komme vom DB/2 und dort arbeitet man mit Cursorn und holt sich zusätzliche Sätze über den Fetch-Aufruf.

    MfG JS

    Comment


    • #3
      Hi,<br>
      wie sieht den die Tabelle(n) aus vieleicht ist die Struktur nicht so optimal. Ist der Inhalt der Tabelle Rechte das "Recht" oder ein "Feld mit den RECHTEN"
      <br>
      <pre>
      Beispiel:
      Rechte.Recht = XRW... Type Varchar(5)
      oder
      RECHT.READ Type Char(1) als Boolean (null or 'X')
      RECHT.WRITE
      RECHT.FULLACCESS
      RECHT.....

      mit der 2. Struktur läßt sich das Problem leicht lösen.......... und die Rechte Bequem Verwalten.
      </pre>

      Gruß Andrea

      Comment


      • #4
        Hallo,

        man kann auch eine Stored Procedure dafür nutzen, nur einen bestimmten Teil der Ergebnismenge an den Client zurückzuliefern. Nur dann, wenn für den aktuellen Datensatz die <b>SUSPEND</b>-Anweisung aufgerufen wird, überträgt der InterBase diesen Datensatz zum Client (der SQL-Standard sieht das einzelne Abholen der Datensätze über die sogenannten Fetch-Aufrufe vor, so dass SUSPEND das Vorliegen neuer Daten ankündigen muss):
        <pre>
        CREATE PROCEDURE GETLASTXKUNDEN (KUNDENID INTEGER, ROWS INTEGER)
        RETURNS (VORNAME CHAR(35),NACHNAME CHAR(35))
        AS
        DECLARE VARIABLE iREC_COUNT INTEGER;
        DECLARE VARIABLE iCOUNT INTEGER;
        DECLARE VARIABLE iSTART_FROM INTEGER;
        BEGIN
        /* Wie viele Daten sind vorhanden? */
        SELECT COUNT(*)
        FROM kundenimp
        INTO :iREC_COUNT;
        /* Wo anfangen? */
        IF (ROWS >= iREC_COUNT) THEN
        iSTART_FROM = 1;
        ELSE
        iSTART_FROM = iREC_COUNT - ROWS + 1;
        /* Counter setzen */
        iCOUNT = 0;
        /* SQL-Abfrage aufbauen */
        FOR SELECT kundenid, vorname, nachname
        FROM kundenimp
        ORDER BY kundenid
        INTO :kundenid, :vorname, :nachname
        DO
        BEGIN
        iCOUNT = iCOUNT + 1;
        IF (iCOUNT >= iSTART_FROM) THEN
        BEGIN
        SUSPEND;
        END
        END
        END
        ^
        </pre&gt

        Comment

        Working...
        X