Zum Inhalt springen

Empfohlene Beiträge

Geschrieben
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* :rolleyes:

gruß

  • Antworten 51
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Geschrieben

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

Geschrieben
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

Geschrieben

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

Geschrieben


'-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. :)

Geschrieben

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

Geschrieben


    '-Ü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 :P

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

Geschrieben

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?

Geschrieben

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 ;)

Geschrieben

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.

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

Geschrieben

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.

Geschrieben

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 :P

Geschrieben

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

Geschrieben

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

Geschrieben

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". ;)

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...