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, 1520 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 ..
Ähnliche Inhalte
VB for Applications
gelöst Zuordnen von Daten per VBA aus zweitem anderen Tabellenblättern (4)

Frage von Semmy1 zum Thema VB for Applications ...

Outlook & Mail
gelöst Suche Möglichkeit in Outlook Mails einem Projekt zu zuordnen (3)

Frage von Barthinator zum Thema Outlook & Mail ...

Batch & Shell
gelöst Bestimmte Daten aus CSV per Windows BATCH Datei in .txt Format schreiben lassen. (9)

Frage von freshman2017 zum Thema Batch & Shell ...

Google Android
Google: Nexus-6-Nutzer bekommen Downgrade und verlieren alle Daten

Link von BassFishFox zum Thema Google Android ...

Neue Wissensbeiträge
Batch & Shell

Batch als Dienst bei Systemstart ohne Anmeldung ausführen

(1)

Tipp von tralveller zum Thema Batch & Shell ...

Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

(1)

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Peripheriegeräte

Was beachten bei der Wahl einer USV Anlage im Serverschrank

(9)

Tipp von zetboxit zum Thema Peripheriegeräte ...

Heiß diskutierte Inhalte
Exchange Server
Exchange 2016 Standard Server 2012 R2 Hetzner Mail (36)

Frage von Datsspeed zum Thema Exchange Server ...

Verschlüsselung & Zertifikate
Mit Veracrypt eine zweite interne (non-system) Festplatte verschlüsseln (10)

Frage von Bernulf zum Thema Verschlüsselung & Zertifikate ...

Windows 7
Lokales Adminprofil defekt (9)

Frage von Yannosch zum Thema Windows 7 ...

Internet Domänen
Nameserver ein Geist? (8)

Frage von zelamedia zum Thema Internet Domänen ...