Code: Alles auswählen.
select single MARC~DISMM into WA-DISPO
from MARC inner join MARA on MARC~MATNR = MARA~MATNR
where MARA~/FIS/V_DTN_LIFNR = WA-KUNNR and
MARC~DISMM = 'VI'.
if SY-SUBRC = 0.
...
Code: Alles auswählen.
SELECT SINGLE MARC~DISMM INTO WA-DISPO
FROM MARA
JOIN MARC ON MARC~MATNR = MARA~MATNR
WHERE MARA~/FIS/V_DTN_LIFNR = WA-KUNNR
AND MARC~DISMM = 'VI'.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
ChrissixD
Ja genau das soll es ja auch tun, ich muss wissen ob ein Material, zu diesem Lieferanten mit diesem Dispomerkmal existiert. Dabei ist egal welches Material oder sonst was, deswegen frage ich danach mit subrc ab, ob was gefunden wurde.Nebenbei sollte Dir klar sein, dass Du als Ergebnis in WA-DISPO immer 'VI' zurückbekommen wirst, da Du dies ja in der WHERE-Schleife explizit forderst. Der SELECT taugt also nur dazu, über SY-SUBRC zu prüfen, ob es solch ein Material überhaupt gibt oder nicht.
Es ist kein Eingriff in die Tabelle. Du fügst nur einen Suchindex hinzu. Ich bin gar nicht sicher, ob das bei einem Upgrade überhaupt als Modifikation hochkommen würde. Unkritisch wäre es auf jeden Fall.aber in die Tabelle selber möchte ich erstmal nicht eingreifen (was du bei b beschrieben hast)
Ich lese für solche Zwecke immer das Feld MANDT. Das gibt es so ziemlich in jeder Tabelle, und damit machst Du jedem, der Deinen Code später liest (Dich selbst eingeschlossen) deutlich, dass Dich der Wert nicht interessiert.Ja genau das soll es ja auch tun, ich muss wissen ob ein Material, zu diesem Lieferanten mit diesem Dispomerkmal existiert. Dabei ist egal welches Material oder sonst was, deswegen frage ich danach mit subrc ab, ob was gefunden wurde.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
ChrissixD
Interessant - ich verwende für so einen Zweck Kommentare.DeathAndPain hat geschrieben:Ich lese für solche Zwecke immer das Feld MANDT. Das gibt es so ziemlich in jeder Tabelle, und damit machst Du jedem, der Deinen Code später liest (Dich selbst eingeschlossen) deutlich, dass Dich der Wert nicht interessiert.
Das macht Sinn, da habe ich in dem Moment garnicht dran gedacht, dass man auch einfach andere Felder nehmen kann.Ich lese für solche Zwecke immer das Feld MANDT. Das gibt es so ziemlich in jeder Tabelle, und damit machst Du jedem, der Deinen Code später liest (Dich selbst eingeschlossen) deutlich, dass Dich der Wert nicht interessiert.
Kommentieren kannst Du, so viel Du magst, aber Du wirst nicht umhin kommen, dem SELECT ein Feld mitzugeben, das er lesen soll. Und anstelle da irgendein Feld reinzuschreiben und dann eine Kommentarzeile hinzuzufügen, die dem Leser mitteilt, dass Du dieses Feld in Wahrheit doch nicht wissen willst, finde ich es schöner, das offensichtlich nutzlose Feld MANDT zu lesen (am besten in eine Dummyworkarea). Wenn danach dann gleich eine Prüfung auf SY-SUBRC kommt, sollte jedem minimal kompetenten Leser klar sein, was der Zweck der Übung ist.black_adept hat geschrieben:Interessant - ich verwende für so einen Zweck Kommentare.
Du kannst SELECT COUNT( * ) schreiben, ohne ein INTO anzugeben. Dann kannst Du auch SY-SUBRC auswerten. Ohne es gemessen zu haben, halte ich das aber für langsamer, weil die Datenbank dann die Anzahl der Vorkommen zählt und nicht nach dem ersten Fund aufhört, obwohl Dich ja nur interessiert, ob es überhaupt einen gibt.Chrissi hat geschrieben:Gibt es denn nicht eine Abfrage, die zurückgibt ob etwas gefunden wurde oder nicht, ohne etwas in ein Feld schreiben zu müssen?
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
ChrissixD
Das hängt von den Umständen ab. Du suchst vielleicht auf der MARC und kennst neben der Materialnummer nur ein nicht indiziertes Feld. Solch Suche wird nicht unvertretbar lange dauern, da es nicht endlos viele Werke geben wird, aber dennoch verschenkst Du Performance, da Dich ja nur die Existenz interessiert, der Interpreter aber nach der ersten Fundstelle in den anderen Werken weitersucht.Wenn der Schlüssel einigermaßen brauchbar ist wird nur auf den Index und nicht auf die Rumpftabelle zugegriffen. Das macht die Sache performant.
Ich halte das Übertragen des Mandanten, also eines dreistelligen Characterfeldes, für laufzeittechnisch vernachlässigbar und damit performanter als das häufige Weitersuchen nach dem Auffinden einer Fundstelle. Müsste man mal ein Testprogrämmchen schreiben, das die Laufzeiten vergleicht.Es werden keine Daten sinnlos übertragen.
Die Idee, stattdessen MANDT zu lesen, stammt nicht von mir, sondern ich habe es im Programm eines anderen gelesen und sofort verstanden, was der Zweck war. Der Ansatz hat mir gefallen, und so habe ich ihn übernommen. Von daher behaupte ich, dass das genauso gut verständlich ist. Bei mir fragt man sich, was ich mit dem Mandanten will, bei Dir, warum Du da zählst. Einem halbwegs kompetenten Programmierer sollte aber in beiden Fällen sofort klar werden, was Sache ist.Jedem der das liest ist sofort klar was da passiert.
Da liegst Du falsch, und nicht erst seit 7.40.Die Prüfung muss aber auf SY-DBCNT gehen, SY-SUBRC ist immer null.
Code: Alles auswählen.
GET RUN TIME FIELD t0.
SELECT SINGLE mandt FROM marc INTO sy-mandt
WHERE matnr EQ '9588188'
AND beskz EQ 'X'.
GET RUN TIME FIELD t1.
SELECT COUNT( * ) FROM marc
WHERE matnr EQ '9588188'
AND beskz EQ 'X'.
GET RUN TIME FIELD t2.
te = t1 - t0.
WRITE: / te.
te = t2 - t1.
WRITE: / te.
Stimmt. Das war aber nicht immer so, deshalb hab ich mir DBCNT angewöhnt.Da liegst Du falsch, und nicht erst seit 7.40.Die Prüfung muss aber auf SY-DBCNT gehen, SY-SUBRC ist immer null.
Weil der Wert dann besser gepuffert ist.DeathAndPain hat geschrieben:Aufdecken kannst Du das leicht, indem Du in Deinem Code die beiden SELECTs vertauschst, so dass der COUNT( * ) zuerst kommt. Dann ist der MANDT schneller.