Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Datenbanken

Mitglied: boesi666

boesi666 (Level 1) - Jetzt verbinden

23.12.2011 um 08:30 Uhr, 5290 Aufrufe, 9 Kommentare

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
Mitglied: it-frosch
23.12.2011 um 08:47 Uhr
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
Bitte warten ..
Mitglied: Indrador
23.12.2011 um 09:17 Uhr
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ß
Bitte warten ..
Mitglied: boesi666
23.12.2011 um 10:20 Uhr
das werde ich heute mal probieren...
Bitte warten ..
Mitglied: boesi666
23.12.2011 um 19:52 Uhr
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

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...
Bitte warten ..
Mitglied: Indrador
23.12.2011 um 21:20 Uhr
Achso Access, ich bin von einer richtigen Datenbank ausgegangen. ;)

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

Gruß
Bitte warten ..
Mitglied: Biber
24.12.2011 um 00:17 Uhr
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
Bitte warten ..
Mitglied: boesi666
24.12.2011 um 13:27 Uhr
ja, danke, da steht aber nicht, wie man bei dem rückgabewert false auch in gleichen moment einen wert setzen kann...
Bitte warten ..
Mitglied: boesi666
24.12.2011 um 13:34 Uhr
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
01.
 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 hin und wieder...
Bitte warten ..
Mitglied: Biber
24.12.2011 um 14:02 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

VB for Applications
Mehrere Spalten Durchsuchen und Ergebnisse in neuer Tabelle Ausgeben (3)

Frage von Mr.Green zum Thema VB for Applications ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...