腐敗したフォーム - 救助またはリメイク?
-
19-09-2019 - |
質問
このデータベースアプリケーションの作業中、私は明らかにアプリケーションのフォームを破壊することができたようです - フォーム上の任意のフィールドへの編集を保存しようとすると、クラッシュがアクセスされます。再び開きます。
フォーム +コントロール全体をテキストとしてエクスポートしてから、VBコード(Allen BrowneのWebサイトから)を使用して再輸入しようとしましたが、アクセスをクラッシュさせたり、フォームがインポート可能ではないと言ったりすることなく再輸入しません。エラーに(エラー番号または説明が与えられていません)。
フォームはかなり複雑です。したがって、私はそれをゼロから作り直すことをためらっていますので、それを保存する方法はありますか?私がそれを回復することができた場合、これは私がすべてを新しいMDBファイルに転送する必要があることを意味しますか(それがカスケード障害効果である場合)?
正直に言うと、私は以前にアクセスデータベースオブジェクトを破壊することができなかったので、これがそのMDBファイルの終わりを示すものなのか、それとも前と同じように修正して続行できるものであるかどうかはわかりません。
解決 2
私がやらなければならなかったのは、フォームを再作成することであり、strsupplieridコンボボックス自体がクラッシュの原因であることを発見するまで、要素ごとに要素をコピーすることでした。私はそれをゼロから再作成し、手動で同じプロパティを与え、私が切り取ってクリップボードに貼り付けた保存されたコピーからVBを置き換えました。フォームが機能し、破損したフォームを削除し、データベースを圧縮しました。助けてくれてありがとう、みんな! :)
他のヒント
他の人は、あなたの腐敗したフォームを回復するためのさまざまなアプローチを提供しました。コードを含むアクセスオブジェクトが取り返しのつかないほど破損し、これらのメソッドが機能しない場合があります。その場合、バックアップを見て、腐敗していないバージョンを出発点として見つけて、それをインポートしてから、オブジェクトの現在の状態に戻す必要があります。
コードベアリングオブジェクトで腐敗に遭遇した場合、おそらくコーディングプラクティスを変更する必要があることを示唆する回答を投稿しています。
まず、定期的なバックアップを保持し、それらを上書きしないようにする必要があります。以前のバージョンに戻ることは、常に最後の手段です。
VBEオプションのコンパイルオンデマンドを常にオフにしてください。マイケル・カプランの記事を読んでください 逆コンパイルスイッチの実際の取引 理由の説明のために。
VBEで、コンパイルボタン(および呼び出しスタックボタン)を通常のVBEツールバーに追加し、コードの数行ごとにコンパイルボタンを押して、コードを保存します。
バックアップしてアプリを逆コンパイルするための妥当な間隔を決定します。頑丈なコードドキドキをしている場合は、毎日これを行うことをお勧めします。コーディング中にアクセスクラッシュが発生した場合は、バックアップを作成し、逆コンパイル/再コンパイルすることをお勧めします。確かにユーザーに配布する前に、アプリを逆コンパイルして再コンパイルする必要があります。
これらのプラクティスに従うと、コードを含むアクセスオブジェクトの破損の原因が可能な限り最小限に抑えられますが、バックアップのバックアップの複数のレベルは必須です。常に複数のレベルでカスケードします - いくつかのタイプのバックアップがあり、自動バックアップに依存しません)。
しかし、重要なポイント:
頻繁にコンパイルし、合理的に頻繁に逆コンパイルし、厄介なものはアプリケーションの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ビットオペレーティングシステムでの作業に関連しています。言い換えれば、フォームはコンボボックスの大きな列数で正常に節約されることに問題はありませんでした。データベースが破損していると考えて多くの無駄な時間を引き起こしたので、この情報が役立つことを願っています。