DJTank Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 Hallo Leute, folgende Fehlermeldung spuckt mir Access aus: Das Mircosoft Jet-Datenbankmodul hat den Vorgang angehalten, da Sie und ein weiterer Benutzer gleichzeitig versuchen, dieselben Daten zu verändern. Das Problem tritt bei einem RS.EDIT/RS.UPDATE auf. Ausgangspunkt ist eine Auflistung von Aufträgen. Jetzt das dubiose, bis zum ca. 18000. Auftrag kann ich das Update problemlos durchführen, wenn ich aber noch weiter runterscrolle, bekomme ich immer nur diesen Fehler. Kann mir da jemand helfen? Danke schonmal lg Stefan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 dürfte an einer defekten datenbankdatei liegen, reparier bzw. komprimier sie mal. bzw. importier sie in eine neue datei. zumindest ist das das, was in den meisten lösungsvorschlägen dazu geraten wird, siehe google-suche nach "Fehler 3197". s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DJTank Geschrieben 22. August 2005 Autor Teilen Geschrieben 22. August 2005 Dankeschön, diesen Lösungsansatz habe ich auch gefunden und ausprobiert. Nachdem du mir diese Lösung nocheinmal nahegelegt hast, hab ich noch einmal komprimiert, noch einmal alles in eine neue MDB importiert, aber nach der 7. oder 8. Stichprobe bekomme ich wieder den selben Fehler *ratlos* Normalerweise arbeiten wir ja mit einem über verknüpfte Tabellen funktionierendes Access-FE mit Oracle-BE. Wenn das Recordset mit meinem fatalen Edit/Update über eine verknüpfte Tabelle geöffnet wird, kann ich Edit/Update ausführen. Wenn ich jedoch eine Pass-Through-Abfrage mache (eigentlich ja die selbe ODBC-Connection), bekomme ich diesen komischen Fehler. Wir verwenden hier Access2k, wäre es möglich, dass der Fehler mit AccessXP nicht mehr auftritt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 kannst du mal die betreffende function/sub hier in ein tag sowie den/die connectionstring(s) der pass-trough-abfragen sowie die wichtigesten eigenschaften der abfrage hier reinposten? s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DJTank Geschrieben 23. August 2005 Autor Teilen Geschrieben 23. August 2005 Public Function f_proSpeichern(ByVal strPronrOK As String, ByVal VarZuteilenAct As Long, Optional ByVal bolFree As Boolean) As String '-------------------------------------------------------------- '################Legt vorhandenen Daten ab#########' Dim rs As Recordset, rs1 As Recordset Dim Erg_VWzuVP As String Dim VP_Mont As String Dim Rabatte As Long Dim hlpRabatte As Long Dim Help As String, Help1 As String Dim sngFaktorLif As String, sngFaktorKnd As String ' On Error GoTo Fehler ' '***Unwesentlicher Code With Forms!f_pro If Nz(.preisliste, conSpace0) = conSpace0 Then .preisliste = pubStdPreisliste 'NULL abfangen ' Call f_proAkt 'Formular f_pro aktualisieren ' If Nz(strPronrOK, conSpace0) <> conSpace0 Then '--- preis definieren, Montageauftrag oder nicht... zProTyp = Mid(strPronrOK, OrderLen1 + OrderLen2, OrderLen2) 'Klassen-typ wird der klassen-variablen zProTyp übergeben If (aryProArt(zProTyp).MONAUFTRAG = True Or aryProArt(zProTyp).SerAuftrag = True) Then 'denn dann ist es ein montageauftrag! If Nz(.tfS_preis, conSpace0) = conSpace0 Then .tfS_preis = AufXStellenRunden(.tfWWert, conRund2) Else .tfS_preis = AufXStellenRunden(.tfS_preis_org, conRund2) End If '--- '*********daten für t_pro, t_pro1, t_pro2 und t_rek laden ********' [B]Set rs = CurrDataBase.OpenRecordset("SELECT TOP 1 id_knd,id_asp,id_lad,mwst,zelle,name_ver,bestnr_knd,benennung,Name,status,dat_warn,dat,dat_sort,lif_dat,w_wert,gesperrt,zuordnung,zuordnung_anz,Preisgruppencode,Import,p_wert,dat_best,dat_stat,dat_an,geschäftsbuchungsgrp,name_mon,t_pro1.memo,za_ko,lif_ko,vers_art,vers_kosten,lif_kosten,lif_text,vers_text,KleinMengenZuschlag,terminSAT,TerminKBZ,TerminMSM,terminKLT,rech_gut,dat_von,t_rek.memo AS MemoR,t_rek.art FROM ((t_pro LEFT JOIN t_pro1 ON t_pro.pronr1 = t_pro1.pronr1) LEFT JOIN t_pro2 ON t_pro.pronr1 = t_pro2.pronr1) LEFT JOIN t_rek ON t_pro.pronr1 = t_rek.pronr1 WHERE t_pro.pronr1 = '" + strPronrOK + "'")[/B] ' If Not (rs.BOF And rs.EOF) Then [B]rs.Edit[/B] Rabatte = 0 ' If (aryProArt(zProTyp).MONAUFTRAG = True Or aryProArt(zProTyp).SerAuftrag = True) Then '--------------- sngFaktorLif = getWert("t_preisliste_init", "code", .preisliste, "Faktor") 'Umrechnungsfaktor für Montageauftrag If sngFaktorLif = conError Then sngFaktorLif = getWert("t_preisliste_init", "code", pubStdPreisliste, "Faktor") If Nz(.tfZuordnung, conSpace0) = conSpace0 Then VP_Mont = Nz(.tfS_preis, 0) 'Verkaufspreis aus Montageauftrag sngFaktorKnd = sngFaktorLif 'Umrechnungsfaktor ist hier immer = 1 Else 'Verkaufspreis aus Kundenauftrag Set rs1 = CurrDataBase.OpenRecordset("SELECT TOP 1 preis, rabatt, wrgp FROM t_zeile WHERE pronr1 = '" + Nz(.tfZuordnung, conSpace0) + "' AND best_nr = '" + strPronrOK + "'", dbOpenForwardOnly) If rs1.BOF And rs1.EOF Then VP_Mont = Nz(.tfS_preis, 0) 'Verkaufspreis aus Montageauftrag, da keinen Verkaufspreis gefunden sngFaktorKnd = sngFaktorLif 'Umrechnungsfaktor ist hier immer = 1 Else VP_Mont = rs1(0) * (100 - rs1(1)) / 100 'Verkaufspreis gefunden* sngFaktorLif / sngFaktorKnd sngFaktorKnd = getWert("t_pro", "pronr1", .tfZuordnung, "Preisgruppencode") 'Preisliste aus Kundenauftrag sngFaktorKnd = getWert("t_preisliste_init", "code", sngFaktorKnd, "Faktor") 'Umrechnungsfaktor für Kundenauftrag 'Rabatt aus der Rabattzeile holen --> aktuell gültiger Rabatt wird verwendet Help = getWert("t_pro", "pronr1", .tfZuordnung, "id_knd") 'Kundennummer aus Kundenauftrag Help = getWert("a_pass_knd", "id_knd", Help, "rabatt_txt") 'Rabattzeile des Kunden laden Help1 = Nz(getWertExact("t_ra_pv", "knd", Help, "art", rs1(2), "rabatt"), 0) 'Rabatt laden ( in % ) Rabatte = IIf(Help1 = conError, 0, Help1) End If Set rs1 = Nothing End If VP_Mont = VP_Mont * sngFaktorKnd / sngFaktorLif 'mit Umrechnungsfaktor '--------------- Erg_VWzuVP = f_VWzuVP(Nz(.tfWWert, 0), Nz(VP_Mont, 0), Rabatte, hlpRabatte) ' -15% ? If Erg_VWzuVP = conError And strClose = conSpace0 Then Call MsgBoxLang(15, str(hlpRabatte)) End If '*********Wurde der Verkaufswert verändert? - nur bei Montageaufträgen ********' If rs!W_Wert <> Nz(.tfWWert, 0) Then If Nz(rs!p_wert, 0) = Nz(.tfS_preis, 0) And strClose = conSpace0 Then 'Verkaufspreis prüfen Call MsgBoxLang(8, strPronrOK) End If End If End If '---- 'Soll die Übersicht aller Aufträge aktualisiert werden ? If Nz(rs!status, 0) <> Nz(.kfStatus, 0) Or Nz(rs!bestnr_knd, conSpace0) <> Left(Nz(.tfBestKnd, conSpace0), rs!bestnr_knd.Size) Or Nz(rs!lif_dat, conSpace0) <> Nz(.tfLifDat, conSpace0) Then Forms!f_haupt.RecordSource = conSpace0 End If '---- 'Registerblatt Kunde rs!id_knd = IIf(Nz(.kfKunde, conSpace0) = conSpace0, Nz(rs!id_knd, conSpace0), Nz(.kfKunde, conSpace0)) rs!id_asp = Nz(.kfAsp, conSpace0) rs!id_lad = Nz(.tfIdAsp, conSpace0) 'Registerblatt Allgemein Rabatte = Nz(.tfMwst, 0) rs!mwst = Nz(.tfMwst, 0) rs!ZELLE = Nz(.tfZelle, 0) rs!name_ver = Nz(.tfVerNeu, conSpace0) rs!bestnr_knd = Left(Nz(.tfBestKnd, conSpace0), rs!bestnr_knd.Size) rs!benennung = Left(Nz(.tfBenennung, conSpace0), rs!benennung.Size) rs!NAME = Nz(.tfName, conSpace0) rs!status = Nz(.kfStatus, 0) rs!dat_warn = .tfWarnDat If IsNull(rs!dat) Then rs!dat = Date rs!dat_sort = Now rs!lif_dat = .tfLifDat On Error Resume Next rs!W_Wert = 0 rs!W_Wert = Nz(.tfWWert, 0) 'Dieser Code verursacht zeitweise einen Fehler On Error GoTo Fehler rs!GESPERRT = IIf(bolFree = False, rs!GESPERRT, False) 'bolfree = false (ist Standardwert) rs!zuordnung = Nz(.tfZuordnung, conSpace0) rs!zuordnung_anz = Nz(.tfZuordnungAnz, 1) rs!Preisgruppencode = IIf(Nz(.preisliste, conSpace0) = conSpace0, Nz(rs!Preisgruppencode, conSpace0), Nz(.preisliste, conSpace0)) rs!import = Nz(.opImport, 1) '--- der folgende eintrag wird, falls der auftrag eine Aufgabe ist weiter unten überschieben! rs!p_wert = Nz(.tfS_preis, 0) ' '*********daten für t_pro1********' rs!dat_best = .tfBestDat rs!dat_stat = .tfStatDat rs!dat_an = .tfAnDat rs!geschäftsbuchungsgrp = IIf(Nz(.tfGeschäftsbuchgrp, conSpace0) = conSpace0, Nz(rs!geschäftsbuchungsgrp, conSpace0), Nz(.tfGeschäftsbuchgrp, conSpace0)) rs!name_mon = Nz(.tfMonteur, conSpace0) rs!memo = .farbstat rs!za_ko = Nz(.kfzak1, conSpace0) rs!lif_ko = Nz(.kflifko1, conSpace0) rs!vers_art = Nz(.kfvers1, conSpace0) rs!vers_kosten = Nz(.tfVers1, 0) rs!lif_kosten = Nz(.tflifko1, 0) rs!lif_text = Nz(.tflifko2, conSpace0) rs!vers_text = Nz(.tfvers2, conSpace0) rs!Kleinmengenzuschlag = Nz(.tfKleinmengenzuschlag, 0) ' '***********daten für t_pro2**********' rs!terminSAT = .tfDatSAT rs!TerminKBZ = .tfDatKBZ rs!TerminMSM = .tfDatMSM rs!terminKLT = .tfDatKLT rs!rech_gut = IIf(Nz(.ogRechnung, conSpace0) = conSpace0, Nz(rs!rech_gut, 1), Nz(.ogRechnung, 1)) '*****************reklamations ablage, wenn notwendig***********' 'Allgemeine Info: im falle einer zweiten rekl. wird der reklamationsbeginn nicht gelöscht, 'das rek-ende aber schon, was bedeutet, die reklamationsdauer zählt von beginn der ersten 'reklamation bis ende der letzten...! If .kkRek = True Then If IsNull(rs!dat_von) Then rs!dat_von = Date rs!memoR = Nz(.rek_tx, conSpace0) rs!art = Nz(.rek_art, conSpace0) End If ' [B]rs.Update[/B] Else If strClose <> "close" Then Call MsgBoxLang(137) End If ' Ausgang: On Error Resume Next strCurrentAction = conSpace0 Set rs = Nothing Set rs1 = Nothing End With Exit Function Fehler: If Nz(Err.Description, conSpace0) = conSpace0 Or Err.Number = 0 Then Call ErrorLog(strUserIdent, 815815, "Order: " + strCurrentAction, "m_funktionen / f_proSpeichern", , True) Else Call ErrorLog(strUserIdent, Err.Number, Err.Description, "m_funktionen / f_proSpeichern", , True) End If On Error Resume Next Resume Next End Function Hab mal den RS, das RS.Edit und das RS.Update fett gemacht. Hier noch die Pass-Through-Abfrage: SELECT t_pro.DAT, t_pro.LIF_DAT, t_pro.PRONR1, t_pro.STATUS, t_pro.NAME_KND, t_pro.BESTNR_KND, t_pro.ID_KND, t_pronr_art.ART_ART FROM HACOS.t_pro LEFT OUTER JOIN HACOS.t_pronr_art ON t_pro.PRONR1 = t_pronr_art.PRONR1 WHERE (((t_pro.ARCHIV)=0)) ORDER BY t_pro.DAT_SORT DESC , t_pro.DAT DESC; Und hier die Eigenschaften: ODBC-Verbindung: ODBC;DSN=hacostooraclepervba;UID=SYSTEM;PWD=HERON;DBQ=HACOS.HERONDOM.ROBOTUNITS.COM;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0; Liefert Datensätze: Ja Meldungen protokollieren: Nein ODBC-Wartezeit: 60 Sonst sind keine (wesentlichen) Eigenschaften vorhanden. Stefan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.