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

Dynamische Access-Datenbank für heteroegene Workstation

Frage Microsoft Microsoft Office

Mitglied: ichbinhier

ichbinhier (Level 1) - Jetzt verbinden

24.11.2010 um 15:55 Uhr, 6453 Aufrufe, 13 Kommentare

Access Datenbank programmiert in Access 2003 32bit auf Windows XP
eingesetzt aber auf Windows XP mit/ohne Access Runtime (2007 - 2010) - mal 32bit/64bit

Hallo,

ich habe eine kniffliche Aufgabe für eine von mir programmierte Access-Datenbank und zwar wird diese nach der Kraut & Rüben-Taktik benutzt, also auf Windows XP mit Access Runtime oder das große Access, auf Windows 7 32/64 bit mit Office 2007 32bit und zum Schluss auf Windows 7 64bit mit Office 2010 64bit.

Irgend wie muss man ständig bei neuen Releases 8 verschiedene Versionen machen und das nervt so allmählig. Vorallendingen die Kollegen, wenn gleich beim Starten der Datenbank ein Fehler entsteht, weil dann doch irgend etwas vergessen wurde zu hinterlegen.

Gibt es eine Möglichkeit beim Starten der Datenbank alle relevanten Daten also Prozessorstruktur und Office-Version zu ermitteln und danach die VBA-Verweise auf DAO 2.5 / 3.5 oder 3.6 zu konfigurieren und natürlich bei Funktionsdeklaration PTRSAFE hinzu zu fügen.

Ich weiß nicht so recht, wo ich da genau ansetzen soll.

Schöne Grüße
Axel
Mitglied: dog
24.11.2010 um 16:18 Uhr
Ich weiß nicht so recht, wo ich da genau ansetzen soll.

Ein Tipp: Nicht da, wo du grade ansetzen willst.
Die Lösung heißt hier wegwerfen und richtig machen.
Entweder webbasiert oder mit einem Programm was eine API für den DB-Zugriff benutzt.

Einem User einen direkten Zugriff auf eine Datenbank zu gewähren ist eine Unart von Microsoft und sollte nie benutzt werden.
Bitte warten ..
Mitglied: 83928
24.11.2010 um 16:23 Uhr
Ich weiß nicht so recht, wo ich da genau ansetzen soll.

Wäre es nicht viel, viel einfacher, das Ganze auf den kleinsten gemeinsamen Nenner zu bringen???
Bitte warten ..
Mitglied: ichbinhier
24.11.2010 um 18:30 Uhr
Hallo,

also Eure zynischen Bemerkungen sind jetzt nicht wirklich hilfreich. Da hätte ich mir das getippe auch sparen können.

@dog
Von Access & VBA auf webbasiert / API ist schon eine Hausnummer, die vor allen Dingen nicht jeder beherrscht.

Nicht jeder hat die Weisheit mit Löffeln gegessen, da wäre das Leben viel zu langweilig, darum habe ich mir gedacht.

Gibt es andere, die konstruktive Lösungen beizutragen haben.

Gruß Axel
Bitte warten ..
Mitglied: NetWolf
24.11.2010 um 20:07 Uhr
Moin Moin,

du hast eine Frontend / Backend Lösung laufen?

Wenn Ja:
- Backend ist eine Access 2003 Version mit allen Tabellen
- Frontend ist min. Access 2003 da es von allen Programmen genutzt werden kann
- die Access 2007 Runtime (kostenlos) ist auf ALLEN PCs installiert
- auch auf dem PC mit vollem Access wird die Runtime mit deinem Frontend geladen.

Wenn Nein:
- dringend auf Frontend / Backend umstellen und nur die eine Runtime 2007 für alle nutzen!
Alles andere ist tödlich, wie du gerade merkst.

Grüße aus Rostock
Wolfgang
(Netwolf)
Bitte warten ..
Mitglied: 83928
25.11.2010 um 07:42 Uhr
War durchaus nicht zynisch gemeint. Siehe Antwort von NetWolf.....
Bitte warten ..
Mitglied: ichbinhier
26.11.2010 um 07:09 Uhr
Guten Morgen,

ich bin auf den letzten Metern bis zum Ziel und habe es vorläufig geschafft, dass das Betriebssystem, die Prozessorarchitektur und Office-Version nicht mehr interessant sind für meine Datenbank. Kleine Schummeltricks waren natürlich erlaubt.

Stoße trotzdem dabei auf ein Problem und zwar das was eigentlich in aller erster Linie die beiden 32bit und 64bit Datenbanken von einander unterscheidet ist die Deklaration von Funktionen im Zugriff auf externe Bibliotheken und APIs.

01.
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
02.
Declare Function apiGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Bei 64bit muss ja zwischen Declare und Function PtrSafe und das habe ich schlaufüchsig so gemacht, dass ich genau diese Statements (mit und ohne PtrSafe) und die darauf aufbauenden Funktionen beim Starten der Datenbank lade, je nachdem was environ("PROCESSOR_ARCHITECTURE") mir so erzählt.

Also jetzt kurz und bündig - Module werden völlig korrekt geladen, nur kann ich beim Beenden der Datenbank das Modul nicht löschen, zumindest nicht aus dem Visual Basic Bereich. Im Navigationsfenster ist das Modul gelöscht.

Wie lösche ich jetzt nicht nur im Navigationsfenster das Modul, sondern auch im Visual Basic Fenster???

Grüße
Axel
Bitte warten ..
Mitglied: 83928
26.11.2010 um 08:18 Uhr
Zitat von ichbinhier:
Guten Morgen,
Hurra, ist Freitag ;)

ich bin auf den letzten Metern bis zum Ziel und habe es vorläufig geschafft, dass das Betriebssystem, die
Prozessorarchitektur und Office-Version nicht mehr interessant sind für meine Datenbank. Kleine Schummeltricks waren
natürlich erlaubt.

Stoße trotzdem dabei auf ein Problem und zwar das was eigentlich in aller erster Linie die beiden 32bit und 64bit
Datenbanken von einander unterscheidet ist die Deklaration von Funktionen im Zugriff auf externe Bibliotheken und APIs.

01.
> Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) 
02.
> As Long 
03.
> Declare Function apiGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize 
04.
> As Long) As Long 
05.
> 
Bei 64bit muss ja zwischen Declare und Function PtrSafe und das habe ich schlaufüchsig so gemacht, dass ich genau diese
Statements (mit und ohne PtrSafe) und die darauf aufbauenden Funktionen beim Starten der Datenbank lade, je nachdem was
environ("PROCESSOR_ARCHITECTURE") mir so erzählt.

Wie hast Du das gelöst? Lädst Du ein komplettes Modul dynamisch?
Wenn es sich nur um die 2 Api-Deklarationen handelt die angepasst werden müssen, bietet sich vllt auch die Methode 'insertLines' an
01.
Application.Modules("modul1").InsertLines 1, "option Explicit"

Also jetzt kurz und bündig - Module werden völlig korrekt geladen, nur kann ich beim Beenden der Datenbank das Modul
nicht löschen, zumindest nicht aus dem Visual Basic Bereich. Im Navigationsfenster ist das Modul gelöscht.


Wie lösche ich jetzt nicht nur im Navigationsfenster das Modul, sondern auch im Visual Basic Fenster???


zur Laufzeit kannst Du Module so löschen:
01.
Application.VBE.ActiveVBProject.VBComponents.Remove _ 
02.
    Application.VBE.ActiveVBProject.VBComponents("Modul2"))
Grüße
Axel

Ebenfalls Grüße
Bitte warten ..
Mitglied: ichbinhier
26.11.2010 um 10:00 Uhr
Hallo,

ja es ist Freitag. Ich freue mich auch.

Ja ich lade 2 Module dynamisch, je nachdem was mir Umgebungsvariablen als Architektur aussagen. Wobei dein Vorschlag auch nicht schlecht klingt.

Ich habe vor meinem eigentliche Startformular ein Formular gepackt, dass diesen Code aufruft.

01.
Private Sub Form_Open(Cancel As Integer) 
02.
     
03.
    On Error Resume Next 
04.
     
05.
    ' Bibliotheken einbinden 
06.
    Dim lib_vbe As Object 
07.
    Dim lib_dao As Object 
08.
    lib_vbe = Application.VBE.ActiveVBProject.References.AddFromGuid("{0002E157-0000-0000-C000-000000000046}", 5, 3) 
09.
 
10.
    ' DAO Bibliothek zum Datenbankzugriff 
11.
    Set lib_dao = Application.VBE.ActiveVBProject.References 
12.
    lib_dao.AddFromFile Application.CurrentProject.Path & "\DAO\dao2535.tlb" 
13.
     
14.
    func_ModulLoeschen ("mod_Allgemein") 
15.
    func_ModulLaden 
16.
     
17.
    DoCmd.OpenForm "frm_Main" 
18.
     
19.
    Cancel = True 
20.
 
21.
End Sub
01.
Public Function func_ModulLaden() 
02.
 
03.
    On Error Resume Next 
04.
 
05.
    Dim envstring As String 
06.
     
07.
    envstring = Environ("PROCESSOR_ARCHITECTURE") 
08.
     
09.
    If envstring = "x86" Then           ' 32bit System 
10.
     
11.
        Application.LoadFromText acModule, "mod_Allgemein", CurrentProject.Path & "\32bit.bas" 
12.
         
13.
    ElseIf envstring = "AMD64" Then        '64bit System 
14.
     
15.
        Application.LoadFromText acModule, "mod_Allgemein", CurrentProject.Path & "\64bit.bas" 
16.
         
17.
    Else 
18.
     
19.
        MsgBox "Kann System nicht identifizieren, lade die 32bit Variante..." 
20.
        Application.LoadFromText acModule, "mod_Allgemein", CurrentProject.Path & "\32bit.bas" 
21.
         
22.
    End If 
23.
     
24.
    Exit Function 
25.
 
26.
End Function
Dann der Code mit dem Modul löschen, habe ich ja schon drin, nur löscht er mir nur das Modul im Navigationsfenster, nicht im VB-Editor-Bereich und das stört beim zweiten Aufruf das System.

Also war die Frage, wie ich jetzt defintiv das Modul auch im VB-Editor löschen kann.

Gruß
Axel
Bitte warten ..
Mitglied: 83928
26.11.2010 um 10:41 Uhr
Wie sieht Dein func_modulLöschen aus? Die von mir gepostete Methode löscht das Modul auch im VB-Editor (habs mit A2007 getestet).
Ansonsten lösche mal testweise ein anderes Modul. Ich könnte mir vorstellen, dass in dem Modul noch Objekte geladen sind und das das Modul deswegen nicht gelöscht wird (vermutung).


BTW: Eine Sache solltest Du im Hinterkopf behalten. Manche Virenscanner mögen es gar nicht wenn ein Code zur Laufzeit geändert wird. Hatte da vor ein paar Jahren mal Probleme mit
Bitte warten ..
Mitglied: ichbinhier
26.11.2010 um 10:52 Uhr
01.
Public Function func_ModulLoeschen(modName As String) 
02.
 
03.
    On Error Resume Next 
04.
     
05.
    Application.VBE.ActiveVBProject.VBComponents.Remove Application.VBE.ActiveVBProject.VBComponents(modName) 
06.
 
07.
End Function
Das mit dem Virenscanner habe ich auch Durch. Das ganze Jahr schon. Kaspersky zerschreddert hin und wieder je nachdem wie gerade das Wetter ist oder so unsere Windows-Login-Skripte oder Batch-Skripte.
Wenn wir Glück haben, dann stellt Kaspersky die nur unter Quarantäne und löscht diese nicht. Manchmal haben wir Pech! ;-(
Bitte warten ..
Mitglied: 83928
29.11.2010 um 07:42 Uhr
01.
>     On Error Resume Next 
02.
> 
Würde ich mal rausnehmen, dann gibts vllt. auch ne aussagekräftige Fehlermeldung.
Bitte warten ..
Mitglied: ichbinhier
29.11.2010 um 07:51 Uhr
Guten Morgen,

schade, dass schon wieder Montag ist

Also ich habe das Problem zumindest mit der API-Deklaration umgangen, da mir Environ("username") bzw. Environ("computername") näher gelegt wurden. Klappt wunderbar damit, aber du hattest recht, das mit dem Modul geladen.

Ich lade aber immer noch dynamisch die DAO-Verweise und das klappt ausgezeichnet. Somit funktioniert mein Vorhaben der I14Y wunderbar.

Im Form.Close des Hautpformulars wollte ich alle Tabellen löschen und schreibe mir Logindaten in das Backend. Dabei greife ich natürlich auf den angemeldeten Benutzer- und Computernamen zurück, der genau diese API-Deklaration benötigt. Deshalb konnte das Modul nicht gelöscht werden.

Also Vielen Vielen Dank für Eure/Deine Hilfe.

Schöne Grüße und weiterschlafen

Axel
Bitte warten ..
Mitglied: FlyingFish
02.03.2011 um 16:58 Uhr
Hallo,

"Ich weiß nicht so recht, wo ich da genau ansetzen soll."

ich denke, die Lösung zumindest eines Teils der Probleme könnte hier in "Bedingter Kompilierung" liegen.

Der folgende Artikel liefert nähere Informationen und Beispiele hierzu:
http://msdn.microsoft.com/de-de/library/ee691831.aspx
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
SAN, NAS, DAS
gelöst Access Datenbank auf einer (Synology) NAS? (4)

Frage von garack zum Thema SAN, NAS, DAS ...

Datenbanken
Access Datenbank mit Rechnungen und Summenbildung möglich? (1)

Frage von Stefan007 zum Thema Datenbanken ...

Visual Studio
gelöst VB.net Datagridview in Datenbank Access zurückspeichern (1)

Frage von Pilger83 zum Thema Visual Studio ...

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

Frage von patz223 zum Thema Windows Userverwaltung ...

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