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, 1496 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
Ähnliche Inhalte
Outlook & Mail
gelöst Outlook 2013 Emails Kontakten zuordnen (1)

Frage von xbast1x zum Thema Outlook & Mail ...

Microsoft Office
gelöst Daten (Tabelle) aus E-Mail nach Excel übertragen (6)

Frage von kaiuwe28 zum Thema Microsoft Office ...

Microsoft Office
Office 365 anmelde Daten werden nicht gespeichert

Frage von Hans3003 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
DSL, VDSL
gelöst DSL 200m verlängern (16)

Frage von Angela44 zum Thema DSL, VDSL ...

LAN, WAN, Wireless
Per Script auf UniFi-controller zugreifen und WPA2-Key ändern (11)

Frage von Winfried-HH zum Thema LAN, WAN, Wireless ...

Windows Server
SBS 2011 Standard virtualisieren (11)

Frage von HeinrichM zum Thema Windows Server ...

Exchange Server
gelöst DHCP Sever MS Server 2012 Problem (10)

Frage von Florian86 zum Thema Exchange Server ...