View-Inhalte nach Bedingung erstellen

alfino

Benutzer
Beiträge
12
Hallo in die Runde,
ich habe ein Problem mit einer View die ich bearbeite und mit verschiedenen Bedingungen versehe und ich bin hier nun in einer Sackgasse.

Folgender Aufbau:
Zwei Datenbanken. DB1 enthält Daten, die in einer View dargestellt werden müssen, damit sie dann in DB2 verarbeitet werden können.
DB1 und DB2 gehören zu zwei gänzlich unterschiedlichen Programmen und es handelt sich nur zufällig um MSSQL-Datenbanken.
Bei den Daten handelt es sich um Messestände, die in DB1 gebucht werden und über DB2 grafisch verarbeitet werden. Für die grafische Verarbeitung müssen Daten übergeben werden, dafür gibt es die View.
Ein wichtiger Punkt sind die Statussis (oder Stati?) der Aussteller. Es gibt 'normale' Aussteller, die machen keine Probleme. Dann gibt es noch 'Hauptaussteller' und 'Mitaussteller', das ist wenn Firma A und Firma B zusammen einen Stand haben.
Bei der Buchung wird beim Hauptaussteller (Firma A) so verfahren wie beim 'normalen' Aussteller, allerdings wird beim Mitaussteller (Firma B) ein Feld gefüllt und zwar mit der Buchungsnummer vom Hauptaussteller. Dieses Feld ist nvarchar(500).

Ich brauche nun einen Weg, wie ich das Feld Lieferschein.Nummer (int) von Kunde A mit Lieferschein.Feld4 von Kunde B vergleichen kann, d. h. wenn die Nummer von Kunde A im Feld bei Kunde B steht, dann ist Kunde A Ausstellertyp 2.

Der Teil meiner View, der das bewirken soll sieht so aus:

case
when CONVERT (varchar, "Lieferschein"."Nummer") in ("Lieferschein"."Feld4")
then
2
when "Artikel"."Code" = 80684454 OR "Artikel"."Code" = 221232221 OR "Artikel"."Code" = 40487905
then
3
else
0
END AS AUSSTELLERTYP

Kunde B wird mittels der gebuchten Artikel als Mitaussteller identifiziert, das klappt auch.
Ich dachte, dass die erste Zeile nach 'case' abfragt, ob die Lieferschein Nummer irgendwo im Feld Lieferschein.Feld4 ist und wenn dem so wäre, dann würde der Ausstellertyp 2 gesetzt. Ist aber leider nicht so, alle die nicht 3 werden, werden 0, obwohl die korrekten Nummern in Lieferschein.Feld4 eingegeben wurden.
 
Werbung:
Ich glaube du verwendest den IN Operator falsch.
suchstring IN ( wert1,wert2,wertN )
Du suchst vermutlich eher
Code:
"Lieferschein"."Feld4" LIKE '%' + CONVERT (varchar, "Lieferschein"."Nummer") + '%'
Außerdem verstehe ich die "-Zeichen nicht so ganz, kommst du von MySQL? Bei MSSQL ist das eher überflüssig, wenn dann wäre [ ] besser.
 
Die doppelten Anführungszeichen ("Lieferschein") sind korrektes ANSI Standard-SQL für "quoted identifiers" und SQL Server versteht die sehr wohl.
 
Ich glaube du verwendest den IN Operator falsch.
suchstring IN ( wert1,wert2,wertN )
Du suchst vermutlich eher
Code:
"Lieferschein"."Feld4" LIKE '%' + CONVERT (varchar, "Lieferschein"."Nummer") + '%'
Außerdem verstehe ich die "-Zeichen nicht so ganz, kommst du von MySQL? Bei MSSQL ist das eher überflüssig, wenn dann wäre [ ] besser.

Das kann sehr gut sein, dass ich IN falsch verwende :), ich bin da eben von anderen Voraussetzungen ausgegangen.
Der 'LIKE'-Abgleich war leider auch nicht erfolgreich, weder mit Feld4 vorne noch hinten.
Den ursprünglichen Code habe ich in Crystal Reports generiert, weil da noch etwas komplexe Joins zwischen neun oder zehn verschiedenen Datenbankfeldern enthalten sind und ich mir als Anfänger mit der grafischen Oberfläche von CR einfacher tat ;-)
 
Nun du kannst ja einen einfachen Select nur auf die Spalte machen und dann mal mit LIKE im WHERE-Teil testen wann das richtige Ergebnis kommt. Ich hab das so interpretiert das die Lieferscheinnummer ein numerischer Wert ist, in varchar konvertiert wird und dann als String in dem längeren String Feld4 gesucht wird. Dei Wildcards % besagen das vorne und hinten in Feld4 noch Text stehen kann. Wenn Feld4 ein Textformat hat könnte das z.B. ein Problem darstellen.
 
Nun du kannst ja einen einfachen Select nur auf die Spalte machen und dann mal mit LIKE im WHERE-Teil testen wann das richtige Ergebnis kommt. Ich hab das so interpretiert das die Lieferscheinnummer ein numerischer Wert ist, in varchar konvertiert wird und dann als String in dem längeren String Feld4 gesucht wird. Dei Wildcards % besagen das vorne und hinten in Feld4 noch Text stehen kann. Wenn Feld4 ein Textformat hat könnte das z.B. ein Problem darstellen.

Also verstanden habe ich den Code schon, leider funktioniert es trotzdem nicht.
 
Wenn er nicht funktioniert gibt es eine Fehlermeldung, du hast bisher keine gezeigt. Wenn er nicht das tut was du erwartest gibt es eine Ansatzpunkte die ich schon aufgezeigt habe (z.B. bedingt durch Datentypen). Hast du den Test im WHERE-Teil gemacht? Dann poste bitte einen Ausgangsdatensatz, den Select und das Ergebnis oder den Fehler.
 
Abfrage:


SELECT

CONVERT( VARCHAR, "Lieferschein"."Nummer" ) AS CONTRACTID,
"Projekte"."Feld27" AS EVENTID,
case
when "Lieferschein"."Feld4" IS NOT NULL AND "Lieferschein"."Feld4" <> ''
then
"Lieferschein"."Feld4"
else
'A000000000'
END AS PARENTID,
"Kunden"."Nummer" AS CUSTOMERID,
case
when "Projekte"."Feld27" <> '' and "Angebot"."AuftragsNummer" <> '' and "Angebot"."AuftragsNummer" NOT IN ("Lieferschein"."AuftragsNummer") then 60
when "RA"."BezSumme" >0 and "RA"."RNummer" = "Rechnung"."Nummer" and "Rechnung"."AuftragsNummer" = "Lieferschein"."AuftragsNummer" then 80
when "Projekte"."Feld27" <> '' and "Lieferschein"."Nummer" <> '' then 70
else
50 END AS "STATUS",
--case
--when "Lieferschein"."Feld22" is not null and "Lieferschein"."Feld22" <> '' then "Lieferschein"."Feld22"
--else
--"Kunden"."Firma1" END AS AUSSTELLERNAME,
case
when "Artikel"."Code" = 80684454 OR "Artikel"."Code" = 221232221 OR "Artikel"."Code" = 40487905
then
3
when "Lieferschein"."Feld4" LIKE '%' + CONVERT (varchar, "Lieferschein"."Nummer") + '%'
then
2
else
0
END AS AUSSTELLERTYP,
-- "Kunden"."Firma1" AS FIRMA1,
-- '' AS FIRMA2,
-- '' AS FIRMA3,
"Kunden"."Staat" AS NATION,
"Lieferschein"."Feld9" AS BRANCHE,
'' AS PRODUCTID,
'' AS HALLE,
case
when "Artikel"."Code" in (1248135961,77358996,207181214,18828161,312612275,44803955,9921876,2435895,647465203,182239138,1394525681,1719572661,1596004288,1789710139,2056632963,937830658,1318856389,5210018,1108252756,1458550072,20412174,1790216106,24246188,230121164)
then
'E'
when CHARINDEX ( 'KOPFSTAND', "Lieferschein"."Notiz" ) > 0
then
'K'
else
'R'
END AS STANDTYP,
'R' AS STANDFORM,
case
when "Artikel"."Code" in (15271170,1494123867,25528178) then 99
when "Lieferschein"."Feld3" <> 0 or "Lieferschein"."Feld3" is not null then "Lieferschein"."Feld3"
else
"Artikel"."Breite" * "Artikel"."Länge" END AS FLAECHE,
"Artikel"."Breite" AS BREITE,
"Artikel"."Länge" AS TIEFE,
CONVERT( VARCHAR, "Lieferschein"."Feld19" ) + "Lieferschein"."Feld64" AS STANDNUMMER,
case
when "Artikel"."Code" in (15271170,1494123867,25528178) and "Lieferschein"."Feld21" = 1 then convert(nvarchar(max),"Lieferschein"."Notiz") + 'DOPPELBUCHER ' + "Lieferschein"."Feld29"
when "Artikel"."Code" in (15271170,1494123867,25528178) then convert(nvarchar(max),"Lieferschein"."Notiz") + ' ' + "Lieferschein"."Feld29"
when "Lieferschein"."Feld21" = 1 then 'DOPPELBUCHER ' + "Lieferschein"."Feld29"
when "Artikel"."Code" = 1546629825 and "Lieferschein"."Feld21" = 1 then convert(nvarchar(max),"Lieferschein"."Notiz") + 'DOPPELBUCHER ' + "Lieferschein"."Feld29"
when "Artikel"."Code" = 1546629825 then convert(nvarchar(max),"Lieferschein"."Notiz") + ' ' + "Lieferschein"."Feld29"
when "Artikel"."Code" in (2017174173, 991331374) and "Lieferschein"."Feld21" = 1 then convert(nvarchar(max),"Lieferschein"."Notiz") + 'DOPPELBUCHER ' + "Lieferschein"."Feld29"
when "Artikel"."Code" in (2017174173, 991331374) then convert(nvarchar(max),"Lieferschein"."Notiz") + ' ' + "Lieferschein"."Feld29"
else
"Lieferschein"."Feld29" END AS KOMMENTAR
FROM (((((("WorkM001"."dbo"."Lieferschein" "Lieferschein" LEFT OUTER JOIN "WorkM001"."dbo"."Kunden" "Kunden" ON "Lieferschein"."SDObjMemberCode"="Kunden"."Code")
LEFT OUTER JOIN "WorkM001"."dbo"."Projekte" "Projekte" ON "Lieferschein"."ProjektCode"="Projekte"."Code")
LEFT OUTER JOIN "WorkM001"."dbo"."Angebot" "Angebot" ON "Lieferschein"."AuftragsNummer"="Angebot"."AuftragsNummer")
LEFT OUTER JOIN "WorkM001"."dbo"."Positionen" "Positionen" ON "Lieferschein"."Code"="Positionen"."BZObjMemberCode")
LEFT OUTER JOIN "WorkM001"."dbo"."Artikel" "Artikel" ON "Positionen"."ArtikelCode"="Artikel"."Code")
LEFT OUTER JOIN "WorkM001"."dbo"."Rechnung" "Rechnung" ON "Angebot"."AuftragsNummer"="Rechnung"."AuftragsNummer")
LEFT OUTER JOIN "WorkM001"."dbo"."RA" "RA" ON "Rechnung"."Code"="RA"."RCode"
where Projekte.Feld27 is not null and Projekte.Feld27 <> '' AND "ARTIKEl"."CODE" IN ( 157222894,15236346,612063585,514583747,23876273,140385500,528096454,1283729351,229130160,24472100,20025225,31179755,524890231,39819682,2365352,164111254,1138563448,536207553,709572175,1024525067,1182435028,434143163,885384794,191162130,1388836838,23383245,745156986,1805513715,1649287679,193245222,1248135961,77358996,207181214,18828161,312612275,44803955,647465203,182239138,1394525681,1719572661,2056632963,937830658,1108252756,1458550072,20412174,1790216106,2017174173,991331374,40487905,80684454,221232221,15271170,1494123867,25528178) and Positionen.BZObjType = 8
order by AUSSTELLERTYP desc

Ausgabe:

CONTRACTID | EVENTID |PARENTID | CUSTOMERID | STATUS | AUSSTELLERTYP | NATION | BRANCHE |PRODUCTID | HALLE | STANDTYP | STANDFORM | FLAECHE |BREITE | TIEFE | STANDNUMMER | KOMMENTAR
180657 |4HA2018 |180656 | 111348 | 70 | 3 | D | Weitere Institutionen | | | R | R | 0 | 0 | 0 | 45 |
172596 2BE22018 172595 100070 70 3 D NULL R R 0 0 0 30
181432 2MUA2019 181340 117916 70 3 D NULL R R 0 0 0 NULL
180880 5NU2019 181651 118692 70 3 D NULL R R 0 0 0 NULL
180521 4HA2018 180520 104297 70 3 D Weitere Institutionen R R 0 0 0 34
172440 2BE22018 172439 115737 70 3 D Unternehmen R R 0 0 0 2 gleicher Standplatz wie BE 2, 2017
172597 2BE22018 172595 110742 70 3 D NULL R R 0 0 0 30
181320 4HA2018 180575 102155 70 3 D NULL R R 0 0 0 82
181340 2MUA2019 181319 117855 70 3 D NULL R R 0 0 0 NULL
181778 4HA2018 180575 10841 70 3 D NULL R R 0 0 0 82
181221 5NU2019 181220 116049 70 3 D NULL R R 0 0 0 NULL
181232 4ST12019 A000000000 10088 70 0 D NULL R R 9 3 3 NULL
181255 10HA2019 A000000000 105174 70 0 D NULL E R 12 4 3 NULL

Besser bekomme ich das jetzt nicht hin. Durch die letzten beiden ist aber zu sehen, dass es den AUSSTELLERTYP 2 nicht gibt, der müsste aber da sein, weil ja in den ersten 11 Datensätzen das dritte Feld (PARENTID) gefüllt ist und sich diese Nummern auch in den restlichen 1048 Zeilen finden lassen. Der AUSSTELLERTYP ist die Zahl vor 'D'
 
Dein CASE für AUSSTELLERTYP prüft die Bedingungen in der Reihenfolge wie sie im Code stehen. In den meisten Fällen deines Ergebnisses ist Aritkel.Code einer der genanten Werte, das Ergebnis also 3 und das CASE an dieser Stelle zu Ende.

Lieferschein.Feld4 und Lieferschein.Nummer sind gleich lang und in deinen Ergebnis-Datensätzen in keinem Fall identisch. Also kann dein CASE ab hier immer nur 0 liefern, was es auch tut. Der Code liefert also ein erwartetes Ergebnis.
 
Dein CASE für AUSSTELLERTYP prüft die Bedingungen in der Reihenfolge wie sie im Code stehen. In den meisten Fällen deines Ergebnisses ist Aritkel.Code einer der genanten Werte, das Ergebnis also 3 und das CASE an dieser Stelle zu Ende.

Lieferschein.Feld4 und Lieferschein.Nummer sind gleich lang und in deinen Ergebnis-Datensätzen in keinem Fall identisch. Also kann dein CASE ab hier immer nur 0 liefern, was es auch tut. Der Code liefert also ein erwartetes Ergebnis.
Ich habe die Where-Bedingung noch minimal ergänzt und zwar um die Bedingung Lieferschein.Nummer = 180656

CONTRACTID EVENTID PARENTID CUSTOMERID STATUS AUSSTELLERTYP NATION BRANCHE PRODUCTID HALLE STANDTYP STANDFORM FLAECHE BREITE TIEFE STANDNUMMER KOMMENTAR
180656 4HA2018 A000000000 116449 70 0 D Hochschule/Akademie R R 0 0 0 45

Hier ist der AUSSTELLERTYP 0, er sollte aber 1 sein, weil die Lieferschein.Nummer im ersten Datensatz als PARENTID enthalten ist. Somit handelt es sich leider nicht um das von mir erwartete, bzw. erwünschte Ergebnis.
 
"Lieferschein"."Nummer" = 180656
"Lieferschein"."Feld4" = A000000000
Meinst du mit "ersten Datensatz" eine andere Zeile? Das muss man ihm dann auch explizit sagen bzw. diese Daten dazu joinen. Er bezieht sich zunächst immer auf den Datensatz der selben Zeile.
 
Der hier
CONTRACTID EVENTID PARENTID CUSTOMERID STATUS AUSSTELLERTYP NATION BRANCHE PRODUCTID HALLE STANDTYP STANDFORM FLAECHE BREITE TIEFE STANDNUMMER KOMMENTAR
180656 4HA2018 A000000000 116449 70 0 D Hochschule/Akademie R R 0 0 0 45

sollte auf diesen

180657 |4HA2018 |180656 | 111348 | 70 | 3 | D | Weitere Institutionen | | | R | R | 0 | 0 | 0 | 45 |

referenzieren.

Erster Datensatz, CONTRACTID: 180656
Zweiter Datensatz, PARENTID: 180656
Ergo Erster Datensatz gewünschtes Ergebnis für AUSSTELLERTYP: 2

Bitte entschuldige, dass ich das nicht gleich eindeutig formuliert habe.
 
Werbung:
Die Lösung war dann doch relativ einfach...

when CONVERT (varchar, "Lieferschein"."Nummer") in ( select Feld4 from Lieferschein where Feld4 is not NULL )
then
2
 
Zurück
Oben