質問

このデータベースアプリケーションの作業中、私は明らかにアプリケーションのフォームを破壊することができたようです - フォーム上の任意のフィールドへの編集を保存しようとすると、クラッシュがアクセスされます。再び開きます。

フォーム +コントロール全体をテキストとしてエクスポートしてから、VBコード(Allen BrowneのWebサイトから)を使用して再輸入しようとしましたが、アクセスをクラッシュさせたり、フォームがインポート可能ではないと言ったりすることなく再輸入しません。エラーに(エラー番号または説明が与えられていません)。

フォームはかなり複雑です。したがって、私はそれをゼロから作り直すことをためらっていますので、それを保存する方法はありますか?私がそれを回復することができた場合、これは私がすべてを新しいMDBファイルに転送する必要があることを意味しますか(それがカスケード障害効果である場合)?

正直に言うと、私は以前にアクセスデータベースオブジェクトを破壊することができなかったので、これがそのMDBファイルの終わりを示すものなのか、それとも前と同じように修正して続行できるものであるかどうかはわかりません。

役に立ちましたか?

解決 2

私がやらなければならなかったのは、フォームを再作成することであり、strsupplieridコンボボックス自体がクラッシュの原因であることを発見するまで、要素ごとに要素をコピーすることでした。私はそれをゼロから再作成し、手動で同じプロパティを与え、私が切り取ってクリップボードに貼り付けた保存されたコピーからVBを置き換えました。フォームが機能し、破損したフォームを削除し、データベースを圧縮しました。助けてくれてありがとう、みんな! :)

他のヒント

他の人は、あなたの腐敗したフォームを回復するためのさまざまなアプローチを提供しました。コードを含むアクセスオブジェクトが取り返しのつかないほど破損し、これらのメソッドが機能しない場合があります。その場合、バックアップを見て、腐敗していないバージョンを出発点として見つけて、それをインポートしてから、オブジェクトの現在の状態に戻す必要があります。

コードベアリングオブジェクトで腐敗に遭遇した場合、おそらくコーディングプラクティスを変更する必要があることを示唆する回答を投稿しています。

  1. まず、定期的なバックアップを保持し、それらを上書きしないようにする必要があります。以前のバージョンに戻ることは、常に最後の手段です。

  2. VBEオプションのコンパイルオンデマンドを常にオフにしてください。マイケル・カプランの記事を読んでください 逆コンパイルスイッチの実際の取引 理由の説明のために。

  3. VBEで、コンパイルボタン(および呼び出しスタックボタン)を通常のVBEツールバーに追加し、コードの数行ごとにコンパイルボタンを押して、コードを保存します。

  4. バックアップしてアプリを逆コンパイルするための妥当な間隔を決定します。頑丈なコードドキドキをしている場合は、毎日これを行うことをお勧めします。コーディング中にアクセスクラッシュが発生した場合は、バックアップを作成し、逆コンパイル/再コンパイルすることをお勧めします。確かにユーザーに配布する前に、アプリを逆コンパイルして再コンパイルする必要があります。

これらのプラクティスに従うと、コードを含むアクセスオブジェクトの破損の原因が可能な限り最小限に抑えられますが、バックアップのバックアップの複数のレベルは必須です。常に複数のレベルでカスケードします - いくつかのタイプのバックアップがあり、自動バックアップに依存しません)。

しかし、重要なポイント:

頻繁にコンパイルし、合理的に頻繁に逆コンパイルし、厄介なものはアプリケーションのPコードに蓄積する機会がありません。

Decompileは、データベースのコピーを作成したら、試してみるのに良いことです。ファイルを使用して別の名前でフォームを保存してみましたか>> ASを保存しましたか?また、データベースウィンドウとは別の名前でフォームをコピーして貼り付けてみてください。

また、1つの腐敗したフォーム/レポートが残りのデータベースに広がっていないことも私の経験でした。それは、物事をきれいにすることは害はないと言っています。コンパクトおよび修理は、テーブルとインデックスや関係などの関連データのみを修正します。フォームやレポートなどの破損した他のオブジェクトをクリーンアップするには、新しいMDB/ACCDBにインポートする必要があります。ヒント:オブジェクトがたくさんある場合は、データベースコンテナウィンドウを閉じます。アクセスは、データベースコンテナウィンドウを更新するインポート中に多くの時間を廃棄します。

アレン・ブラウンからの腐敗に対処するための一連の方法を見たことがありますか: http://allenbrowne.com/ser-47.html ?特に、逆コンパイル。

コピーを試してコントロールを新しいフォームに貼り付けて、コードに徐々に追加してみる価値があります。

私は何度もそれを起こしました。これが私のベーコンを救ったいくつかのことです。私はあなたが2003年以上アクセスを使用していると仮定しています。データベースを変換して、2002または2000形式にアクセスしてみてください。次に、そのデータベースを現在のバージョンに戻します。

以前のバージョンで肥大化と戦うために作成したコードを次に示します。また、この問題は95%の時間を解決しました。

オプションデータベースオプションを明示的に比較します

Private Sub cmdCreateDuplicate_Click()
'********************************************************
' Author        Daniel Tweddell
' Revision Date 10/27/05
'
' To Combat bloat, we are recreating the a new database
'********************************************************
On Error GoTo Err_Function
    Dim strNewdb As String
    Dim AppNewDb As New Access.Application 'the new database we're creating to manage the updates
    strNewdb = CurrentProject.Path & "\db1.mdb"
    SysCmd acSysCmdSetStatus, "Creating Database. . ."
    With AppNewDb
        DeleteFile strNewdb 'make sure it's not already there
        .Visible = False 'hear no database see no database
        .NewCurrentDatabase strNewdb 'open it
        ChangeRemoteProperty "StartupShowDbWindow", AppNewDb, , dbBoolean, False
        ChangeRemoteProperty "Auto compact", AppNewDb, , dbBoolean, True
        ImportReferences AppNewDb, Application
        .CloseCurrentDatabase
    End With
    Set AppNewDb = Nothing
    Dim ao As AccessObject
    For Each ao In CurrentData.AllTables
        If Left(ao.Name, 4) <> "msys" Then
            DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acTable, ao.Name, ao.Name
            SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
        End If
    Next
    For Each ao In CurrentData.AllQueries
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acQuery, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllForms
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acForm, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllReports
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acReport, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllMacros
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acMacro, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllModules
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acModule, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    MsgBox "Creation Complete!" & vbCrLf & "Reset Password", vbExclamation, "New Database"
Exit Sub
Err_Function:
    ErrHandler Err.Number, Err.Description, Me.Name & " cmdCreateDuplicate_Click()"
End Sub


Function DeleteFile(ByVal strPathAndFile As String) As Boolean
'***********************************************************************************
' Author        Daniel Tweddell
' Revision Date 04/14/03
'
' Deletes a file
'***********************************************************************************
On Error GoTo Err_Function
    DeleteFile = True                   'default to true
    If UncDir(strPathAndFile) <> "" Then   'make sure the file is there
        Kill strPathAndFile             'delete a file
    End If
Exit Function
Err_Function:
    ErrHandler Err.Number, Err.Description, "DeleteFile()", bSilent
    DeleteFile = False                  'if there is a problem, false
End Function

Public Sub ChangeRemoteProperty(strPropName As String, _
                                appToDB As Access.Application, Optional appFromDB As Access.Application, _
                                Optional vPropType As Variant, Optional vPropValue As Variant)
'********************************************************************************
' Author        Daniel Tweddell
' Revision Date 01/13/04
'
' Changes/adds a database property in one db to match another
'********************************************************************************
On Error GoTo Err_Function
    Dim ToDB As DAO.Database
    Dim FromDB As DAO.Database
    Dim prpTest As DAO.Property
    Dim bPropertyExists As Boolean
    Set ToDB = appToDB.CurrentDb
    If Not appFromDB Is Nothing Then Set FromDB = appFromDB.CurrentDb
    bPropertyExists = False 'flag to see if we found the property
    For Each prpTest In ToDB.Properties 'first see if the property exists so we don't error
        If prpTest.Name = strPropName Then
            If IsMissing(vPropValue) Then vPropValue = FromDB.Properties(strPropName) 'in case we want to assign it a specific value
            ToDB.Properties(strPropName) = vPropValue 'if it does set it and get out or the loop
            bPropertyExists = True
            Exit For
        End If
    Next
    If Not bPropertyExists Then ' Property not found.
        Dim prpChange As DAO.Property
        If IsMissing(vPropValue) Then
            With FromDB.Properties(strPropName)
                vPropValue = .Value 'in case we want to assign it a specific value
                vPropType = .Type
            End With
        End If
        Set prpChange = ToDB.CreateProperty(strPropName, vPropType, vPropValue) 'add it
        ToDB.Properties.Append prpChange
    End If
Exit Sub
Err_Function:
    ErrHandler Err.Number, Err.Description, "ChangeRemoteProperty()", bSilent
End Sub

Public Sub ImportReferences(AppNewDb As Access.Application, appUpdateDB As Access.Application, Optional iStatus As Integer)
'********************************************************************************
' Author        Daniel Tweddell
' Revision Date 01/13/04
'
' Copies the current references from the one database to another we're building
'********************************************************************************
On Error GoTo Err_Function
    Dim rNewRef As Reference
    Dim rUpdateRef As Reference
    Dim bReferenceExists As Boolean
    Dim rToAdd As Reference
    Dim sReference As String
    If iStatus <> 0 Then ProgressBarUpdate iStatus, "Referencing Visual Basic Libraries. . ."
    For Each rUpdateRef In appUpdateDB.References
        bReferenceExists = False
        For Each rNewRef In AppNewDb.References
            sReference = rNewRef.Name
            If rUpdateRef.Name = sReference Then
                bReferenceExists = True
                Exit For
            End If
        Next
        If Not bReferenceExists Then
            With rUpdateRef
                Set rToAdd = AppNewDb.References.AddFromGuid(.Guid, .Major, .Minor)
            End With
        End If
    Next
Exit Sub
Err_Function:
    ErrHandler Err.Number, Err.Description, "ImportReferences(" & sReference & ")", bSilent
    Resume Next
End Sub

10列以上のコンボボックスがアクセスフォームを破損させる可能性があることがわかりました。列の数を減らしたり、そのコンボボックスを削除して、フォームが適切に保存されているかどうかを確認してみてください。この問題は、Access 2003データベースを備えたWin 7 64ビットオペレーティングシステムでの作業に関連しています。言い換えれば、フォームはコンボボックスの大きな列数で正常に節約されることに問題はありませんでした。データベースが破損していると考えて多くの無駄な時間を引き起こしたので、この情報が役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top