Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: martie01 am Dezember 04, 2018, 21:31:03

Titel: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 04, 2018, 21:31:03
Hallo,
ich hab eine Datenbank , welche ich nun aufteilen möchte.Dabei bekomme ich die Fehlermeldung im Bereich "DB open table".
Was muss ich tun, um diese Datenbank trotzdem aufteilen zu können.
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: MzKlMu am Dezember 04, 2018, 22:42:05
Hallo,
glaubst Du ernsthaft mit den Angaben könnte jemand helfen ?
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 07, 2018, 20:31:41
Hallo, wenn eine(r) Ahnung von der Materie hat, und  vom Prinzip weiterhelfen möchte, glaube ich schon.
Ich weiss ja nicht, welche Infos fehlen.
Wie gesagt, ich habe eine Datenbank, welche  ich in Front und Backend aufteilen möchte. Bis auf den Part der...Dbopentable funktioniert das auch. Wenn ich dbopentable in db opendynaset tausche,  bekomme ich die Fehlermeldung... operation wird für diesen objekttyp nicht unterstützt
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Lachtaube am Dezember 07, 2018, 21:14:08
Hier kann man wirklich nur raten. Recordsets über verknüpfte Tabellen können nicht mit der Option dbOpenTable geöffnet werden. Ist dieser Öffnungsmodus gewünscht, so muss ein neues Datenbank-Objekt über die Datenbank (Backend) geöffnet werden, in dem die Taelle beheimatet ist.   Dim db As DAO.Database

   Set db = OpenDatabase("C:\der\pfad\zum\be.accdb")
   With db.OpenRecordset("tabelle_im_be", dbOpenTable)
      'mach was mit dem Recordset
      .Close
   End With
   db.Close

[edit]Klammern hinzugefügt[/edit]
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 08, 2018, 12:56:01
Hallo,erst mal schon mal Danke für die Antwort. wenn ich das so umsetzte, wie Du beschrieben hast, erhalte ich den text in rot .
Set DB =  OpenDatabase "C:\Users\martin\Desktop\xyz_be.accdb" :-\

Ich würde das auch lieber als dbopendynaset gestalten, habe nur leider keinen Plan, wie das geht.
Ich habe diesen Bereich bei mir in die Datenbank implementiert .
http://forum.freeaccess.de/YaBB.pl?num=1053085431/16

Was müsste ich denn tun, um dieses als dbopendynaset umzusetzen??
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 08, 2018, 13:04:05
Anmerkung : die Klammern fehlten. Klappt trotzdem nicht.
Fehlermeldung ...unzulässige Operation
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: DF6GL am Dezember 08, 2018, 13:18:07
Hallo,

es wäre vorteilhaft, Deine  gesamte Problematik vollständig zu erläutern anstatt an die Ahnung-von-der-Materie  anderer Leute  zu glauben....


Wenn die DB aufgeteilt ist, warum soll das BE als separate Database geöffnet werden?
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 08, 2018, 13:48:07
Ich dachte , ich hätte mein Problem ausreichend erläutert.
Ich möchte diesen  VBA Code  http://forum.freeaccess.de/YaBB.pl?num=1053085431/16
so umsetzten, das er in einer geteilten Access Datenbank funktioniert.
Danke
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Beaker s.a. am Dezember 08, 2018, 14:51:37
@martie01
Was hat denn der Link mit der Aufteilung zu tun?
Wenn die Aufteilung mit dem Assistenten nicht funktioniert, versuche es manuell.
Alle Tabellen in eine neue DB kopieren; - = Backend.
Tabelle in alter DB (Frontend) löschen und über "Externe Daten" mit der neuen
BE-DB verknüpfen. Dann kannst du über CurrentDb genauso auf die Tabellen
zugreifen als ob sie lokal wären.
Falls du aus dem FE Strukturänderungen am BE vornehmen willst, musst du es so
machen, wie es Lachtaube gezeigt hat; - Referenz per "OpenDatabase" erstellen.
gruss ekkehard
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Lachtaube am Dezember 08, 2018, 20:30:52
Mit einem Dynaset sollte das ungefähr so funktionieren (Feld- und Tabellennamen wären anzupassen).Sub BuildLevelsForArticle(ByVal ArtikelId As Long)
   Dim db As DAO.Database
   Dim Target As DAO.Recordset
   Dim Source As DAO.Recordset
   
   Set db = CurrentDb
   db.Execute "DELETE FROM tmpAufloesung"

   Set Source = db.OpenRecordset("Stueckliste", dbOpenDynaset)
   Set Target = db.OpenRecordset("tmpAufloesung", dbOpenDynaset)
   
   Target.AddNew
   Target!Ebene = 0
   Target!Menge = 1
   Target!ArtikelId_1 = ArtikelId 'das ist weniger logisch
   Target!ArtikelId_2 = ArtikelId 'auf der untersten Ebene - Null wäre klarer
   Target.Update

   Call EvalArticleList(ArtikelId, 0, Source, Target)
   
   Target.Close
   Source.Close
End Sub

Sub EvalArticleList(ByVal ArtikelId As Long, ByVal Ebene As Long, _
                    Source As DAO.Recordset, Target As DAO.Recordset)
   Dim Criteria As String
   Dim bm As Variant

   'Suchkriterium, wo ArtikelId Fremdschlüssel ist, anlegen
   Criteria = BuildCriteria("ArtikelId_F", dbLong, ArtikelId)

   'Suche starten
   Source.FindFirst Criteria
   
   'solange bis nichts mehr gefunden wird
   Do Until Source.NoMatch
      'einen Datensatz in der Zieltabelle erstellen
      Target.AddNew
      Target!Ebene = Ebene + 1
      Target!Menge = Source!Menge
      Target!ArtikelId_1 = ArtikelId
      Target!ArtijelId_2 = ArtikelId_F
      Target.Update
     
      'Position merken
      bm = Source.Bookmark
     
      'alle untegeordneten Artikel der nächsten Ebene finden
      Call EvalArticleList(Source!ArtikelId, Ebene + 1, Target, Source)
     
      'an der gemerkten Position fortsetzen
      Source.Bookmark = bm
     
      'nächsten Artikel auf gleicher Ebene suchen
      Source.FindNext Criteria
   Loop
End Sub
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 11, 2018, 21:20:08
Hallo Lachtaube, ich habe Deinen oberen Vorschlag versucht umzusetzen.Scheitere jedoch daran, das ich die Tabellen (tbl u.tbl_1 ) nicht zuordnen kann.

Set DB = OpenDatabase("C:\Users\martin\Desktop\alltec V12_061218_be.accdb")
With DB.OpenRecordset("tmpStücklisteAuflösung", dbOpenTable)
With DB.OpenRecordset("tdtaStückliste", dbOpenTable)

'With tbl = DB.OpenRecordset("tmpStücklisteAuflösung", dbOpenTable) 'DB_OPEN_TABLE
'With tbl_1 = DB.OpenRecordset("tdtaStückliste", dbOpenTable)  'DB_OPEN_TABLE

Was mache ich falsch?
Gruss
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Lachtaube am Dezember 11, 2018, 21:53:01
In den Bruchstücken kann ich ich keinen syntaktischen Fehler entdecken. Folgendes gilt es zu beachten:
   With ErstesObjekt
      'hier kann auf Methoden des Objekts beginnend mit dem Punkt-Operator
      'zugegriffen werden
      With ZweitesObject
         'hier kann nur auf Methoden vom zweiten Objekt mit dem Punkt-Operator
         'zugegriffen werden
      End With
      'ab hier steht das erste Objekt wieder zur Verfügung
   End With

   'wenn nach dem zweiten With Zugriff auf das erste Objekt benötigt wird,
   'sollte es einer Objektvariablen zugewiesen werden
   Dim rs As DAO.Recordset

   '...
   set rs = db.OpenRecordset(...) 'das Erste Objekt
   With db.OpenRecordset(...) 'das wweite Object
      rs.Seek ... 'Methode des ersten Objekts
      .Seek ...   'Methode des zweiten Objekts
   End With


PS: Code bitte zukünftig nicht als Freitext posten.
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 13, 2018, 20:45:12
Hallo, so ich habe den Code jetzt eingefügt. Bekomme die Fehlermeldung "End with erwartet ". Kann bitte einer helfen ?

Option Compare Database
Option Explicit

Dim x

Function RekTest()
Static Ebene As Integer
Ebene = Ebene + 1
Debug.Print Ebene
DoEvents
x = RekTest()
End Function

Function StuecklisteFirst(dblArtikelnummer As Double)
Dim DB As dao.Database, tbl As dao.Recordset

DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tmpStücklisteAuflösung"
DoCmd.SetWarnings True

Set DB = OpenDatabase("C:\Users\martin\Desktop\alltec V12_061218_be.accdb")
With DB.OpenRecordset("tmpStücklisteAuflösung", dbOpenTable)
'On Error Resume Next

tbl.AddNew
tbl("dtEbene") = 0
tbl("dtAnzahl") = 1
tbl("fiArtikelNrInt_1") = dblArtikelnummer
tbl("fiArtikelNrInt_2") = dblArtikelnummer
tbl.Update

x = StuecklisteNext(dblArtikelnummer)
tbl.Close
DB.Close

End With
End Function

Function StuecklisteNext(dblArtikelnummer As Double)
Dim DB As dao.Database, tbl As dao.Recordset, tbl_1 As dao.Recordset, sSql As String
Static xEbene As Integer

Set DB = OpenDatabase("C:\Users\martin\Desktop\alltec V12_061218_be.accdb")
With DB.OpenRecordset("tmpStücklisteAuflösung", dbOpenTable)
With DB.OpenRecordset("tdtaStückliste", dbOpenTable)

tbl_1.Index = "idArtikelNrInt"

'On Error Resume Next
tbl_1.Seek "=", dblArtikelnummer
If Not tbl_1.NoMatch Then
    xEbene = xEbene + 1
    Do Until tbl_1!idArtikelNrInt <> dblArtikelnummer
        tbl.AddNew
        tbl("dtEbene") = xEbene
        tbl("dtAnzahl") = tbl_1!dtAnzahl
        tbl("fiArtikelNrInt_1") = tbl_1!fiArtikelNrInt
        tbl("fiArtikelNrInt_2") = tbl_1!idArtikelNrInt
        tbl.Update
        x = StuecklisteNext(CDbl(tbl_1!fiArtikelNrInt))
        tbl_1.MoveNext
        If tbl_1.EOF Then Exit Do
        DoEvents
    Loop
xEbene = xEbene - 1
End If

tbl.Close
tbl_1.Close
End With

DB.Close

End Function

Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Lachtaube am Dezember 13, 2018, 21:08:48
Der Code aus dem anderen Forum ist grottenschlecht, weil er unnötig immer wieder auds Neue Recordsets öffnet und schließt. Lade bitte eine angespeckte Version Deines Front- und Backends mit einigen (ggf. anonymisierten) Spieldaten hier in einem Anhang als Zip-Archiv hoch - dann kann ich Dir etwas basteln.

PS: auch ist die Datenhaltung zu überdenken. Denn, wenn ein Teil mehrmals verbaut werden kann (typisches Beispiel: eine Sechskant-Mutter M8), kann das Deine Struktur nicht mehr abbilden, weil die Mutter nur ein zugehöriges übergeordnetes Teil kennt. Bei einem Stammbaum oder einer Organisation mit jeweils nur einem Vorgesetzten auf jeder Ebene wäre das Ok.
Eine Stückliste ist besser aus der umgekehrten Richtung zu betrachten.
oberteil | unterteil | menge
----------------------------
teil_1   | teil_2    | 2
teil_1   | teil_3    | 3
teil_1   | teil_4    | 4
teil_2   | teil_5    | 3
teil_2   | teil_6    | 2
teil_7   | teil_2    | 1
teil_7   | teil_3    | 5

Am besten wäre es, wenn das Backend CTEs (Common Table Expressions) unterstützt, dann kann man nämlich das Ergebnis einfach mit einer Abfrage ermitteln, wie in diesem <dbfiddle> (https://dbfiddle.uk/?rdbms=sqlite_3.16&fiddle=b3bea7bd37988312cce7943e5c2fc0b3).
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 16, 2018, 12:28:42
Hallo Lachtaube, das ist der Bereich, in dem die Stücklistenaufteilung steckt.
Gruss
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Lachtaube am Dezember 16, 2018, 19:36:49
Die temporäre Stückliste wird in einem eigenen Scratch-BE, welches bei jedem Start des Frontends neu erstellt wird, angelegt - das vermeidet Müll im eigentlichen Front- und Backend. Vor dem ersten Benutzen musst Du das Backend einmalig neu verknüpfen.
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 18, 2018, 18:30:56
Hallo Lachtaube, das sieht schon super klasse aus und ist genau das, was ich gesucht habe. Vielen lieben Dank...  :)
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 21, 2018, 11:42:40
Hallo, ich habe das Tool getestet. Da ich eine 64bit Version habe, konnte mir Lachtaube den Tipp gegeben, das die "Private Declare" anders lauten muss. '-------------------------------------------------------------------------------
Private Declare PtrSafe Function GetFileAttributesW Lib "kernel32" ( _
   ByVal lpFileName As LongPtr) As Long
'-------------------------------------------------------------------------------
Private Declare PtrSafe Function GetTempPathW Lib "kernel32" ( _
   ByVal nBufferLength As Long _
, ByVal lpBuffer As LongPtr) As Long


Dennoch funktioniert das Teil beim mir und evtl. bei anderen nicht richtig.
Wenn ich im Formular"Gehäuse komplett" auflöse (Bestehend aus : Gehäuse komplett, Bodengruppe, 4xFüsse und 4xSchrauben werden die Schrauben nicht angezogen. In der Stüli sind sie drin.

Weiss jemand Rat ?? ::)

Ich habe die Datei hochgeladen. Bei mir stecken beide Dateien im C:\neuer Ordner. Dann kann man das so direkt übernehmen.

Gruss Martin
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: PhilS am Dezember 21, 2018, 13:43:39
Zitat von: martie01 am Dezember 21, 2018, 11:42:40
Hallo, ich habe das Tool getestet. Da ich eine 64bit Version habe, konnte mir Lachtaube den Tipp gegeben, das die "Private Declare" anders lauten muss. '-------------------------------------------------------------------------------
Private Declare PtrSafe Function GetFileAttributesW Lib "kernel32" ( _
   ByVal lpFileName As LongPtr) As Long
'-------------------------------------------------------------------------------
Private Declare PtrSafe Function GetTempPathW Lib "kernel32" ( _
   ByVal nBufferLength As Long _
, ByVal lpBuffer As LongPtr) As Long


Dennoch funktioniert das Teil beim mir und evtl. bei anderen nicht richtig.
Üblicherweise würde man in diesen API-Deklarationen anstelle der beiden LongPtr eher als String deklarieren. Die oben dargestellte Deklaration ist aber keineswegs zwingend falsch. Es kommt auf den aufrufenden Code an!

Zu dem anderen(?) Problem kann ich im Moment nichts sagen.
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: Lachtaube am Dezember 21, 2018, 13:51:07
Entschuldige Martin, aber aber ich habe leider einen logischer Fehler in den Code eingebaut. >:( Lösche die Zeile Source.MoveNext in EvalArticleList - dann werden auch die Schrauben angezeigt.

@Phil,

beim üblichen Vorgehen (üblich sicherlich zu Zeiten als Win95/98 noch aktuell war) findet dann eine doppelte Konvertierung der Strings statt. Denn VBA wandelt die Strings ins ANSI-Format um, welches von der API selbst wieder vor der Ausführung ins Wide-Format umgewandelt wird. ;D

'-------------------------------------------------------------------------------
Private Declare PtrSafe Function GetFileAttributesA Lib "kernel32" ( _
   ByVal lpFileName As LongPtr) As Long
'-------------------------------------------------------------------------------
Private Declare PtrSafe Function GetTempPathA Lib "kernel32" ( _
   ByVal nBufferLength As Long, _
   ByVal lpBuffer As String) As Long
'-------------------------------------------------------------------------------
Titel: Re: Datenbank mit DB_open table in Front und Backend trennen
Beitrag von: martie01 am Dezember 21, 2018, 17:35:10
Hallo,  Vielen Dank Euch Beiden.
Besonders Lachtaube. Das war´s :)