Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Datenbank mit DB_open table in Front und Backend trennen

Begonnen von martie01, Dezember 04, 2018, 21:31:03

⏪ vorheriges - nächstes ⏩

martie01

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.

MzKlMu

Hallo,
glaubst Du ernsthaft mit den Angaben könnte jemand helfen ?
Gruß Klaus

martie01

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

Lachtaube

#3
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]
Grüße von der (⌒▽⌒)

martie01

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

martie01

Anmerkung : die Klammern fehlten. Klappt trotzdem nicht.
Fehlermeldung ...unzulässige Operation

DF6GL

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?

martie01

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

Beaker s.a.

@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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

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
Grüße von der (⌒▽⌒)

martie01

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

Lachtaube

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.
Grüße von der (⌒▽⌒)

martie01

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


Lachtaube

#13
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>.
Grüße von der (⌒▽⌒)

martie01

Hallo Lachtaube, das ist der Bereich, in dem die Stücklistenaufteilung steckt.
Gruss