PDA

View Full Version : Alpha-Zeichen in Artikelnr V6R1



KingofKning
08-08-19, 10:19
Hallo *all,
ich hatte ja zuletzt hier im Forum die Möglichkeit kennengelernt wie man z.B. nur Sätze mitnumerischen Artikelnr bekommt.
Funktioniert soweit auch ganz gut.

create view rptrade/xx as
select * from dat015 where (dec(case when artikelnr > '0'
then artikelnr else '0' end, 5, 0) > 0
and
substr(artikelnr, 6, 2) <> '-A')

Wenn ich auf XX ein select mache bekomme ich die gewünschten Daten.
Wenn ich ein Query darauf mache bekomme ich einen Fehler
Nachrichten-ID . . . . : QRY2283 Bewertung . . . . . . : 30 Nachrichtenart . . . . : Diagnose Sendedatum . . . . . . : 08.08.19 Sendezeit . . . . . . : 11:15:56
Nachricht . . . : Auswahlfehler für Feld ARTIKELNR. Ursache . . . . : Die Abfrage wurde nicht ausgeführt, da ein Vergleichsoperand auf Daten aus Feld ARTIKELNR (in Satz 1424 der Datei DAT015 in Bibliothek RPTRADE, die nicht gleich *N sind,) zugreift. Die Daten aus Feld ARTIKELNR sind nicht notwendigerweise falsch, da es sich bei dem Operanden möglicherweise um einen Ausdruck handelt, der neben Feld ARTIKELNR auch andere Felder und Konstanten einbezieht. Ferner ist es möglich, dass ...

Die Daten sehen so aus:
ARTIKELNR
ArtikelNr
59234
59237
59281
59277
59288
59281-A
59277-A
59288-A
59290-A
59292-A
59294-A
58195-A
59295-A

Was muß ich machen damit die Query sauber läuft?
GG 4314 GG

Fuerchau
08-08-19, 12:02
Was soll dieser Blödsinn?
(dec(case when artikelnr > '0'
then artikelnr else '0' end, 5, 0)

Dein Problem ist, dass die Dec-Umwandlung immer durchgeführt wird und zwar unabhängig ob der 2. Vergleich dann zieht oder nicht.
Wofür ist die Dec-Konvertierung denn überhaupt gut?
Da reicht doch auch ArtikelNr >= '0'!

B.Hauser
08-08-19, 12:42
Was willst Du, nur die Artikel-Nr., die andere Zeichen als Ziffern enthalten?
Da gibt es mehrere Möglichkeiten.

1. Ohne Regular Expressions

Select FieldX, ....
From ...
Where Trim(Translate(FieldX, ' ', '1234567890')) > ''

2. Mit Regular Expressions - müsste ab Release 7.1 verfügbar sein

Select FieldX
From ...
Where RegexP_Like(Trim(FieldX), '[^\d]')

Birgitta

Fuerchau
08-08-19, 13:09
Für RegEx in SQL sind Zusatzoptionen zu installieren die gerne vergessen werden.

KingofKning
08-08-19, 14:15
Was willst Du, nur die Artikel-Nr., die andere Zeichen als Ziffern enthalten?
Da gibt es mehrere Möglichkeiten.

1. Ohne Regular Expressions

Select FieldX, ....
From ...
Where Trim(Translate(FieldX, ' ', '1234567890')) > ''

2. Mit Regular Expressions - müsste ab Release 7.1 verfügbar sein

Select FieldX
From ...
Where RegexP_Like(Trim(FieldX), '[^\d]')

Birgitta

Hallo,

ich will eigentlich nur die Artikel-Nr haben die numerisch sind. Sprich alles andere wie mit -A oder Texte wie Artikel-Nr (kommt vom Import aus Excel) will ich nicht.

Fuerchau
08-08-19, 17:49
Dann nimm Birgittas Funktion:

Trim(Translate(FieldX, ' ', '1234567890')) <> ''

Der Translate ersetzt alle Ziffern durch Blanks, der Trim entfernt alle Blanks vor und nachher.
Wenn dann noch was über ist, ist es ungleich Leer.

B.Hauser
08-08-19, 18:40
Dann must Du lediglich bei meiner 1. Lösung das Größerzeichen durch ein Gleichheitszeichen ersetzen und schon hast Du die numerischen Artikeln-Nr.

Birgitta

Fuerchau
09-08-19, 09:18
Stimmt, da habe ich das doch glatt negiert;-).

KingofKning
09-08-19, 18:13
Danke für die Hilfe,

wobei die Frage warum das SQL anders reagiert als das Query noch nicht beantwortet ist.
vermutlich gibt es dazu auch keine logische Antwort.

Fuerchau
10-08-19, 11:23
Das liegt dann an der unterschiedlichen Betrachtung des Optimisers.
Hast du z.B. eine Where-Klausel und es kann ein Index genommen werden, kommt das Ergebnis u.U. an den fehlerhaften Daten nicht vorbei.
Ist ein Tablescan erforderlich oder ein ungünstiger Index, liegen die falschen Daten ggf. mit im Zwischenergebnis.

Nun kommt es auch noch auf dein Release an.
Je nach dem ob V5, V6, V7 arbeitet der Optimizer immer mal wieder anders.
Und da nahm der Query/400 die sog. ClassicalQueryEngine (CQE) und SQL die SQLWQueryEngine (SQE).
Ab irgend einem Release (frag Birgitta) wurde die CQE abgeschafft.