Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Juno am September 22, 2011, 16:19:18

Titel: Tabelle wird gesperrt
Beitrag von: Juno am September 22, 2011, 16:19:18
Hallo zusammen,

ihr glaubt gar nicht wie dankbar ich euch wäre wenn ihr mir mal helfen könntet!!

Anbei eine abgespeckte Version von meiner DB.

Mein Problem ist wie folgt:
In dem Hauptforumlar gibt es ein Button "EK Auftrag anlegen". In dem Formular welches dann eröffnet wird muss man bei "Auftragsart" einen Eintrag auswählen. Über "nach aktualisieren" des Feldes wird dann eine Nr. vergeben.
Soweit funktioniert alles.
Wenn man dann allerdings die tabelle "EK Typ" öffnet, wurde die Zahl nicht "hochgesetzt". Und die Tabelle ist gesperrt. Die Datensätze können nicht mehr geändert werden.

Ich suche jetzt schon verzweifelt seit einem Tag nahc der Lösung - ohne Erfolg....

Der VBA Code müsste auch funktionieren. Ich habe den gleichen Code in einer anderen DB. Da funktioniert das alles Problemlos.

Was ich alles versucht habe:

1. Computer neugestartet
2. Formulare und Tabellen in neue DB kopiert
3. Inhalt aus dem Formular in ein neues Formular kopiert
4. Code min. 100 mal überprüft....

[Anhang gelöscht durch Administrator]
Titel: Re: Tabelle wird gesperrt
Beitrag von: Juno am September 23, 2011, 21:54:18
kann mir niemand helfen? ???

Titel: Re: Tabelle wird gesperrt
Beitrag von: bahasu am September 24, 2011, 08:39:17
Moin,

habe im Ereignis ,,Command4_Click" einige Programmzeilen durch eine if-Anweisung lahmgelegt, da ich ein ,,ungutes Gefühl" habe, wenn ein Formular aufgerufen wird und in der Aufruf-Routine etwas mit den Daten im Formular gemacht wird.

Habe anschließend keine gesperrten Daten beobachtet.

Harald


[Anhang gelöscht durch Administrator]
Titel: Re: Tabelle wird gesperrt
Beitrag von: database am September 24, 2011, 14:02:40
Hallo,
ich habe mir dein Beispiel im Anhang kurz angesehen.

Dein Datenmodell ist mir insgesamt nicht ganz geheuer.
IDs und Primärschlüssel in Textfeldern abzubilden ist etwas gewagt  :o

Warum machst das nicht mit Autowerten, bei denen du keinerlei Eingriff nehmen musst?
Aber gut, deine Entscheidung ...  ;)

Wirf auch dieses leidige AutoExec-Makro weg *grrrr*
Das Formular kannst du auch auf ganz einfache Weise beim Starten der DB anzeigen - Datei --- Optionen ---- Aktuelle Datenbank --- Formular anzeigen ....
hier kannst du dein Formular auswählen, das dann beim Starten der DB angezeigt werden soll.

Allerdings müsstest du dafür sorgen, dass im Formular 'EK Aufträge' die Daten aktualisiert weden, wenn der Auftragsassistent geschlossen wird.
Was der Codeteil mit dem Recordset im Command4_Click - Ereignis bewirken soll ...  ??? ??? ???  den brauchst du eigentlich nicht.
Der ganze Code für die 'Berechnung' der Nummern ist eigentlich ein Chaos.
Warum mlässt du die Function nicht die neue Nummer ins aufrufende Formular zurückliefern? Hier passiert in deinem Code ein Fehler!
Die neue Nummer in der Tabelle ist um 1 höher als jene im Formular bei der Erstellung!
Du solltest davon Abstand nehmen, einen Wert byRef in eine Function zu übergeben um diesen dort zu ändern.
Bei der Benamsung deiner Variablen ist abenfallls einiges nicht in Ordnung - du schaffst dir selbst ein bald unüberschaubares Chaos,
wenn du in unterschiedlichen Routinen und / oder Funktionen, die sich gegenseitig aufrufen die gleichen Variablennamen verwendest.

Ich habe im Beispiel unten die Nummerierung umgestellt und für die Aktualisierung des EK Aufträge-Formulars gesorgt (im Schließen Ereignis des Assistenten-Formulars)
und die nicht benötigten Codezeilen im Command4 -  Ereignis auskommentiert.
Den Rest habe ich allerdings belassen und keine Änderungen nach meinen Kritikpunkten vorgenommen.


@bahasu
Zitatin der Aufruf-Routine etwas mit den Daten im Formular gemacht wird
Wird ja nicht - hier wird lediglich für das aufgerufene Formular die Erlaubnis zum Editieren erteilt - was ja eigentlich mehr als logisch erscheint - wozu wären Formulare denn sonst da.
Allerdings zweifle ich auch diese Codezeile an da im aufgerufenen Formular keinerlei Sperrungen vorhanden sind - also ist AllowEdits eigentlich auch umsonst.
Und der Rest des Codes ... die Geschichte mit dem Recordset welches aus der Abfrage gezogen wird, macht für mich absolut NULL Sinn, da hiermit nur ein neuer leerer Datensatz ans Recordset gehängt wird.



[Anhang gelöscht durch Administrator]
Titel: Re: Tabelle wird gesperrt
Beitrag von: Juno am September 26, 2011, 11:21:48
ja, für dich sind jetzt ein paar Dinge total unlogisch. Z.B. das mit den Allowedits. Das kommt einfach nur davon weil ich meine Ursprüngliche Datenbank verkleinern musste. Also habe ich alle überflüssigen Tabellen und Formulare rausgeschmissen.
In der Originalversion macht das mit den Allowedits aber Sinn.

Danke für deinen Tipp mit dem AutoExec. Werde es mal umsetzten.

Autowert kann ich bei dieser Tabelle nicht verwenden da ich für verschiedene Belegarten verschiedene Nummernkreise benötige.

Ich werde mir jetzt mal dein Bespiel angucken und mich nochmal melden.

Vielen Dank im Voraus für deine Mühe!
Titel: Re: Tabelle wird gesperrt
Beitrag von: Juno am September 26, 2011, 11:47:10
Habe jetzt die DB runtergeladen. Funktioniert alles soweit.

Wenn ich aber den Code in meine DB einbaue funktioniert es wieder nicht.
Dann habe ich genau das gleiche Problem wieder.

Ich gehe mal davon aus, dass es evtl. mit irgendwelchen anderen Einstellung zu tun hat. Ich kann aber unmöglich die komplette DB hochladen.

Woher könnte es denn kommen, dass eine Tabelle gesperrt wird?
Ich habe überprüft, dass alle Recordsets wieder geschlossen werden.

Titel: Re: Tabelle wird gesperrt
Beitrag von: database am September 26, 2011, 20:06:35
Hi,

Es kann auch damit zu tun haben, dass die Tabelle in einem anderen GEÖFFNETEN Formular beihnhaltet ist,
Mit der Tabelle ein Kombifeld gefüttert wird, auf die Tabelle in einem Codestück, das im Beispiel nicht zu sehen ist, verwiesen wird.
Die Möglichkeiten sind da recht umfangreich und vielfältig.
Ich trau' mich da keine seriöse Antwort zu geben - solange ich die DB nicht gesehen habe.

Wird denn der Code der fncGetNb2 KOMPLETT und OHNE Fehler abgearbeitet? Was passiert denn, wenn du diese Function mit F8 durchläufst - passiert was wird der UPDATE-Befehl denn überhaupt durchgeführt?
Nimm da mal das 'On Error Resume Next' raus - dadurch wird der Code ja weiter ausgeführt wenn ein Fehler passiert....
Titel: Re: Tabelle wird gesperrt
Beitrag von: MzKlMu am September 26, 2011, 20:12:15
Hallo,
ZitatAutowert kann ich bei dieser Tabelle nicht verwenden da ich für verschiedene Belegarten verschiedene Nummernkreise benötige.
Ich würde trotzdem einen Autowert verenden, nur für die Beziehungen. Die Nummernkreise für die Belegarten in einem extra Feld. Du machst Dir vieles einfacher, wenn Du Dich um die Schlüsselfelder nicht kümmern musst. Und Zahlen als Schlüsselfelder sind allemal besser.
Titel: Re: Tabelle wird gesperrt
Beitrag von: Juno am September 27, 2011, 17:34:07
Ich  habe jetzt mal die DB verkleinert und hoffe, dass ich nicht die Fehlerquelle rausgelöscht habe.....

Anbei.

Für eure Hilfe bereits im Voraus vielen Dank.

Änderung: Ach ja, hatte noch vergessen. Bei VK Aufträge ist die gleiche Prozedur wie bei EK Aufträge. Bei VK Aufträge funktioniert es Problemlos.  Bei EK Aufträge aber immer noch nicht.

[Anhang gelöscht durch Administrator]
Titel: Re: Tabelle wird gesperrt
Beitrag von: Juno am September 28, 2011, 12:48:25
Ich hatte vergessen eure Fragen zu beantworten....

ZitatEs kann auch damit zu tun haben, dass die Tabelle in einem anderen GEÖFFNETEN Formular beihnhaltet ist
Ich verwende die gleiche Abfrage in dem Formular Ek Aufträge und auch EK Auftragsassistent. Allerdings werden in dem Formular EK Aufträge keine Änderungen vorgenommen.
ZitatMit der Tabelle ein Kombifeld gefüttert wird, auf die Tabelle in einem Codestück, das im Beispiel nicht zu sehen ist, verwiesen wird.
Nicht das ich wüsste... Als ich das getestet habe waren nur die Formulare Start, EK Aufträge und EK Auftragsassistent geöffnet. Und da gibt es soetwas auf jeden Fall nicht.
ZitatWird denn der Code der fncGetNb2 KOMPLETT und OHNE Fehler abgearbeitet?
Ja
ZitatWas passiert denn, wenn du diese Function mit F8 durchläufst - passiert was wird der UPDATE-Befehl denn überhaupt durchgeführt?
Wenn ich zum Beispiel 5 Angebote hinter einander anlege wird immer die nächste Fortlaufende Nummer vergeben. Allerdings wird diese Zahl nicht in der Tabelle gespeichert....

ZitatIch würde trotzdem einen Autowert verenden, nur für die Beziehungen. Die Nummernkreise für die Belegarten in einem extra Feld. Du machst Dir vieles einfacher, wenn Du Dich um die Schlüsselfelder nicht kümmern musst. Und Zahlen als Schlüsselfelder sind allemal besser.
Ich habe mal zum test einfach ek_nr auf Autowert gesetzt. Allerdings wird dann auch irgendwann (konnte nicht genau feststellen wann) die Tabelle EK Aufträge gesperrt. Das kann also nicht nur mit den Zahlen zusammenhängen.
Titel: Re: Tabelle wird gesperrt
Beitrag von: Juno am September 29, 2011, 09:22:39
Kann mir keiner helfen?
Titel: Re: Tabelle wird gesperrt
Beitrag von: DF6GL am September 29, 2011, 10:27:52
Hallo,

nimm mal die Beziehungen zwischen den beiden Tabellen heraus und binde die Forms nur an die jeweilige Tabelle. Desweiteren vermeide Verknüpfungseigenschaften <>1 in Abfragen für Formulare was zu Sperrungen über die Jet-Engine, bzw. zu Nicht-Aktualisierbarkeit dieser Abfragen führen kann.

Die Ek_Nr/EkTyp_Nr zweimal zu führen und zu synchronisieren, ist nicht so prickelnd.  EkTyp_Nr sollte allenfalls als die Initialisierungsnummer für EK_Nr dienen, wenn verschiedene Nummernkreise erforderlich sind.


Die beiden Felder "ek_Nr" und "ektyp_id" sollten einen zusammengesetzten Primärschlüssel in EK_Aufträge darstellen. Weiterführend muss dann auch EK_Details mit einem Feld für ektyp_id ausgestattet und für eine Beziehung herangezogen werden.


Statt zusammengesetzten Primärschlüssel wäre es besser, ein separates Primärschlüsselfeld (Autowert) zu verwenden und lediglich über die o.g. Felder einen zusammengesetzten Index zu legen. Dann wäre eine Beziehung zu EK_Details einfach über dieses Autowert-Feld   zu bewerkstelligen (wie jetzt über ek_nr) .

Insgesamt sehe ich einige weitere Unklarheiten in der Tabellenstruktur, z. B. bei Artikeln, EK_Preise und die fehlende Zuordnung zu LieferantenPreisen, falls es zutrifft, dass derselbe Artikel von mehreren Lieferanten bestellt werden kann..


Weiterhin:

Was soll das Öffnen eines Recordsets und Einstellen auf "Anfügemodus":


Private Sub Command4_Click()
       DoCmd.OpenForm "ek Auftragsassistent"
       DoCmd.GoToRecord , , acNewRec
   

'besser:
  DoCmd.OpenForm "ek Auftragsassistent", , , , acFormAdd, acDialog

   Forms![ek auftragsassistent].AllowEdits = True
'    Forms![ek auftragsassistent]![ek details].Form.AllowEdits = True
'    Forms![ek auftragsassistent]![ek details].Form.AllowAdditions = True
'    Forms![ek auftragsassistent]![ek details].Form.AllowDeletions = True
 
   Dim dbs As DAO.Database
   Dim rst As DAO.Recordset

   Set dbs = CurrentDb
   Set rst = dbs.OpenRecordset("ek Aufträge QRY", dbOpenDynaset)

   With rst
       .AddNew
   End With  
rst.Close
   Set rst = Nothing


End Sub