Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

was stimmt an diesem Code nicht?

Begonnen von Neuling1, Juli 12, 2010, 17:36:09

⏪ vorheriges - nächstes ⏩

Neuling1

immer wieder Fehlermeldungen, ich drehe durch
Private Sub Form_Load()
DoCmd.RunCommand acCmdAppMaximize
' GLOBALBogName_tx = BogName_tx 'diese Variable wird im Modul vbaAllgemeineFkt deklariert) und wird jetzt hier eingelesen
' Diese Routine muss in Form_load für jede Seite stehen, die bearbeitet wird.
' Dabei muss jeweils festgestellt werden, welche Tabelle jeweils betroffen ist und dann
' in strSQL die Tabellennamen jeweils ausgetauscht
' Im drei Zeilen tiefer stehendem Feld GLOBALBogName_tx = "   " muß jeweils der Name des
' Fragebogens stehen, damit das System die Sätze prüfen und anlegen kann.
  Dim db As Database
  Dim rsRektum As Recordset
  Dim strSQL As String
' Statt "VS" jeweils die Kennung des Fragebogens eintragen
  GLOBALBogName_tx = "S1"
  Set db = CurrentDb()
  strSQL = "SELECT * from T_Rektum where T_Rektum.Fnr = " & gLngFnr & " And T_Rektum.BogName_tx = '" & GLOBALBogName_tx & "'"
  Set rsRektum = db.OpenRecordset(strSQL)
  Me.RecordsetClone.FindFirst "Fnr = " & gLngFnr & " and BogName_tx  = '" & GLOBALBogName_tx & "'"
  If Not Me.RecordsetClone.NoMatch Then
  Me.Bookmark = Me.RecordsetClone.Bookmark
  Else
  DoCmd.GoToRecord , , acNewRec
  Me!Fnr = gLngFnr
  Me!BogName_tx = GLOBALBogName_tx
  Me!Name = GLOBALpname
  Me!Vn = GLOBALvname
  Me!Gebdat = GLOBALgebdat
'hier werden alle globalen Variablen aktiviert für den neuen Datensatz
  End If
rsRektum.Close
db.Close
End Sub
Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

database

Hallo,

Zitatimmer wieder Fehlermeldungen

...und wo kracht's?

Lass den Codeabschnitt mal mit F8 schrittweise abarbeiten -  Haltepunkt auf Form_Load setzen.

Grüße
Peter

Neuling1

beim Kompilieren ist noch alles oaky, wenn ich die Daten eingeben will, immer wieder Fehlermeldungen, zuwenig Parameter, findet dies nicht, findet das nicht! Ich drehe noch durch! Jetzt hab ich noch eine Änderung gema<cht und probiere es nochmal! Furchtbar, irgendwann muss ich doch mal anfangen mit der Eingabe!
Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

Neuling1

  Set rsRektum = db.OpenRecordset(strSQL)

Hier bekomme ich nach der Eingabe in den  als global definierten Variablen  die Meldung, es wurde 1 Parameter erwartet aber keiner gekommen!

Ich bin langsam fix und fertig, was habe ich denn noch vergessen? ??? >:( >:(
Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

DF6GL

Hallo,

Private Sub Form_Load()
DoCmd.RunCommand acCmdAppMaximize
' GLOBALBogName_tx = BogName_tx 'diese Variable wird im Modul vbaAllgemeineFkt deklariert) und wird jetzt hier eingelesen
' Diese Routine muss in Form_load für jede Seite stehen, die bearbeitet wird.
' Dabei muss jeweils festgestellt werden, welche Tabelle jeweils betroffen ist und dann
' in strSQL die Tabellennamen jeweils ausgetauscht
' Im drei Zeilen tiefer stehendem Feld GLOBALBogName_tx = "   " muß jeweils der Name des
' Fragebogens stehen, damit das System die Sätze prüfen und anlegen kann.
  Dim db As DAO.Database
  Dim rsRektum As DAO.Recordset
  Dim strSQL As String
' Statt "VS" jeweils die Kennung des Fragebogens eintragen
  GLOBALBogName_tx = "S1"
  Set db = CurrentDb()
  strSQL = "SELECT * from T_Rektum where T_Rektum.Fnr = " & gLngFnr & " And T_Rektum.BogName_tx = '" & GLOBALBogName_tx & "'"

' Gibt es die Feldnamen überhaupt?  Wo ist gLngFnr definiert?  Welcher Wert steht da akt. drin?
Debug.Print strSQL   ' SQL-String im Direktfenster überprüfen
  Set rsRektum = db.OpenRecordset(strSQL, dbOpenSnapshot)   ' Der Sinn dieses Recordsets erschließt sich mir nicht. Für was ist der gut?
  Me.RecordsetClone.FindFirst "Fnr = " & gLngFnr & " and BogName_tx  = '" & GLOBALBogName_tx & "'"
  If Not Me.RecordsetClone.NoMatch Then
  Me.Bookmark = Me.RecordsetClone.Bookmark
  Else
  DoCmd.GoToRecord , , acNewRec
  Me!Fnr = gLngFnr
  Me!BogName_tx = GLOBALBogName_tx
  Me![Name] = GLOBALpname 'bei reservierten Namen unbedingt Eckklammern benutzen 
Me!Vn = GLOBALvname
  Me!Gebdat = GLOBALgebdat
'hier werden alle globalen Variablen aktiviert für den neuen Datensatz  '  ??
  End If
rsRektum.Close
Set rsRektum =Nothing
Set db = Nothing
db.Close   ' falsch/überflüssig
End Sub

Neuling1

Hallo Franz, sollte denn tatsächlich jemand Erbarmen haben?? ::)
Doch, die Namen (Steuerelemente) gibt es. habe sie auch in Modul deklariert
Option Compare Database
Option Explicit
Public gLngFnr As Long
Public GLOBALBogname As String
Public glAbgl As Boolean 'globale Zuweisung
Public GLOBALpname As String
Public GLOBALvname As String
Public GLOBALgebdat As Date.

Alles was ich möchte ist, dass die Felder Name, Fnr Vn, Gebdat in  Formular 1 eingegeben werden und auf den 4 aufeinanderfogenden Formularen angezeigt werden, um sicher zu sein, in welchem Datensatz ich mich befinde. Werden sie auch, aber immer diese Fehlermeldungen, die ich nicht einschätzen kann!

Wenn alle Daten eines Datensatzes eingegeben sind, soll der nächste Datensatz eingegeben werden, neuer Name, Vn, Gebdat und Fnr und weiter gehts
Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

DF6GL

Hallo,

verstehe, ehrlich gesagt, nur Bahnhof...


a) Welchen Sinn hat der Recordset?
b) Hast Du mit Debug.Print den SQl-String ausgegeben und geprüft?
c) "auf den 4 aufeinanderfogenden Formularen angezeigt "    ???
d) "um sicher zu sein, in welchem Datensatz ich mich befinde."  ???
e) "Hier bekomme ich nach der Eingabe in den  als global definierten Variablen  die Meldung, es wurde 1 Parameter erwartet.. "
Nein, die Meldung kommt, wenn das Form geöffnet wird (das Form_Load-Ereignis eintritt)

Neuling1

Hallo,
zur Verdeutlichung:
Ich habe eine Tabelle, auf der 4 Formulare basieren.
Bei den Formularen handelt es sich sozusagen um Seite 1 bis 4.
Um sicherzugehen, dass ich mich im selben Datensatz befinde, habe ich eine Fallnr, den Namen, den Vornamen und das Geburtsdatum als Globale Variablen definiert. Fallnr und Name bilden den doppelten Primärschlüssel. Diese Daten werden auf Seite 1 eingegeben, in die Tabelle geschrieben und von Formular zu Formular mitgenommen.
Wird nun im ersten Formular eine Fallnr eingegeben, sol das Programm gucken, ob die schon vorhanden ist oder nicht. Wenn nicht, dann reinschreiben, wenn ja anzeigen.
Den Code für Form load habe ich in jedes Formular geschrieben, weil ja jedes Formuar einen anderen Namen hat.
Den vorgeschlagenen Code "Debug.Print den SQl-String habe ich versucht, der hat gleich Fehlermeldungen ohne Ende produziert.
Noch einmal: Sollte ich für meine Zwecke nicht so viel Aufwand betreiben müssen, ist es mir recht! Ich möchte nur die Sicherheit, dass es läuft.


Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

DF6GL

Hallo,

Du beantwortest meine a) Frage leider nicht..


Insofern rate ich dazu, die Recordset-Geschichte einfach wegzulassen. Die ist unötig, weil nirgends gebraucht. Dann erledigt sich auch die Fehlermeldung. (Wobei eigentlich zu fragen wäre, was genau denn für Fehlermeldungen kommen, wenn Debug.Print strSQL ausgeführt werden soll.)

Weiterhin wird es zu Sperrkonflikten kommen, wenn alle 4 Formulare den selben Datensatz anzeigen/bearbeiten.

Was ist der Hintergrund dieser Maßnahme, 4 Formulare in dieser Konstellation zu benutzen?

Neuling1

Hallo,
na du stellst Fragen! Ich hab doch keine Ahnung, habe die Geschichte mit dem Recordset abkopiert, in der Annahme, ihn so für meine beschriebenen Zwecke zu brauchen. Ursprünglich war der mal entwickelt worden, weil es unterschiedliche Tabellen und unterschiedliche Formulare zu einem Datensatz gab.
Dafür wurde dann ein Formular Status entwickelt, dass allen Eingebern angezeigt wurde um den Status des Datensatzes zu überprüfen.
Also hier erfuhr jeder, ob es zu dieser Person schon einen Datensatz gab und welches Formular schon eingegeben war.Die GLOBALEN Variablen waren dann Erfassername, Erfassungsdatum und das entsprechende Formular. Es handelte sich um Fragebögen, die von der gleichen Person zu unterschiedlichen Zeitpunkten ausgefüllt werden mussten. Ein Fragebogen basierte dann auf je einer Tabelle.
Nun will ich so etwas in ganz abgespeckter Version benutzen, also nur für eine Tabelle.
Der Sinn der 4 Formulare ist einfach die Übersichtlichkeit.
Ich bekomme gar nicht alle Felder der Tabelle auf ein Formular. Viel zu unübersichtlich.
Für die Übersicht brauche ich 4 Seiten, ergo 4 Formulare. Alle 4 Formulare bearbeiten 1 Datensatz einer Tabelle.
Im Moment habe ich den Form load Code ausgetauscht und diesen hier drin stehen:
Private Sub Form_Load()
DoCmd.RunCommand acCmdAppMaximize
glAbgl = Abgl(Me!Name, Me!Vn, Me!Gebdat)
'Fnr ist im F_Fallnr in globale Variable geschrieben worden
'(diese Variable wird im Modul Formularoptionen deklariert) und wird jetzt hier eingelesen
Dim werti As Integer
Dim db As Database
Dim rsRektum As Recordset
Dim strSQL As String
Set db = CurrentDb()
strSQL = "Select T_Rektum.Fnr from T_Rektum where T_Rektum.Fnr = " & gLngFnr & ";"
Set rsRektum = db.OpenRecordset(strSQL)
Me.RecordsetClone.FindFirst "Fnr = " & gLngFnr
If Not Me.RecordsetClone.NoMatch Then
Me.Bookmark = Me.RecordsetClone.Bookmark
Else
With rsRektum
.AddNew
!Fnr = gLngFnr
.Update
.Bookmark = .LastModified
End With
Me.RecordsetClone.FindFirst "Fnr = " & gLngFnr
If Not Me.RecordsetClone.NoMatch Then
Me.Bookmark = Me.RecordsetClone.Bookmark
End If
  rsRektum.Close
db.Close
End If
End Sub
[/color]

Jetzt bleibt der Kompilierer aber schon wieder stehen. Diesesmal beim Formularwechsel. Jetzt ist bei Funktion Abgl, extra für den Abgleich der globalen Variablen gedacht, das Argument auf einmal nicht mehr optional!

[color=red]Private Sub F_Rektum_S1_öffnen_Click()
glAbgl = Abgl(Me!Name, Me!Vn, Me!Gebdat)
DoCmd.Close acForm, "F_Rektum_S2", acSaveYes
DoCmd.OpenForm "F_Rektum_S1"
End Sub[/color]


hier im Klassenmodul Formularoptionen steht sie:
[color=red]Legt jemand eine FallNr an und gibt Daten ein,
'so sorgt diese Funktion dafür, dass der innerhalb der Fragebogeneingabe
'eingetragene Name, Vorname und das Geburtsdatum
'in die Tabelle eingetragen wird. Startet
'jemand erneut die Bearbeitung eines Datensatzes, so steht nunmehr in
'jedem Formular der Name des Patienten und das Geburtsdatum

Public Function Abgl(pname As String, Vn As String, vname As String, Gebdat As Date) As Boolean
Dim db As Database
Dim rsRektum As Recordset
Dim strSQL As String
GLOBALpname = Name
GLOBALvname = Vn
GLOBALgebdat = Gebdat
Set db = CurrentDb()
strSQL = "Select * from T_Rektum where T_Rektum.Fnr = " & gLngFnr & ";"
Set rsRektum = db.OpenRecordset(strSQL)
With rsRektum
.Edit
If (GLOBALBogName_tx = "S1") Then
![Name] = pname
!vnS1 = vname
!S1Gebdat = Gebdat
End If
If (GLOBALBogName_tx = "S2") Then
!NameS2 = pname
!vnS2 = vname
!S2Gebdat = Gebdat
End If
If (GLOBALBogName_tx = "S3") Then
!NameS3 = pname
!vnS3 = vname
!S3Gebdat = Gebdat
End If
If (GLOBALBogName_tx = "S4") Then
!NameS4 = pname
!vnS4 = vname
!S4Gebdat = Gebdat
End If
.Update
.Bookmark = .LastModified
End With
rsRektum.Close
'db.Close
End Function

[/color]
Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

DF6GL

Hallo,

naja, wenn Du (aus welchen Gründen auch immer) mir die Fragen nicht beantworten kannst, wie soll ich dann verstehen, was Du geraten bekommen willst?

Das ganze Konzept kommt mir als unbrauchbar vor.


"bekomme gar nicht alle Felder der Tabelle auf ein Formular"   um wieviele Felder handelt es sich?  Es könnte schon ein Registersteuerelement als solches helfen, außerdem besitzt ein(!) Formular selber auch "Seiten" , durch die man blättern könnte.

Am Code (den man bei vernünftigen DB-Aufbau gar nicht braucht) müssen(!) einige Modifikationen durchgeführt werden. Teilweise habe ich das schon gepostet.


Ohne Ahnung  (lt. Deiner Aussage) zu haben bringt es Dich nicht weiter, nur Code wild zu kopieren und zu erwarten, dass der dann fehlerfrei funktioniert.

Bzgl. "das Argument auf einmal nicht mehr optional!" :  Warum sollte es optional sein? Diese Deklaration fehlt in der Funktion-Deklaration. Eigentlicher Grund aber ist die falsche Parameterangabe beim Funktionaufruf, die sich nicht mit der Argument-Liste der Funktion deckt.

Neuling1

Ohje,
welche Fragen habe ich denn noch nicht beantwortet? Ich habe doch versucht zu erklären, dass ich wirklich  zu den einzelnen Codes nichts sagen kann..
Ich bin davon ausgegangen, dass ich entweder mehrere Formulare oder ein ellenlanges, unübersichtliches Éndlosformular basteln muss.
Ich habe nur den einzigen Wunsch: Die Eingabe soll funktionieren! Wie, ist mir im Grunde genommen egal, ich hänge nicht an einzelnen Codes! Wenni ch die also besser alle löschen sollte und es eine ganz einfache Methode gibt, um zum Ziel zu kommen, wende ich sie sofort anl nachdem sie mir bekannt ist! In dieser Wochen muss ich zwingend die Daten in den Kasten bringen, am Freitag erste Ergebnisse!
Vermutlich komme ich durch "wildes Kopieren" nicht weiter, deshalb habe ich ja immer Anpassungen vorgenommen, die mir aber leider nicht zur endgültigen Problemlösung verhelfen.
Daher habe ich mich an das Forum gewandt, in der Hoffnung, hier Hilfe zu erfahren.
Mir ist durchaus bewusst, dass ich keine Ahnung habe, deshalb brauche ich ja Hilfe!

Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

DF6GL

Hallo,


naja, Hilfe bekommst Du ja, aber halt nicht genau in der Form, wie Du Dir erhofft hast.

Was soll(en) ich (wir) jetzt tun?




Du kannst mich ja "beauftragen" , die "Arbeit" zu übernehmen, was bedeutet, dass ich (vermutlich erheblichen) zeitlichen Aufwand in die Problemlösung stecken muss und der nicht kostenlos ist.

siehe :  http://www.access-o-mania.de/forum/index.php?topic=6969.0

Neuling1

Ach so, na ja, auf diese Weise hätte ich mein Problem natürlich auch nicht gelöst. Ich wusste nicht, dass sich Firmen hier ihre Kunden suchen. Eher, dass Privatleute, die Spaß an Access haben und selbst auch auf Tippsuche sind, durch diesen Umstand eines Problems ansichtig werden, es vielleicht wiedererkennen und konkrete Tipps geben.
Ichbin ja keine Firma, sondern einfache Arbeitnehmerin, die zwar mal Access gelernt hat, aber nie das Programmieren. Nun bin ich mittlerweile schon einige Jahre nicht mehr in der Materie gewesen und wollte auf die Schnelle eine Maske zur Datenerfassung haben.Für vielleicht 30 Datensätze.
Da lohnt es sich nicht, aus privater Tache einen Profi zu engagieren
Datenerhebung dient dem Nachweis, nicht der Form der Prozedur, deren Qualität mit Hilfe von Datenerhebung nachgewiesen werden soll

MzKlMu

#14
Hallo,
das Problem ist, dass man einfach nicht erkennt, was Du eigentlich vorhast. Trotz mhrmaligem Lesn bin ich nicht dahintergekommen.
Und der gepostete Code zeigt das nicht, bzw. lässt das nicht erkennen.

Zitatund wollte auf die Schnelle eine Maske zur Datenerfassung haben
Ein einfaches gebundenes Formular könnte das erledigen, ohne eine einzige Zeile Code.

Zitat von: Neuling1 am Juli 13, 2010, 11:59:12sondern einfache Arbeitnehmerin, die zwar mal Access gelernt hat, aber nie das Programmieren.
Für die Standardfunktionen von Access (und da gehört eine Eingabemaske dazu) muss man nicht programmieren. Erstelle mal mit dem Assistenten ein Formular und Du siehst was ich meine.

Aber dazu müsste man halt mehr über die DB wissen.
Tabellen ?
Beziehungen ?

Gruß Klaus