Announcement

Collapse
No announcement yet.

DBCtrlGrid

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

  • DBCtrlGrid

    Delphi4 C/S, postgreSQL

    Hallo beisammen,

    ich benötige für eine Warenwirtschaft eine Editiermöglichkeit für Rechnungspositionen, also sozusagen die Elemente aus denen eine Rechnung zusammengesetzt ist.

    Meine Frage: Wie kann ich die Position (Zeile) eines Datensatzes im DBCtrlGrid herausfinden?

    Zur Erklärung: Sämtliche Positionen eines Projektes sind in einer SQL-Tabelle (ProPos) abgelegt, die unter anderem die Spalten Projektnummer, Zeile, Artikelnummer, Text, VK besitzt.

    Das eigentliche Bearbeiten eines Projektes (=Rechnung) erfolgt in einem DBCtrlGrid, in das ich zu Beginn sämtliche Spalten des zu bearbeitenden Projektes lade und nach der Spalte "Zeile" sortiere.

    Der Benutzer hat nun die Möglichkeit, über die Standardroutinen direkt im Grid neue Datensätze anzulegen, Sätze zu löschen und (später, ich weiß leider noch nicht wie...) die Reihenfolge der vorhandenen Sätze zu ändern.

    Beim Schließen des Grids stehe ich nun vor dem Problem, dass ich gerne die vom Benutzer neu erstellte Reihenfolge der Datensätze übernehmen möchte - also die Information über die Zeilennummer im Grid in die Spalte "Zeile" schreiben muss.

    Da ich keinen Weg gefunden habe, eine Information über die Zeilennummer eines Datensatzes im Grid zu erhalten, mache ich den Umweg über die RecNo des zugehörigen Querys. Ich durchsuche also beim Schließen des Fensters die Datenmenge sequentiell und schreibe für jeden Datensatz die RecNo als "Zeile":

    <PRE><CODE>
    procedure TfmProPos.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    // Änderungen im Grid sichern:
    dmGreenBase.qyProPos.ApplyUpdates;
    dmGreenBase.qyProPos.CommitUpdates;
    // Zeilennummern aktualisieren:
    dmGreenBase.qyProPos.First;
    while not dmGreenBase.qyProPos.EOF do
    begin
    dmGreenBase.qyProPos.Edit;
    dmGreenBase.qyProPosZeile.Value := dmGreenBase.qyProPos.RecNo;
    dmGreenBase.qyProPos.ApplyUpdates;
    dmGreenBase.qyProPos.CommitUpdates;
    dmGreenBase.qyProPos.Next;
    end;
    end;
    </PRE></CODE>

    Das funktioniert so einigermaßen. Hat trotzdem jemand eine Idee, wie ich irgendwie anders auf die Zeilennummern im Grid zugreifen kann?

    Oder wie realisiert man eine solche Positionsbearbeitung üblicherweise?

    Für jede Hilfe bereits jetzt herzlichen Dank!!

    Grüße
    Ralph

  • #2
    hi,

    das DBCtrlGrid kenne ich noch nicht! mit welcher datenzugriffskomponente arbeitest du?`

    gruß

    marku
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

    Comment


    • #3
      Hallo,

      das Problem ist mir bekannt. Ich hatte folgende Aufgabe und habe es so gelöst:

      Zu einer Rechnung gibt es verschiedene Datumseinträge, die verschieden Posten enthalten. Diese Posten sollen verschoben werden können.

      1. Tabelle Rechnungen Primärindex RECHNUNGENID<br>
      2. Tabelle Posten mit (u.a.) Feldern DATUM, PREIS usw. Primärindex POSTENID.<br>
      3. Die Tabelle POSTEN ist mit RECHNUNGEN über RECHNUNGENID verknüpft.

      Nun kommt's: in der Tabelle POSTEN gibt es ein Integer-Feld ORDERID. Beim Anlegen eines neuen Datums (innerhalb eines Datums soll sortiert und auch verschoben werden) wird per SQL eine korrekte ORDERID ermittelt.

      Damit auch in der untergeordneten Tabelle nach ORDERID sortiert wird, ist der Sekundärindex dort zusammengesetzt: RECHNUNGENID,DATUM,ORDERID.

      Wenn ich also per Programmtext zwei ORDERID's miteinander vertausche, "rutschen" die Datensätze auf Grund der Indizierung automatisch an ihren neuen Platz (innerhalb eines Datums, das kann man festlegen).

      Ich realisiere das Ganze mit dem QuantumGrid von Developer-Express, das bietet für Drag&Drop sehr gute Möglichkeiten.

      Gruß Ul

      Comment


      • #4
        Uli,

        danke für Deine Antwort!

        Erlaubt das QuantumGrid einen Zugriff auf die "Zeilennummer", die ein Datensatz innerhalb des Grids hat?

        Genau das ist ja mein eigentliches Problem: Ich muss beim Zurückschreiben der Daten aus dem Grid wissen, welcher Datensatz an welcher Position im Grid war. Und diese Information bekomme ich nicht aus dem CtrlGrid - oder?

        Grüße
        Ralp

        Comment


        • #5
          Hallo,

          Ja klar. Z.B.
          <pre>
          StartIndex := dbGridPosten.DragNode.absoluteindex;
          ZielIndex := dbGridPosten.FocusedNode.Index;
          </pre>
          Auf Grund dieser Angaben kann man dann in den betreffenden Datensätzen die OrderID vertauschen oder in eine neue Reihenfolge bringen. Der Rest geht dann dann auf Grund des Zusammengesetzten Index von selbst.

          Das Grid ist allerdings nicht ganz billig, bietet aber sonst auch eine Menge; ich möchte es nicht mehr missen.

          Gruß Ul

          Comment

          Working...
          X