codeman2001 Geschrieben 13. März 2006 Autor Geschrieben 13. März 2006 Naja, dann kannst Du Deinem Ausbilder sagen, dass diese Art der Aktualiserung nicht sicher und performant ist. Ich kenne genug Anwendungen, bei denen es damit Probleme gab und ich bewege mich in der Sprache jetzt schon einige Jahre und kenne genug Beispielgeschichten von Programmierern, die VB schon seit VB 1 oder 3 machen. Ist nur ein gutgemeinter Rat, denn wenn Du auf andere DB - Systeme oder mit einer anderen Programmiersprache den Kram machst, dann wirst Du um SQL nicht herum kommen... kann ich ja verstehen... aber ich soll die ****e jetzt erst einmal so machen. es kann sein, dass das ganze dann optional noch auf SQL umgestellt werden soll... *ausbilderhalt* gruß Zitieren
DevHB Geschrieben 13. März 2006 Geschrieben 13. März 2006 Naja, wenn Dein Ausbilder meint, dass das so den tollen lerneffekt bringt. Da würde ich ja eher gleich alles mit SQL machen, denn dann hast Du keine Umbauarbeiten mehr. Statt die Arbeit in so einen Kram zu stecken, sollte man die Zeit lieber darin investieren, den DB - Kram in eine Klasse zu kapseln, erleichtert die Arbeit für die nächsten Projekte wesentlich. Meiner Meinung (und andere ebenso) völlig verschenkte Zeit. Wäre ungefähr das Gleiche, als wenn Du die DB - Anbindung erst mit den be****en gebundenen Controls machen würdest und dann die Anwendung auf Code umstellen würdest.... Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 moin, sag mal wie mache ich das,dass ich eine globale connection habe? kann ich die irgendwie in einmodulpacken? möchte gerne von mehreren user formsauf die verbindung zugreifen. gruß Zitieren
DevHB Geschrieben 14. März 2006 Geschrieben 14. März 2006 Hi, deklarier die Connection in einem Modul : Public g_DBConnection As ADODB.Connection Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 Hi, deklarier die Connection in einem Modul : Public g_DBConnection As ADODB.Connection moin, das hier steht in meinem Modul: Option Explicit Public Connection As ADODB.Connection Public Sub Verbindung() '-Verbindung zur Datenbank herstellen Set Connection = New ADODB.Connection With Connection .ConnectionString = ".\Fahrbereitschaft.mdb" .Provider = "Microsoft.Jet.OLEDB.4.0" 'für Access 2000/XP/2003 .CursorLocation = adUseClient Call .Open End With End Sub und das hier steht in meinen Hauptprogramm: Variante 1: '-Verbindung zur Datenbank herstellen Private Sub cmdConnect_Click() '-Überprüfung, ob Verbindung besteht If Connection.State = 1 Then '- Recordset anlegen und öffnen Set rsKFZ = New ADODB.Recordset rsKFZ.Open "T_KFZ", Connection, adOpenDynamic, adLockPessimistic '-Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.DBComboKFZ.AddItem (rsKFZ.Fields("F_RegNum")) Me.DBComboKFZI_ID.AddItem (rsKFZ.Fields("I_ID")) rsKFZ.MoveNext Wend Else MsgBox ("Fehler beim Verbinden der Datenbank") End If End Sub Variante2: '-Verbindung zur Datenbank herstellen Private Sub cmdConnect_Click() '-Überprüfung, ob Verbindung besteht If Verbindung.Connection.State = 1 Then '- Recordset anlegen und öffnen Set rsKFZ = New ADODB.Recordset rsKFZ.Open "T_KFZ", Verbindung.Connection, _ adOpenDynamic, adLockPessimistic '-Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.DBComboKFZ.AddItem (rsKFZ.Fields("F_RegNum")) Me.DBComboKFZI_ID.AddItem (rsKFZ.Fields("I_ID")) rsKFZ.MoveNext Wend Else MsgBox ("Fehler beim Verbinden der Datenbank") End If End Sub gruß :e@sy Zitieren
DevHB Geschrieben 14. März 2006 Geschrieben 14. März 2006 Hi, nimm am Besten eine Funktion zum Öffnen der DB: 'Connection zur DB Public Function ConnectionOpen(Cn As ADODB.Connection) As Boolean Dim Msg As String 'Object generieren If Cn Is Nothing Then Set Cn = New ADODB.Connection End If With Cn If Cn.State = adStateOpen Then ConnectionOpen = True Exit Function End If 'Beschreibung Connection On Error GoTo Fehler .CursorLocation = adUseClient .Mode = adModeShareDenyNone .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & DBName .Open ConnectionOpen = True End With Fehler: If Err.Number <> 0 Then Msg = "Die Verbindung zur Datenbank" & vbCrLf & _ "konnte nicht hergestellt werden " & vbCrLf & vbCrLf & _ Err.Description FehlerAnzeige Err.Number, Msg, "ConnectionOpen" End If On Error GoTo 0 End Function Du solltest einen anderen Namen für die globale Connection verwenden, das kann zu Konflikten kommen, da die ADODB.Connection auch so heißt (Connection). Normalerweise packt man einen Vorschub vor die Variablen: g_DBConnection (g für global). Zudem sehe ich 1. keinen Unterschied in den beiden Varianten, zum anderen hast Du die Frage vergessen... ;-) Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 '-Verbindung zur Datenbank herstellen Private Sub cmdConnect_Click() '-Überprüfung, ob Verbindung besteht If [b]Connection.State = 1 Then[/B] '- Recordset anlegen und öffnen Set rsKFZ = New ADODB.Recordset rsKFZ.Open "T_KFZ", [b]Connection[/b], adOpenDynamic, adLockPessimistic '-Verbindung zur Datenbank herstellen Private Sub cmdConnect_Click() '-Überprüfung, ob Verbindung besteht If V[B]erbindung.Connection.State = 1[/B] Then '- Recordset anlegen und öffnen Set rsKFZ = New ADODB.Recordset rsKFZ.Open "T_KFZ", [b]Verbindung.Connection[/b], _ adOpenDynamic, adLockPessimistic Das Modul heisst Verbidung. Die Funktion in dem Modul Verbindung heisst ConnectionOpen. Wie spreche ich jetzt die Verbindung aus den Form herraus an...? das ware die frage. Zitieren
DevHB Geschrieben 14. März 2006 Geschrieben 14. März 2006 Naja, das ist wurscht. Ich verwende immer die lange schreibweise, in Deinem Fall "Verbindung.Connection". An dem Beispiel siehst Du auch, dass es wesentlich besser ist, den Variablennamen und Modulnamen Vorschübe zu geben, damit man sich im Quelltext besser zurecht findet. In Deinem Fall: "Verbindung" wird zu "modVerbindung", da es anscheinend ein Modul ist. "Connection" solltest Du ja umbennen, z.B. in "g_Connection", damit es sich von der "ADODB.Connection" differenziert. Wenn Du jetzt noch die gepostete Funktion verwendest, kannst Du über If (modVerbindung.ConnectionOpen(g_Connection)) Then ' verbindung besteht Else ' verbindung ist geschlossen, nothing oder fehler End If Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 '-Überprüfung, ob Verbindung besteht If modVerbindung.ConnectionOpen(gConnection) = True Then '- Recordset anlegen und öffnen Set rsKFZ = New ADODB.Recordset rsKFZ.Open "T_KFZ", (modVerbindung.ConnectionOpen(gConnection)), adOpenDynamic, adLockPessimistic '-Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.DBComboKFZ.AddItem (rsKFZ.Fields("F_RegNum")) Me.DBComboKFZI_ID.AddItem (rsKFZ.Fields("I_ID")) rsKFZ.MoveNext Wend End If Laufzeitfehler 3001 Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches, oder sind miteinander unvereinbar rsKFZ.Open "T_KFZ", (modVerbindung.ConnectionOpen(gConnection)), adOpenDynamic, adLockPessimistic :confused: ich komme der sache näher dank dir habe ich endlich mal ein erfolgserlebnis ***EDIT*** Ich habs, das muss lauten: rsKFZ.Open "T_KFZ", gConnection, adOpenDynamic, adLockPessimistic und nicht rsKFZ.Open "T_KFZ", (modVerbindung.ConnectionOpen(gConnection)), adOpenDynamic, adLockPessimistic ***/EDIT*** Zitieren
DevHB Geschrieben 14. März 2006 Geschrieben 14. März 2006 So langsam erschleicht mich die Ahnung, das Du teilweise überhaupt nicht weißt, was Du machst, kopierst Du den Code ohne ihn versuchen zu verstehen? Hast Du Dir die Funktion "ConnectionOpen" mal angeschaut und versucht diese nachzuvollziehen? Jetzt würde ich gerne von Dir wissen, warum das so funktioniert und nicht anders? Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 es funktioniert so, weil die variable gConnection ja durch das Modul global verfügbar ist. aber ich dachte, das 2. wäre quasi die gleiche schreibweise nur halt ausführlicher... aber es wäre schön, wenn du es mir erklären könntest Zitieren
DevHB Geschrieben 14. März 2006 Geschrieben 14. März 2006 ausführlicher wäre die Schreibweise wenn "modVerbindung.gConnection". Das zweite hat nicht funktioniert, da die Open-Methode des ADODB.Recordsets als 2. Parameter eine aktive Connection benötigt (ADODB.Connection), die Funktion "ConnectionOpen" aber einen Boolean zurückgibt. Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 ausführlicher wäre die Schreibweise wenn "modVerbindung.gConnection". Das zweite hat nicht funktioniert, da die Open-Methode des ADODB.Recordsets als 2. Parameter eine aktive Connection benötigt (ADODB.Connection), die Funktion "ConnectionOpen" aber einen Boolean zurückgibt. achso, alles klar. danke sag mal würde es sinn machen einen recordset auch in einem modul zu speichern, so dass ich den recordset nicht immer über propperties zwischen den userformen hin und her geben muss...? Zitieren
DevHB Geschrieben 14. März 2006 Geschrieben 14. März 2006 Jein. Ich handhabe das so, dass ich so privat wie möglich programmiere, d.h. ich übergebe selten Recordsets an andere Formen (auch daher, dass ich Änderungen nur über die Connection bzw. eine Klasse löse). Was Du machen könntest, wäre ein Modul (z.B. modWorkingRecordsets), in denen Du öffentliche Funktionen mit Rückgabewert ADODB.Recordset erstellst. Dann musst Du nur noch die Funktion aufrufen: 'Modul "modWorkingRecordsets" Public Function GetKFZ_Rs( _ ) As ADODB.Recordset Dim Rs As ADODB.Recordset Set Rs = New ADODB.Recordset Call Rs.Open ("T_KFZ", modVerbindung.gConnection, adOpenDynamic, adLockPessimistic) If (Not (Rs Is Nothing)) Then Set GetKFZ_Rs = Rs End If End Function ' aufruf in Form Private m_Recordset As ADODB.Recordset Private Sub Form_Load Set m_Recordset = modWorkingRecordsets.GetKFZ_Rs ' und mit m_Recordset weiterarbeiten End Sub Ich würde mir überlegen, ob es wirklich Sinn macht, wenn Du die Recordsets an Formen übergibts, denn eigentlich brauchst Du die bei Dir ja nur, um Änderungen zu machen. Wenn Du dass mit der Connection (die Du ja eh schon global zur Verfügung hast) machen würdest, würde der ganze Kram wegfallen. (wieder ein Punkt, dem Du Deinem Ausbilder sagen kannst, warum (zumindest in Deinem Fall) die Aktualisierung per Recordset Müll ist ) Zudem muss Du beachten, JEDES Recordset hat nach dem Öffnen eine aktive Connection. Die würde sich mit "Set Rs.ActiveConnection = Nothing" lösen lassen, ist aber auch irgendwie unsauber. Zitieren
codeman2001 Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 ok danke erst einmal. werde jetzt feierabend machen und da morgen drüber nachdenken. poste dann morgen nochmal.. cu und thx nochmal Zitieren
codeman2001 Geschrieben 15. März 2006 Autor Geschrieben 15. März 2006 moin, packe jetzt die rs nicht in module. jedoch habe ich schon wieder ne frage. es hapert mal wieder an den grundkenntnissen von VB übergabe recordset an eine Userform: frmMain: Public WithEvents rsKFZ As ADODB.Recordset ------------------------------------------------------ Private Sub cmdKFZ_Neu_Click() Call Load(frmKFZ_Neu) Set frmKFZ_Neu.KFZ = rsKFZ Call frmKFZ_Neu.Show End Sub -> das ist klar, ich übergebe rsKFZ an frmKFZ_Neu frmKFZ_NEU: Option Explicit ------------------------------------------------------ Public WithEvents rsKFZ As ADODB.Recordset ------------------------------------------------------ Public Property Set KFZ(ByRef rs As ADODB.Recordset) Set mrsKFZ = rs End Property ------------------------------------------------------ Public Property Get KFZ() As ADODB.Recordset Set rsKFZ = mrsKFZ End Property ------------------------------------------------------ das 2. verstehe ich nicht so ganz.... wieso brauche ich da 3 variablen nur um den rsKFZ an die Form zu übergeben...? gruß und nicht peinigen Zitieren
DevHB Geschrieben 15. März 2006 Geschrieben 15. März 2006 Hi, Option Explicit [b]>>>> Anfang Bereich A <<<< [/b] ------------------------------------------------------ Public WithEvents rsKFZ As ADODB.Recordset [b]>>>> Ende Bereich A <<<<[/b] ------------------------------------------------------ [b]>>>> Anfang Bereich B <<<< [/b] Public Property Set KFZ(ByRef rs As ADODB.Recordset) Set mrsKFZ = rs End Property ------------------------------------------------------ Public Property Get KFZ() As ADODB.Recordset Set rsKFZ = mrsKFZ End Property ------------------------------------------------------ Hierbei werden zwei versch. Varianten gemischt. Ich habe im Code mal 2 Bereiche markiert: A und B. Bereich A ist der Formweite Deklarationsteil. Alles was hier deklariert ist (private, dim) ist innerhalb der Form, aber nicht nach außen sichtbar (andere Formen etc...). Wird hier etwas Public deklariert, ist es nach außen sichtbar. Wenn Du nun das Recordset "Public" in Bereich A deklarierst, dann brächtest Du die beiden Properties nicht, da die ja nur für den Zugriff auf private Elemente eines Objektes (in diesem Fall die Form) zuständig sind. Aber, das wollen wir ja nicht, da wir ja möglichst Privat programmieren wollen... Also ändern wir Public WithEvents m_rsKFZ As ADODB.Recordset in Private WithEvents m_rsKFZ As ADODB.Recordset Ich habe mir zusätzlich angewöhnt, bei Deklarationen für Properties ein "m_" oder "m" vor die Variable zu hängen, dann sehe ich, welche für Properties und welche zum "normalen" Arbeiten zuständig sind. Ich würde Dir empfehlen, immer genau zu überlegen, in wie weit ein Objekt oder eine Variable im Projekt sichtbar sein soll, denn hier Public WithEvents rsKFZ As ADODB.Recordset ------------------------------------------------------ Private Sub cmdKFZ_Neu_Click() Call Load(frmKFZ_Neu) Set frmKFZ_Neu.KFZ = rsKFZ Call frmKFZ_Neu.Show End Sub ist rsKFZ wieder als Public deklariert, brauchst Du den denn öffentlich, wenn Du ihn per Property übergibts? Ich denke nicht, denn ansonsten könntest Du ja auch einfach von der Form "frmKFZ_NEU" darauf zugreifen: ' frmKFZ_NEU: Private Sub Form_Load frmMain.rsKFZ.Open (...) End Sub ABER, auch dass wollen wir nicht, da wir möglichst privat und OO-Programmieren wollen... Ich hoffe ich konnte Dir helfen... Zitieren
codeman2001 Geschrieben 15. März 2006 Autor Geschrieben 15. März 2006 ok, danke, aber ich meinte eigendlich das ganze mit set und get usw... wieso brauche ich rsKFZ(so soll der Recorset heißen), rs und mrsKFZ... sorry, wenn das flasch rüber gekommen ist. wieso funktioniert das ganze nicht? frmMAIN: Option Explicit Private WithEvents rsKFZ As ADODB.Recordset ---------------------------------------------------------------------- Private Sub cmdKFZ_Neu_Click() Call Load(frmKFZ_Neu) '- rsKFZ an USerofm frmKFZ_Neu.KFZ übergeben Set frmKFZ_Neu.KFZ = rsKFZ Call frmKFZ_Neu.Show End Sub frmKFZ_NEU: Option Explicit Private WithEvents rsKFZ As ADODB.Recordset ---------------------------------------------------------------------- Public Property Set KFZ(ByRef rs As ADODB.Recordset) Set mrsKFZ = rs End Property ---------------------------------------------------------------------- Public Property Get KFZ() As ADODB.Recordset Set rsKFZ = mrsKFZ End Property ---------------------------------------------------------------------- Private Sub Form_Load() '- Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.cboGastype_Value.AddItem (rsKFZ.Fields("F_Description")) rsKFZ.MoveNext Wend End Sub Zitieren
DevHB Geschrieben 15. März 2006 Geschrieben 15. März 2006 Naja, Rs brauchst Du, weil so die Synthax für Properties ist. Rs ist der neue Wert, der der property/membervariablen zugewiesen werden soll. Funktionieren tut das Ganze wahrscheinlich nicht, da Option Explicit ' [B][B]>>>[/B]dies ist fehlerhaft : [/B]Private WithEvents rsKFZ As ADODB.Recordset [B]so ist es richtig:[/B] Private WithEvents mrsKFZ As ADODB.Recordset ---------------------------------------------------------------------- Public Property Set KFZ(ByRef rs As ADODB.Recordset) Set [B]m[/B]rsKFZ = rs End Property ---------------------------------------------------------------------- Public Property Get KFZ() As ADODB.Recordset Set rsKFZ = [B]m[/B]rsKFZ End Property ---------------------------------------------------------------------- Private Sub Form_Load() '- Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.cboGastype_Value.AddItem (rsKFZ.Fields("F_Description")) rsKFZ.MoveNext Wend End Sub[B][/B] Du in den Properties eine andere Variable zuweist (beachte in den Properties das m und Deine Deklaration des Recordsets auf "frmKFZ_Neu". Zitieren
codeman2001 Geschrieben 15. März 2006 Autor Geschrieben 15. März 2006 aber dann müsste ich doch unten im Form_Load() mein Recordset auch mrsKFZ nennen, oder? weil, wenn ich es nicht mache, sagt er mir, dass rsKZF nicht deklariert ist. wenn ich das rsKFZ in Form_Load in mrsKFZ umbenenne kommt wieder Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt Zitieren
DevHB Geschrieben 15. März 2006 Geschrieben 15. März 2006 Hi, ja, Du musst es umbennnen. Mach mal im Form_Load eine Überprüfung, ob das Recordset gültig ist: If (Not (mrsKFZ Is Nothing)) Then '- Springe zum ersten Datensatz mrsKFZ.MoveFirst While Not mrsKFZ.EOF Me.cboGastype_Value.AddItem (mrsKFZ.Fields("F_Description")) mrsKFZ.MoveNext Wend Else MsgBox "Recordset ist Nothing" End If Zitieren
DevHB Geschrieben 15. März 2006 Geschrieben 15. März 2006 ah, noch einen Fehler gefunden, zumindest im Post, hast Du den auch im Code? Option Explicit ' >>>dies ist fehlerhaft : Private WithEvents rsKFZ As ADODB.Recordset so ist es richtig: Private WithEvents mrsKFZ As ADODB.Recordset ---------------------------------------------------------------------- Public Property Set KFZ(ByRef rs As ADODB.Recordset) Set mrsKFZ = rs End Property ---------------------------------------------------------------------- Public Property Get KFZ() As ADODB.Recordset [B]falsch: Set rsKFZ = mrsKFZ muss [/b] Set KFZ = mrsKFZ End Property ---------------------------------------------------------------------- Private Sub Form_Load() '- Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.cboGastype_Value.AddItem (rsKFZ.Fields("F_Description")) rsKFZ.MoveNext Wend End Sub Zitieren
codeman2001 Geschrieben 15. März 2006 Autor Geschrieben 15. März 2006 hab ich geändert. Recordset ist immer noch leer.. Option Explicit Private WithEvents rsKFZ As ADODB.Recordset -------------------------------------------------------------------------- Public Property Set KFZ(ByRef rs As ADODB.Recordset) Set rsKFZ = rs End Property -------------------------------------------------------------------------- Public Property Get KFZ() As ADODB.Recordset Set KFZ = rsKFZ End Property -------------------------------------------------------------------------- Private Sub Form_Load() '- Überprüfung, ob Recordset aktiv ist If (Not (rsKFZ Is Nothing)) Then '- Springe zum ersten Datensatz rsKFZ.MoveFirst While Not rsKFZ.EOF Me.cboGastype_Value.AddItem (rsKFZ.Fields("F_Description")) rsKFZ.MoveNext Wend Else MsgBox "Fehler. Der Recordset ist leer" End If End Sub Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.