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-Key: 178052

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

Printed on: April 18, 2024 at 06:04 o'clock

Member: it-frosch
it-frosch Dec 23, 2011 at 07:47:01 (UTC)
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
Member: Indrador
Indrador Dec 23, 2011 at 08:17:58 (UTC)
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ß
Member: boesi666
boesi666 Dec 23, 2011 at 09:20:21 (UTC)
Goto Top
das werde ich heute mal probieren...
Member: boesi666
boesi666 Dec 23, 2011 at 18:52:52 (UTC)
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...
Member: Indrador
Indrador Dec 23, 2011 at 20:20:16 (UTC)
Goto Top
Achso Access, ich bin von einer richtigen Datenbank ausgegangen. ;)

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

Gruß
Member: Biber
Biber Dec 23, 2011 at 23:17:26 (UTC)
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
Member: boesi666
boesi666 Dec 24, 2011 at 12:27:15 (UTC)
Goto Top
ja, danke, da steht aber nicht, wie man bei dem rückgabewert false auch in gleichen moment einen wert setzen kann...
Member: boesi666
boesi666 Dec 24, 2011 at 12:34:44 (UTC)
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...
Member: Biber
Biber Dec 24, 2011 at 13:02:07 (UTC)
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