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
Hallo,
Zitatimmer wieder Fehlermeldungen
...und wo kracht's?
Lass den Codeabschnitt mal mit F8 schrittweise abarbeiten - Haltepunkt auf Form_Load setzen.
Grüße
Peter
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!
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? ??? >:( >:(
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
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
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)
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.
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?
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]
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.
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!
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
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
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 ?
ZitatEin einfaches gebundenes Formular könnte das erledigen, ohne eine einzige Zeile Code
Wie funktioniert denn das?
Ich bin schon wirklich verzweifelt, was soll ich nur noch machen, um meine Absichten zu erklären?
Ich habe eine Haupttabelle, in die sollen die Daten rein.Der einzelne Datensatz ist sehr lang. Daher dachte ich an mehrere Formulare wegen der Übersicht.
Nun möchte ich einfach in jedem Formular sehen, zu wem ich da meine Daten eingebe, mehr nicht! Ich habe Sorge, im Datensatz zu verrutschen, oder mich zu vertun!
Diese Sorge soll mir beim Formularwechsel ein Code abnehmen, indem er jedem der Formulare den Namen, Vornamen, Fallnr und Geburtsadatum des aktuellen Datensatzes übergibt und bei Öffnen anzeigt.
Mit den Sprüngen habe ich kein Problem, dafür reicht es bei mir noch. Es geht aber um die beschriebenen Felder, sozusagen die Stammdaten, die ja im ersten Formular eingegeben werden.
Wenn die Seite optisch voll ist, will ich nur im Detailbereich eine Änderung, nämlich die nächsten Steuerelemente sehen, im Formularkopf stehen die genannten Felder, die eben jetzt auf der nächsten Seite stehen sollen. Also gebe ich auf Formular_S1 bei Name Müller, bei Vorname Egon, bei geboren 1.11.1911, Fallnr 1 ein, soll genau das auf Formular_S2 auch stehen. Kann ich auf Formular S1 noch Daten zu Erkrankungen eingeben, sind bei Formular S2 z.B die Daten zur OP.
Für die Sprünge, bzw einige Kombinationsfelder habe ich mir noch kleine Abfragen erstellt, darauf greift man aber lediglich in den Feldern zu. Im MOment funktioniert es einfach nicht. Was ich auch mache, es gibt Fehlermeldungen.
Wenn es eine einfache Lösung gibt, um die Fragestellung zu lösen, bin ich glücklich
Hallo,
ich bin ziemlich sicher, dass sich das ohne eine einzige Zeile VBA problemlos lösen lässt.
ZitatDiese Sorge soll mir beim Formularwechsel ein Code abnehmen, indem er jedem der Formulare den Namen, Vornamen, Fallnr und Geburtsadatum des aktuellen Datensatzes übergibt und bei Öffnen anzeigt.
Auch das ist der falsche Weg. Eine Tabelle sollte einen Primärschlüssel haben. Mit diesem wird der Datensatz eindeutig idendifiziert. Und niemals über so viele Felder (Namen, Vornamen, Fallnr , Geburtsdatum)
Wie von Franz bereits erwähnt, kannst Du sehr viele Felder einer Tabelle auf einem Formular mit Registern sehr sauber strukturiert anzeigen und bearbeiten. Dann würde auch diese ganze unglückliche Konstruktion mit der Syncronisation über Felder (auch noch mehrere) ersatzlos entfallen.
Willst Du nur die Daten aus der Haupttabelle anzeigen/bearbeiten?
Ja!Nur die Daten aus einer Tabelle .
Ich verstehe schon euer Problem. Access und Normalisieren, aber in diesem Fall ist es nun mal anders.
Ich habe nur die kleinen Abfragedinger und eine riesige Tabelle.
Ich hab mittlerweile mal die Register angesehen, aber da steige ich auf die Schnelle nicht durch. Vielleicht bin ich durch den Zeitdruck auch schon so paralysiert. Ich muss die Daten am Freitag im Kasten haben und habe doch die Formulare und die Tabelle und die Abfragen alle fertig Nun noch dieses Problem, das alles blockiert!!!!!
Ach - vergessen! Primärschlüssel gibt es: Einen doppelten, den bilden Fnr und Name
Hallo,
ZitatIch verstehe schon euer Problem. Access und Normalisieren, aber in diesem Fall ist es nun mal anders.
Nein, verstehst Du nicht. Das hat mit normalisieren nicht das geringste zu tun. Es geht einzig und allein um die Darstellung und Bearbeitung der Daten. Von Normalisierung hat noch keiner was gesagt. Die Normalisierung wäre eine weitere Baustelle die noch zu beginnen wäre. Aber das lassen wir jetzt mal.
Kannst Du nicht mal die Tabelle mit 2-3 (anonymen) Beispieldatensätzen hier hochladen (gezippt)?
ja klar, ich hab ja erst einen Datensatz drin. Mal gucken, ob ich das jetzt auf die Reihe kriege.
Danke für deine Bemühungen, wirklich. Mttlerweie habe ich mir aus Verzweiflung alles auf ein Formular geknallt, mit Seitenumbrüchen
Die hatte ich total aus dem Gedächtnis verloren. Aber obs klappt?
[Anhang gelöscht durch Administrator]
Hallo,
beim ersten Start der DB wird schon an den fehlenden Deklarationen der Public-Variablen gemeckert...
Die Deklarationen gehören in ein Standardmodul, insbesondere, wenn die Variablen Formular-übergreifend benutzt werden sollen.
Hallo,
anbei ein Vorschlag mit Registern.
Ohne eine einzige Zeile VBA.
Das Datenmodell ist dringend zu überarbeiten. Das ist so eigentlich nicht brauchbar.
Was machst Du z.B. wenn es mehr als 6 Komplikationen gibt?
Oder die OP ist besonders kompliziert und es werden 5 Assistenzärzte gebraucht?
[Anhang gelöscht durch Administrator]
quote]Was machst Du z.B. wenn es mehr als 6 Komplikationen gibt?
Oder die OP ist besonders kompliziert und es werden 5 Assistenzärzte gebraucht?[/quote]
:)Sehr gute Überlegung, doch: Im Grunde wollen die nur die Hauptkomplikation und mehr als 2 Assistenten sind nur Zuschauer!!! :D
Vielen Dank für deine Hilfe, jetzt muss ich mir das genau ansehen!
Also ganz toll, muss ich schon sagen. Und so sipel! Die Register sind eine ganz tolle Alternative, ich habe noch nie damit gearbeitet und kenne sie gar nicht. Aber sie erfüllen genau ihren Zweck. Ganz herzlkichen DAnk