View Full Version : Mal wieder SQL
KingofKning
28-09-12, 11:19
Hallo *all,
ich brauche mal wieder etwas Hilfe beim Thema SQL.
Ich habe hier einen Auftragskopf und muß über die Kundennummer den Kundenstamm lesen. Ich muß bei allen Aufträge wo der Rechnungsempfänger im Kundenstamm <> der Rechnungsempfänger im Auftrag ist den Auftrag abändern.
Um erstmal die Daten zu sehen habe ich folgendes geschrieben:
select * from ako01pf where akanr >= 130887 and akanr <= 13099
9 and akkto in
(select adkto from adr01pf where adkto = akkto and akid1 <> ad
id1)
Akanr ist die Auftragsnummer
Akkto ist die Kundennummer im Auftrag
Adkto ist die Kundennummer im Kundenstamm
AkID ist der Rechnungsempfänger
Ich bekomme dann die Fehlermeldung:
Anweisung bestätigen
Eine Unterabfrage mit einer Korrelation wurde eingegeben; es
fehlt jedoch das Qualifikationsmerkmal für:
Feld . . . . . . . . . . . . .: AKID1
Was ist da falsch?
GG
Das ist nur eine Warnung, bei nicht eindeutigen Namen gäbs eine Abbruchmeldung.
Für Joins wäre die Syntax:
select a.F1, a.F2, ..., b.F1, ...
from myfile a
join myfile2 b on a.k1= b.k1 and ...
Es fehlt die Qualifikation, was aber bei eindeutigen Namen egal ist.
KingofKning
01-10-12, 13:51
Hallo *all,
ich habe jetzt das ganze mal als Update definiert und will aus dem Kundenstamm jetzt die Felder in den Auftragskopf schreiben. Ist das so richtig?
update gregor/ako01pf a
set (a.akid1, a.akid2, a.akid3, a.akid4, a.akid5) =
(select
b.adid1, b.adid2, b.adid3, b.adid4, b.adid5
from
gregor/ako01pf a
left join
gregor/adr01pf b on b.adkto = a.akkto
and b.adfa = 1 and b.adsts = 0)
where a.akanr >= 130800 and a.akanr <= 130999
and a.akfa = 1 and a.akid1 = 16129
Wobei ich das Gefühl habe das es nicht richtig ist, da ich den Auftragskopf ja 2x lese. Der wird ja dann nicht syncron sei oder?
Die Syntax für den Update aus anderen Dateien sieht wie folgt aus:
update AuftrKopf A
set (A.Feld1, A.Feld2) = (select B.Feld1, B.Feld2
from KundenSt B
where A.Key1 = B.Key1
and A.Key2 = B.Key2)
where exists (select C.Key1, C.Key2
from KundenSt C
where A.Key1 = C.Key1
and A.Key2 = C.Key2)
and ... weitere Where-Bedingungen
Die Auftragskopf und Kundenstamm-Dateien habe ich schon mal eingesetzt.
Birgitta
KingofKning
01-10-12, 18:49
Danke Dir, leider liegt auf der Datei ein Trigger der das ganze verhindert. Ich müßte also den Trigger abklemmen und das geht nur dann wenn keiner drauf ist und ihn dann wieder anklemmen.
Ich finde Trigger ja nicht schlecht aber in dieser Kombination ziemlich dämlich!
GG
Verhindert der Trigger das, weil er auf einen Hammer läuft oder weil er SQL update verhindert.
Läuft er auf einen Hammer --> Warum ? Liblist ? LDA? ...
Außerdem kannst du einen Trigger 'inaktiv' setzen, du mußt ihn nicht abnehmen. Aber auch dazu muß die Datei frei sein.
Unsere Lösung ist 1 Trigger auf allen Dateien, der in einer Tabelle nachsieht ob er für diese Datei was tun muß(und dann den 'eigendlichen' Trigger called) .
Das kann ich jederzeit ein/aus schalten
Robi
KingofKning
02-10-12, 17:31
Hallo,
wie setzte ich denn einen Trigger auf inaktiv?
GG
Hallo,
wie setzte ich denn einen Trigger auf inaktiv?
GG
CL Command CHGPFTRG oder System i Navigator (auf Trigger positionieren, Rechtsclick und Disable)
... Trigger sollen Datenkonsistenz gewährleisten und verhindern, dass in den Daten herumgepfuscht wird.
Birgitta
KingofKning
03-10-12, 08:33
Hallo, in diesem konkreten Fall sind die Trigger dazu da, um ein Duplikat des Satzes zu erzeugen um später Veränderungen nachvollziehen zu können.
Es bleibt für mich aber immer noch die Frage warum ein RPG Programm die Daten manipulieren kann und SQL darf nicht. Finde ich nicht logisch.
GG
daher die Frage...
Was geschied wenn der trigger drauf ist, und du den sql-update machst.
Wie lautet die Fehlermeldung?
Robi