Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sortierung bei SQL (https://www.delphipraxis.net/1487-sortierung-bei-sql.html)

Hansa 2. Dez 2002 09:39


Sortierung bei SQL
 
Hi,

habe hier ein Problem, das bestimmt noch öfter auftaucht. Nehmen wir mal das Drucken einer Rechnung. Hierzu laufe ich über alle IDs, die zu einer Rechnung mit einer bestimmten Nr. gehören. Die zugehörigen Artikel suche ich mir dann über die ID_ARTNR der Rechnungs-Positionen. Auf der Rechnung sollen aber die einzelnen Artikel nicht kreuz und quer in der Reihenfolge ihrer Eingabe drauf stehen, sondern nach der Art.Nr. sortiert. Ein ORDER BY ID_ARTNR nützt aber nichts, da die IDs der Artikel selber mit Sicherheit nicht parallel zu den eigentlichen Art.Nr. laufen. Dazu fällt mir nur ein, eine eigene Tabelle (oder vielleicht einen View, damit habe ich mich allerdings noch nicht beschäftigt) für diesen Zweck zu erstellen. Aber das kommt mir doch recht kompliziert vor. Geht das auchh einfacher ?

Gruß
Hansa

MrSpock 2. Dez 2002 10:22

Hallo Hansa,

du kannst ja direkt nach artikelnummer sortieren:

Code:
SELECT ... ORDER BY artikelnummer

Sharky 2. Dez 2002 10:29

Re: Sortierung bei SQL
 
Hai Hansa,

eventuell reicht dir ja ein JOIN in der Abfrage:

Code:
SELECT rechnung_pos.artikel_id , artikel.art_nummer FROM rechnung_pos
INNER JOIN art_nummer ON rechnung_pos.artikel_id = artikel.artikel_id
ORDER BY art_nummer.artikel
rechnung_pos ist die Tabelle mit den Positionen einer Rechnung
artikel ist die Tabelle mit den Artikeldaten

Ich kann das ganze jetzt leider nicht testen. Aber das sollte in Ansatz sein.

Über eine View kannst Du das natürlich auch machen (das oben ist quasie ja eine).

Gruss

Hansa 2. Dez 2002 10:43

Hi,

Zitat:

Zitat von MrSpock
du kannst ja direkt nach artikelnummer sortieren:

Meinst Du ungefähr so :

SELECT art.nr, art.bez,recpos.ID,recpos.preis FROM artikel,recpos ORDER BY art.nr;

Ob das wohl so geht ?? :shock: Dann hätte ich die Art.Nr., die Art.Bez. aus der Art-Table und den Preis aus der Recpos-Table. Aber wo steht dann, daß es genau der Artikel ist, der auf der Rechnungspos. steht ? Ich muß doch über die ID_ART der Recpos suchen :?:

@Sharky : obiges wäre einfacher, wenn es denn geht. Das mit den INNER / OUTER joins muß ich mir nochmal in Lemmy`s Tutorial (Hi Lemmy :mrgreen:) durchlesen. Das klingt aber auch vielversprechend. Wahrscheinlich brauche ich zumindest keine Table / View anzulegen.

Gruß
Hansa

MrSpock 2. Dez 2002 11:08

Hallo Hansa,

genau um das sicher zu stellen brauchst du den INNER JOIN, den Sharky gezeigt hat, der lässt sich aber auch etwas "einfacher" schreiben:

Code:
SELECT r.artikel_id , a.art_nummer, ... FROM rechnung_pos r, artikel a
WHERE r.artikel_id = a.artikel_id
ORDER BY a.art_nummer

Hansa 2. Dez 2002 11:45

Hi,

ich nehme an, dann bräuchte ich 2 Datasets und das wars. Aber kann ich das SelectSQL direkt da reinschreiben, oder soll ich Delphi die normalen SQLs machen lassen und das was ich brauche über Query oder so ?

Halt ! Ich hab noch was vergessen : und zwar ist mir nicht ganz klar wie und wo ich die SELECTS setze. Im Moment sieht es so aus :
Code:
  WITH RecDataMod.RecKopfDS DO BEGIN
    Active := false;
    SelectSQL.Text := 'SELECT RECHNNR,UMSATZMWST2 FROM RECKOPF8 WHERE RECHNNR = Edit1.Text;
    Active := true;
  END;
  WITH RecDataMod.KuDataSet DO BEGIN
    Active := false;
    SelectSQL.Text := 'SELECT NR,ANREDE,NAME,STRASSE,ORT,TELEFON FROM KUNDE8 WHERE NR= :NR';
    Active := true;
  END;
Das ist allerdings jetzt nur : Eingabe einer Rechn.Nr.-> zugehörigen Kunden suchen (da gibts nichts zu sortieren). Wobei das NR= :NR so nicht stimmt. Muß mir das mit der Parameterübergabe auch noch mal angucken. Aber ist jetzt egal. Muß bei MrSpocks Statement nur dafür gesorgt werden, daß die entsprechenden Datasets wie bei mir active=false, dann SelectSQL dann active=true gesetzt werden und dann habe ich genau das, was ich brauche ? Mist, muß wieder weg, nie kann mann etwas in Ruhe zu Ende bringen. Wenn dem aber tatsächlich so ist, muß ich BB zitieren : Das ist ja einfach ! :mrgreen:

Gruß
Hansa

MrSpock 2. Dez 2002 12:14

Hallo Hansa,

also für die Abfrage selbst brauchst nur eine TQuery Komponente, deren SQL Eigenschaft du das o.g. SQL Statement zuweist. Die Eigenschaft DatabaseName muss noch gesetzt werden und nach einem Open setzt die BDE das SQL Statement um und liefert dir EINE Datenmenge zurück. Du solltest aber im WHERE Teil noch eine bestimmte Rechnung auswählen.

Hansa 2. Dez 2002 12:32

Hi MrSpock,

vielen Dank für Deine Hilfe. Muß weg.......... Wenn man einmal von seiner Absicht keinen Text zu editieren abweicht :mrgreen: Muß mir das nachher nochmal ansehen, aber lies trotzdem mal das letzte Posting von mir wieder neu. Ich glaube so geht es auch. Ich wundere mich schon seit längerem, daß ich überall Query,Query usw. höre und ich in ca. 20 allerdings kleineren Programmen keine einzige gebraucht habe.

Gruß
Hansa

Sharky 2. Dez 2002 13:41

Hai Hansa,

mal nur so am Rande:

Je nach dem was für Rechnung erfasst werden würde ich diese nicht nach der Artikelnummer sortieren.
Es kann ja sein das bei der Erfassung bestimmte Artikel nacheinander eingegeben wurden weil diese zusammen gehören.
Darum würde ich die Reihenfolge bei der Erfassung festlegen und nicht beim ausdruck.

Gruss

Hansa 2. Dez 2002 17:00

Hi Sharky,

nee nee, die Art.Nummern müssen auf der Rechnung nachvollziehbar sein. Hast du eine Preisliste des Lieferanten und willst DEINE EIGENEN Preise nachschauen, also als Kunde, weißt Du selber dann noch in welcher Reihenfolge Du das bestellt hast ? :dancer:

Bei Dir ist es vielleicht Art.Nr. 100 und beim Lieferanten 86454423434. Wer will denn diese Nr. suchen. Ich würde den Software-Hersteller anrufen und fragen, ob er noch ganz fix ist. :mrgreen:

Gruß
Hansa

Hansa 4. Dez 2002 11:38

Hi,

Ich habe jetzt mal folgendes gemacht :
Code:
[/ WITH RecDataMod.ReckopfDS DO
    SelectSQL.Text := 'SELECT * FROM RECKOPF8 WHERE RECHNNR ='+Edit1.TEXT;
  WITH RecDataMod.KuDataSet DO
    SelectSQL.Text := 'SELECT * FROM KUNDE8 WHERE ID = ?ID_KUNDE';
Hierdurch kriege ich die Rechnung angezeigt, aber nicht den Kunden. Das ?ID_KUNDE stimmt so nicht. Danach wollte ich die Artikel-Datenmenge so behandeln, wie Sharky und MrSpock das beschrieben haben. Aber diese Parameterübergabe kriege ich nicht hin. Woher soll die DB eigentlich wissen, daß das ID_KUNDE von dem Rechnungskopf kommt ?

Gruß
Hansa

Sharky 4. Dez 2002 12:45

Zitat:

Zitat von Hansa
Hi,

Ich habe jetzt mal folgendes gemacht :
Code:
[/ WITH RecDataMod.ReckopfDS DO
    SelectSQL.Text := 'SELECT * FROM RECKOPF8 WHERE RECHNNR ='+Edit1.TEXT;
  WITH RecDataMod.KuDataSet DO
    SelectSQL.Text := 'SELECT * FROM KUNDE8 WHERE ID = ?ID_KUNDE';

Hmm... es müsst doch so heissen:

Code:
WITH RecDataMod.ReckopfDS DO
 SelectSQL.Text := 'SELECT * FROM RECKOPF8 WHERE RECHNNR ='+Edit1.TEXT;
Open;
WITH RecDataMod.KuDataSet DO
 SelectSQL.Text := 'SELECT * FROM KUNDE8 WHERE ID = '
                    + RecDataMod.ReckopfDS.FieldByName ('ID_KUNDE').AsString;
Oder?

Hansa 4. Dez 2002 16:07

Hi Sharky,

das könnte es sein. :spin: Aber das Open brauche ich nicht. Ich benutze keine Query direkt, sondern setze die DataSets mit active auf true oder false. Das FieldByName schau ich gleich nach, bin noch unterwegs.

Gruß
Hansa

Hansa 4. Dez 2002 18:28

Hi Sharky,

einwandfrei :!: Das war der richtige Weg :hello: Hier ist etwas mehr Quelltext :
Code:
procedure TReDruck.Button1Click(Sender: TObject);
begin
  RecDataMod.ReckopfDS.active := false;
  RecDataMod.KuDataSet.active := false;
  WITH RecDataMod.ReckopfDS DO
    SelectSQL.Text := 'SELECT * FROM RECKOPF8 WHERE RECHNNR ='+Edit1.TEXT;
  RecDataMod.ReckopfDS.Active := true;
  WITH RecDataMod.KuDataSet DO
    SelectSQL.Text := 'SELECT * FROM KUNDE8 WHERE ID = ' +
    RecDataMod.ReckopfDS.FieldByName ('ID_KUNDE').AsString;
  RecDataMod.KuDataSet.active := true;
  QuickRep1.Preview;
  Close;
end;
Was hierbei wichtig ist : da ich keine Query verwende, muß das Active der DataSets an der richtigen Stelle stehen. Bisher hatte ich bei BEIDEN DataSets am Anfang der Prozedure active auf false und am Schluß active auf true gesetzt. An die ID_KUNDE der Rechnung komm ich aber nur ran, wenn das erste SQLselect bereits ausgeführt ist !!!

Gruß
Hansa

P.S.: Um diesem Thema hier gerecht zu werden kann ich ja jetzt mit den Artikeln weitermachen, die müssen ja sortiert werden und nicht ein einzelner Kunde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz