PDA

View Full Version : Mal wieder SQL



Seiten : [1] 2

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

Fuerchau
28-09-12, 11:23
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?

B.Hauser
01-10-12, 17:50
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

Robi
02-10-12, 12:14
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

B.Hauser
02-10-12, 18:34
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

Robi
03-10-12, 11:20
daher die Frage...
Was geschied wenn der trigger drauf ist, und du den sql-update machst.
Wie lautet die Fehlermeldung?

Robi