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.
Hallo,
glaubst Du ernsthaft mit den Angaben könnte jemand helfen ?
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
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]
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??
Anmerkung : die Klammern fehlten. Klappt trotzdem nicht.
Fehlermeldung ...unzulässige Operation
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?
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
@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
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
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
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.
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
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).
Hallo Lachtaube, das ist der Bereich, in dem die Stücklistenaufteilung steckt.
Gruss
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.
Hallo Lachtaube, das sieht schon super klasse aus und ist genau das, was ich gesucht habe. Vielen lieben Dank... :)
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
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.
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
'-------------------------------------------------------------------------------
Hallo, Vielen Dank Euch Beiden.
Besonders Lachtaube. Das war´s :)