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

Zuordnen von indirekt verknüpften Daten

Frage Entwicklung VB for Applications

Mitglied: LordXearo

LordXearo (Level 2) - Jetzt verbinden

22.05.2014, aktualisiert 23.05.2014, 1483 Aufrufe, 5 Kommentare

Hallo zusammen,

ich könnte etwas Hilfe bei der Erstellung eines Skripts ODER einer SQL-Abfrage gebrauchen ( Falls es bereits mit einer SQL-Abfrage lösbar ist)

Aus Excel wird eine MS SQL Datenbank abgefragt. Hier nur die wesentlichen Daten:

| BELEG-ID | Referenz-ID | Belegart | Belegnummer
12 | 23 | Rechnung | XxXxXxXx
33 | 14 | Rechnung | XxXxxXxX
23 | 3 | Lieferschein | XxxXxXxX
3 | -- | Auftragsbestägiung | XxXxXxXx
14 | 5 | Lieferschein | XxXxXxX
5 | -- | Auftragsbestätigung | XxXXxxX

Nun soll es möglich sein von einer bestimmten Rechnung (anhand der Belegnummer), auf die da zugehörige Auftragsbestätigung (Belegnummer) zugelangen. Ich konnte jetzt anhand der Datenbank nur erkennen, das die Belege nur auf diese weise Verknüpft sind (Rechnung <--> Lieferschein <--> Auftragsbestätigung). Es gibt auch Belege mit mehreren Zwischenschritten (Stornorechnung,Angebot,Gutschrift...)

Bisher habe ich ein "dummes" Skript, das immer der Reihe nach die IDs zwishenspeichert und erneut einen Filter über die ganzen Daten setzt. Die Zuordnung dauert dann für einen Beleg bis zu 10 Sekunden. Bei über 10.000 Datensätzen dauert das einfach zu lange.

Ich hoffe das ist einigermaßen verständlich, sonst versuche ich es nochmal klar zu machen.

Edit:
Ich denke ich bekomme das ganze mit mehreren Hilfsspalten über SVERWEIS gelöst, werd ich mich morgen mal dran setzen.


Viele Grüße

Xearo
Mitglied: colinardo
22.05.2014, aktualisiert um 17:23 Uhr
Hallo Xaero,
also ich habe das ganze hier mal mit einer QueryTable und einer Verbindung mit einem SQL-Server getestet.
Ich weiß nicht ob ich dich korrekt verstanden habe, aber eigentlich sollte hier doch folgende SQL-Query reichen:
SELECT * FROM Rechnungen WHERE Belegnummer = 12345 AND Belegart = 'Auftragsbestätigung'
wenn man dann eine QueryTable im Sheet hat lässt sich die SQL-Query so auf die DB absetzen:
01.
Dim sheet As Worksheet 
02.
Set sheet = Worksheets(1) 
03.
strBelegnummer = "12345" 
04.
sheet.ListObjects("NamedesListObjects").QueryTable.CommandText = "Select * From TestDB.dbo.Rechnungen where Belegnummer = " & strBelegnummer & " and Belegart = 'Auftragsbestätigung'" 
05.
sheet.ListObjects("NamedesListObjects").QueryTable.Refresh
Dann enthält die Tabelle nur noch die gefundene AB zur Belegnummer.

Die Belegnummer lässt sich ja in eine Variable setzen die man dann z.B. in eine Zelle oder eine Textbox eingeben kann und dann die Suche via Button gestartet wird.

Alternativ lässt sich natürlich auch über ein Makro die AB suchen, das wäre auch kein Problem:
http://www.administrator.de/contentid/222871

Eine Hilfsspalte würde natürlich auch reichen.

Grüße Uwe
Bitte warten ..
Mitglied: LordXearo
22.05.2014 um 19:52 Uhr
Hallo Uwe,

ich glaube du hast mich nur so halb verstanden. Gegeben ist die Belegnummer einer Rechnung.

Wie die passende Belegnummer zu der Auftragsbestätigung dieser Rechnung lautet, muss rausgefunden werden. Die Rechnung steht zur Auftragsbestätigung in keinem direkten zusammenhang. Aber von dieser Rechnung, gibt es eine "verlinkung" (RefID) zum Lieferschein, und dieser Lieferschein hat wiederum eine RefID die auf die Auftragsbestätigung zeigt.

Hätte man nun auch noch eine "Stornorechnung", dann geht diese "verfolgung" noch eine Ebene tiefer. (Stornorechnung-->Rechnung-->Lieferschein-->Auftragsbestätigung-->Angebot)

In der Tabelle, wo die Belege abgespeichert sind (Rechnung,Lieferschein etc.), gibt es keine direkte Beziehung zu den einzelnen Belege die zu einem Auftrag gehören.

Gruß
Xearo
Bitte warten ..
Mitglied: colinardo
LÖSUNG 22.05.2014, aktualisiert 23.05.2014
Ah OK, nun verstanden
Dafür habe ich dir mal ein Makro geschrieben, du kannst das Demo-Sheet hier herunterladen

Grüße Uwe
Bitte warten ..
Mitglied: LordXearo
23.05.2014 um 08:23 Uhr
WoW, Klasse =)

Genau so sollte es sein. Jetzt muss ich das nur noch so umbauen, dass das Makro eine ganze Spalte von Belegnummern abarbeitet und das Ergebnis in eine Spalte einträgt.

Hast mir sehr gut geholfen, Danke.

Gruß

Xearo
Bitte warten ..
Mitglied: LordXearo
23.05.2014, aktualisiert um 10:22 Uhr
Hier noch meine verschlimmbesserte Version.

01.
Sub FindAB() 
02.
    Dim ws As Worksheet, loDaten As ListObject, rngBelege As Range, rngX As Range, rngBelegID As Range, rngID As Range, strRechBeleg As String 
03.
    Dim i As Integer 
04.
    ' Worksheet setzen 
05.
    Set ws = Worksheets("AB-Nr. Abfrage") 
06.
    'ListObject referenzieren 
07.
    Set loDaten = ws.ListObjects("Tabelle") 
08.
    For i = 2 To 30000 
09.
NaechsteZeile: 
10.
        'Zelle in der der Suchwert steht 
11.
        strRechBeleg = ws.Range("L" & i).Value 
12.
        If strRechBeleg = "" Then 
13.
            Exit Sub 
14.
        End If 
15.
        'Spalte in der die Belegnummern stehen 
16.
        Set rngBelege = loDaten.DataBodyRange.Cells(, 10).EntireColumn 
17.
        'Spalte in der die BELEG-ID steht 
18.
        Set rngBelegID = loDaten.DataBodyRange.Cells(, 1).EntireColumn 
19.
        'Finde Belegnummer der Rechnung 
20.
        Set rngX = rngBelege.Find(what:=strRechBeleg, LookAt:=xlWhole, LookIn:=xlValues) 
21.
        'Wenn Rechnung gefunden wurde ... 
22.
        If Not rngX Is Nothing Then 
23.
            Set rngX = rngX.Offset(0, -9) 
24.
            'Iteriere so lange bis eine Auftragsbestätigung gefunden wurde 
25.
            Do 
26.
                refID = rngX.Offset(0, 1).Value 
27.
                Set rngID = rngBelegID.Find(what:=refID, LookAt:=xlWhole, LookIn:=xlValues) 
28.
                If rngID Is Nothing Then 
29.
                    'MsgBox "Auftragsbestätigung konnte nicht gefunden werden", vbExclamation 
30.
                    ws.Range("M" & i) = "Auftragsbestätigung konnte nicht gefunden werden" 
31.
                    i = i + 1 
32.
                    GoTo NaechsteZeile 
33.
                    'Exit Sub 
34.
                End If 
35.
                Set rngX = rngID 
36.
            Loop Until rngX.Offset(0, 3).Value = "Auftragsbestätigung" 
37.
             
38.
            If Not rngX Is Nothing Then 
39.
                'MsgBox "Die Belegnummer der Auftragsbestätigung lautet: " & rngX.Offset(0, 9).Value 
40.
                ws.Range("M" & i) = rngX.Offset(0, 9).Value 
41.
            End If 
42.
         
43.
        Else    'Rechnung wurde nicht gefunden 
44.
            'MsgBox "Rechnungsbelegnummer wurde nicht gefunden!", vbExclamation 
45.
            ws.Range("M" & i) = "Rechnungsbelegnummer wurde nicht gefunden!" 
46.
        End If 
47.
    Next i 
48.
End Sub
In Spalte L stehen die zu suchenden Rechnungsbelegnummern.
In Spalte M werden die gefundenen AB Nummern eingetragen
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Cloud-Dienste
Amazon: Dieser Lkw transportiert Daten in die Cloud (1)

Link von Kraemer zum Thema Cloud-Dienste ...

VB for Applications
Excel VBA Sortierung von Daten (5)

Frage von easy4breezy zum Thema VB for Applications ...

Backup
gelöst Datensicherung von Daten, auf denen die ganze Zeit gearbeitet wird (8)

Frage von Windows11 zum Thema Backup ...

Microsoft Office
gelöst Aus Outlook 2013 Daten aus Tabellenfeldern in Excel übertragen (9)

Frage von ich2110 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

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 ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

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

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