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 |
Hallo Hansa,
du kannst ja direkt nach artikelnummer sortieren:
Code:
SELECT ... ORDER BY artikelnummer
|
Re: Sortierung bei SQL
Hai Hansa,
eventuell reicht dir ja ein JOIN in der Abfrage:
Code:
rechnung_pos ist die Tabelle mit den Positionen einer Rechnung
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 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 |
Hi,
Zitat:
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 |
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 |
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:
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:
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; Gruß Hansa |
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. |
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 |
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 |
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 |
Hi,
Ich habe jetzt mal folgendes gemacht :
Code:
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 ?
[/ 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'; Gruß Hansa |
Zitat:
Code:
Oder?
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; |
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 |
Hi Sharky,
einwandfrei :!: Das war der richtige Weg :hello: Hier ist etwas mehr Quelltext :
Code:
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 !!!
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; 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