boesi666
Goto Top

Tabellenergebnisse mit into in neue tabelle schreiben, aber leere ergebnisse mit 0 auffüllen

Moin zusammen, nach der echt tollen Hilfe bei meinen ersten beitrag war ich sehr begeistert und traue mich gleich mal eine 2. Frage zu stellen, die so ein bisschen als folge der ersten lösung nun auftritt... freue mich, wenn Ihr mir nen tipp geben könnt.

ich schiebe hier ergebnisse in eine neu tabelle temp_DB_name

SELECT
a.id as Art_Id,
a.EAN ,
a.Artikel_Nr ,
a.Artikel_Bezeichnung,
a.Bestand as Soll_Menge,
i.Menge as gezählt_Menge,
(a.Bestand - i.Menge ) as Differenz

into " & temp_DB_name & " FROM

Artikel a left JOIN (SELECT Inventur.ean, Sum( Inventur.menge ) as Menge from Inventur group by ean) i on i.ean = a.ean where a.id > 0 " & LAGERARTIKEL_Kurz & POSARTIKEL_Kurz & " and ( i.ean is null or a.Bestand <> i.Menge )

(sorry, dass das hier nicht so schön in der vorschau aussieht)

mein problem sind diese beiden Felder, wenn sie in die neue tabelle geschrieben werden:
i.Menge as gezählt_Menge,
(a.Bestand - i.Menge ) as Differenz

Wenn i.Menge nicht vorhanden ist, da feld leer, soll beim schreiben mit der into anweisung in die neue tabelle wenigstens eine 0 reingeschreiben werden (und nicht nix NULL)

Problem 2: wenn i.Menge bei der abfrage nix beinhalten ist bei (a.Bestand - i.Menge ) as Differenz leider immer auch das Ergebnis NULL (wenn a.Bestand aber z.b. 30 wäre, und i.Menge 0 (oder NULL), soll Differenz aber eben auch 30 sein. Durch NULL im feld i.Menge kommt die Rechenoperation aber leider durcheinander.

ich kann zwar nach erstellen der neuen tabelle alle leeren felder mit 0 auffüllen, indem ich ein update temp_DB_name set gezählt Menge= 0 where gezählt_Menge is Null ausführe, aber ist nicht die feine art, und ausserdem löse ich das problem mit dem automatisch zu errechnenden feld differenz beim schreiben der neuen tabelle auch nicht sauber.

Es gibt ja solche DEFAULT Anweisung beim erstellen eines feldes, aber wie das bei dieser tabellen erstellung on thy fly klappt, weiss ich nicht

Content-ID: 178052

Url: https://administrator.de/contentid/178052

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

it-frosch
it-frosch 23.12.2011 um 08:47:01 Uhr
Goto Top
Guten Morgen boesi666,

ich würde an deiner Stelle die temporäre Tabelle mit create table .... erstellen und anschließend wieder löschen.
Dann kannst du auch die Felder für Bestand und Menge auf Default 0 setzten und solltest das Problem los sein.

grüße vom it-frosch
Indrador
Indrador 23.12.2011 um 09:17:58 Uhr
Goto Top
Hi,

je nach SQL Variante kannst du folgendes im Select benutzen:

isnull(i.Menge,0) as gezählt_Menge,
isnull((a.Bestand - i.Menge ),a.Bestand) as Differenz

ifnull(i.Menge,0) as gezählt_Menge,
ifnull((a.Bestand - i.Menge ),a.Bestand) as Differenz

Das ersetzt dann NULL-Werte mit vorgegebenen Werten, diese können sowohl Text als auch Zahlen sein.

Gruß
boesi666
boesi666 23.12.2011 um 10:20:21 Uhr
Goto Top
das werde ich heute mal probieren...
boesi666
boesi666 23.12.2011 um 19:52:52 Uhr
Goto Top
ja hat leider mit den vorschlag nicht geklappt. das liegt aber sicher daran, dass es sich mit visual basic und ansprechen de access db oft nicht ganz so schick verhält, wie auf aktuellen mysql systemen face-sad

hab das so beibehalten wie bishher und surch 2. befehl nach erzeugung der tabelle die diefferenz nachträglich errechnen lassen und vorhher noch mit nen befehl eben die null felder mit 0 aufgefüllt...
Indrador
Indrador 23.12.2011 um 21:20:16 Uhr
Goto Top
Achso Access, ich bin von einer richtigen Datenbank ausgegangen. ;)

Versuch mal das:
http://www.techonthenet.com/access/functions/advanced/isnull.php

Gruß
Biber
Biber 24.12.2011 um 00:17:26 Uhr
Goto Top
Moin boesi666,

nur als Ergänzung zu Indrador.

-> die Änderung in deinem Statement sollte hinauslaufen auf ein
SELECT  ...
.. INTO....
FROM 
Artikel a left JOIN (SELECT Inventur.ean, 
                        IIF(IsNull(Sum( Inventur.menge )), 0, Sum( Inventur.menge ))  as Menge 
             from Inventur ....

Bitte verwende auch du in Zukunft die Codeformatierung und vor allem gib das verwendete Datenbanksystem an.

Denn es gibt entscheidende Syntaxunterschiede- wie du selbst hier erlebt hast - zwischen dem SQL von mySQL, Access, Oracle oder MSSQL.

Grüße
Biber
boesi666
boesi666 24.12.2011 um 13:27:15 Uhr
Goto Top
ja, danke, da steht aber nicht, wie man bei dem rückgabewert false auch in gleichen moment einen wert setzen kann...
boesi666
boesi666 24.12.2011 um 13:34:44 Uhr
Goto Top
Zitat von @Biber:
Moin boesi666,

nur als Ergänzung zu Indrador.

-> die Änderung in deinem Statement sollte hinauslaufen auf ein
SELECT  ...
> .. INTO....
> FROM 
> Artikel a left JOIN (SELECT Inventur.ean, 
>                         IIF(IsNull(Sum( Inventur.menge )), 0, Sum( Inventur.menge ))  as Menge 
>              from Inventur ....
> 

Bitte verwende auch du in Zukunft die Codeformatierung und vor allem gib das verwendete Datenbanksystem an.

Blöde frage, wie macht Ihr das beim verfassen eines beitrages, damit es in der codeformatierung dargestellt wird? tragt ihr vorhher und hinterher per hand
 und  
ein?
Denn es gibt entscheidende Syntaxunterschiede- wie du selbst hier erlebt hast - zwischen dem SQL von mySQL, Access, Oracle oder
MSSQL.

ja, es ist eine access db, die ich in meinen vb6 Projekt mit Microsoft.Jet.OLEDB.4.0 ansprechen tue uns meine Abfagen dann immer so starte. Bei anderen Arbeiten arbeite ich mit einer mysql DB unter linux, wobei ich dann in der regel zwischen dieser mysql DB und der access db hier mit den befehlen fast immer identische arbeitsweisen habe...aber kleine unterschiede gibt es dann eben doch face-sad hin und wieder...
Biber
Biber 24.12.2011 um 14:02:07 Uhr
Goto Top
Moin boesi666,

wobei .... in der regel zwischen dieser mysql DB und der access db ... fast immer identische arbeitsweisen habe

Ich sach ma' so....
Eine schnell skizzierte Access-Desktop-Datenbank als proof-of-concept für das Design einer "echten" Datenbank...
-> das geht in Ordnung.
Aber es sollte und darf nicht angestrebt werden, die vollständige Funktionalität nachbilden zu wollen.
Access war schon immer ein ungeliebtes Redmonder Stiefkind, und der Implementierungsumfang des JET-SQL hatte immer nur Demo-Charakter. Gedacht dafür, Heimanwendern die Angst vor Datenbanken zu nehmen oder auch um Appetit auf eine "echte" Datenbank zu machen.

Steck also in diese Access-Entwicklung nicht zuviel Aufwand rein.
Denn so viele Verrenkungen brauchst du später unter mySQL gar nicht machen.

Auch dieses ganze Gewurschtele mit
"IIF(Isnull(bla), dann 0, sonst bla)"
..reduziert sich unter mySQL wieder auf ein simples
"COALESCE(bla, 0)"

Die Frage nach der Codeformatierung hast du dir eigentlich eindrucksvoll selbst beantwortet.

Wenn dann für diesen Beitrag keine weiteren Fragen offen sind, dann...
-> Haken dran

und Frohes Fest
Biber