2017-01-06 21 views
0

必要に応じてアクセスを学習し始めました。その担当者が通過し、誰かがそれを保つ必要があったためです。 彼が作成したすべてのデータベースで非常に悪い(少なくともIMO以上の)動作に気付きました。すべての単一フォームは、テーブルまたは保存されたクエリに直接バインドされていました。このようにして、ユーザーがフォームを開いた場合は、フォーム中間プロセスを閉じた場合(またはコンピュータが凍結した場合など)、実際のデータが破損する可能性があるため、それは半分になるだろうから。これはしばしばプロセスチェーン内のすべてを破り、サブシーケンシャルな手順を実行することが不可能になり、テーブル内で直接手動でデータを修正するように強制されました。ms-accessでフォームを使用してデータを編集するためのベストプラクティス

私は彼のものをアップグレードして自分自身を開発し始めたので、データをフォームでのみ編集できるようにする方法を学び、いつでもプロセスをキャンセルしたり、変更をすべて保存することができました最後に一度に。

単純な場合は、レコードセットを作成し、関連するデータをフォーム内のバインドされていないフィールドにコピーし、最終的にユーザーが選択した場合は、フォームフィールドからレコードセット。

連続した形式で複数のデータを一度に編集し、「保存」したり、コードをさらに実行したり、その処理に由来する情報を保持するフィールドを追加したりする必要があるため、に。私は一時テーブルを使用することについて学びましたが、DBを膨らませる傾向があったので、それを気に入らなかったのです。私は、一時テーブルをホストし、最終的には破壊されるコード実行中の一時データベースを作成することに行きましたが、それはあまりにも多くの不必要な複雑さを追加しました。

今日私は、一時データとフィールドを保持するために、切断されたADOレコードセットを使用しています。それは動作しますが、その限界があります。

私はあなたがこのようなシナリオに近づくために使用する最も良い方法は何ですか?メモリ内でADOレコードセットを使用しているのは本当に最善の方法ですか?

+0

アクセス権限は、バインドされた形式です。検証済みの(完全な)データのみを保存するには、検証関数を作成し、BeforeUpdateで検証が失敗した場合は、CancelをTrueに設定します。バインドされていないフォームを好むことは自由ですが、Visual StudioやWinFormsのようなAccess以外のツールを使用してください。 – Gustav

+0

私は、ユーザーベースと他のDBの使用許可を管理するデータベースを開発しました。選択したユーザーの権限を管理するフォームがあります。その中で、関連するすべての権限がロードされ、マネージャは必要に応じて既存の権限を削除、作成または編集できます。これはすべて一時テーブルで行われるため、ユーザーが保存せずにフォームを閉じると、何も変更されません。 "本当の"テーブルにバインドされたフォームを使って、これにどのようにアプローチするのか教えてください。 – fmonacos

+0

更新プログラムをトランザクションでラップすることができます。フォームがコミットせずに閉じられた場合は、変更をロールバックします。 – Gustav

答えて

0

私は、フォームが全く異なる要件を持つ2つのものを混ぜていると思います。既存のレコードを編集すると、それに適したバインドされたフォームが作成され、新しいレコードが作成されます(ストレートバインドされたフォームを使用すると、不完全なレコードが作成される可能性があります)。それにアプローチする方法は、多くのことに依存しますが、主に新しいレコードを「完全」とみなすために必要なデータの量です。

私は通常、次のいずれかの操作を行います。

  • にのみ必要なフィールドが存在している新しいレコードを追加するための未結合のポップアップモーダルフォームを作成します。完了すると、新しいレコードをメインフォームにロードしてさらに編集します。

  • フォームがポップアップではなく、メインフォームのフッターまたはヘッダーにバインドされていないフィールドのセットを除いて、上記の方法を使用します。

  • ユーザーが新しいレコードを作成するが、ハーフフィルされたレコードが検証されない場合は削除するフォームのOnClose(および/または状況に応じて適切な)イベントで検証をバインドします。

  • ユーザーはバインドされたフォームで新しいレコードを作成できますが、スケジュール上またはユーザーの操作に基づいて呼び出される「クリーンアップ」ルーチンがあります。ビジネスプロセスは、フィールドの大半は手動で新しいレコードがまたは編集を追加されるたびに、編集/追加するを必要とする場合

は最終的には、結合していないフォームを使用したほうが良いです。ユーザーがフォームを開いた場合

0

この方法では、彼は、フォーム途中のプロセスを閉じた(または 場合、コンピュータがフリーズしたので、彼が行うことになったすべての手順を 完了しなければならなかった、または種類のものコンピュータがフリーズした場合)、それは

半分完全なように、実際のデータが 危険にさらされることになるいいえ、その後、何のデータがテーブルに保存されません。切断されたreocrdsetとバインドされていないフォームを使用した場合も同じです。

いくつかの確認コードがあり単純なキャンセル= trueのフォームでbefore更新イベントを使用すると、フォームデータは保存されず、テーブルも更新されません。繰り返しますが、接続されていないレコードセットを使用してユーザーがフォームを閉じると、データをテストする必要があります。データを書き出すかどうかを選択することもできます。テーブルまたは切断されたフォーム。

版がシンプルであれば、ユーザが選択した場合、私は、フォームからのデータをコピーし、 最後に、私は レコードセットを作成することができることを発見した形で結合していない分野に関連するデータをコピーして、レコードセットに のフィールドを戻します。

いいえあなたは上記を行う必要はありません。上記は何も達成しておらず、開発時間を増やし、アプリケーションのコストを増加させます。ほとんどの場合、バインドされたフォームは、表にバインドされた単純なフォームの開発コストを上回ります。オリジナルの開発者は正しい考えを持っていました。ほぼすべてのケースで基礎となるテーブルの更新を制御して、必要な検証を行うことができます。フォームは、開発者がそのように許可した場合にのみ、データを保存して書き出します。

フォームにアクセスするとフォームが更新される前にフォームに検証コードを挿入すると、フォームにバインドされても不完全なデータがテーブルに書き込まれることはなくなります。ハーフフィルドバインドされたフォーム、またはディスコネクトされたreocrdsetのハーフフィルドアンバインドフォームBOTHは、コンピュータがフリーズするとデータを書きません。

フォームの2つのタイプは、確認コードが完了するまでデータをテーブルに書き出しません。

アクセスは、バインドされていないフォーム用に設計されたものではなく、vb.netやVB6などのツールでも、クールなウィザードが多数あり、バインドされていないフォームがサポートされています。アクセスには、これらのウィザードはありません。そして、あなたが国連のフォームを使用すると、フォームイベントが膨大になります。あなたはフォームイベントの使用を失い、ウィザードもアンバインドもサポートしていないので、実際には両方の世界の中で最悪の状態になります。私たちが持っているいくつかのレコード削除イベントだけでも素晴らしいものです。

あなたはme.dirty、on-insert、me.newReocrd、フォームを更新イベントの後に使います。あなたが投げ捨てて失う機能のリストは膨大です。

If me.Dirty = True then 
    me.Dirty = False  ' this forces your verification code to run 
End if 

に結合形態があなたの利益になるのいくつかのユースケースがありますが、しかし:あなたは(たとえば、フォーム上の[保存]ボタンなど)のテーブルにデータを書き込むためのボタンをしたい場合は、その後、ちょうど行きます彼らは開発時間の点であなたにかなりの費用がかかります。

+0

この情報をありがとうございます。私はそれをすべて調べます。私が言ったように、私は仕事として学び、他の人が何をしたかを見ています。なぜなら、私が今実現し始めているので、彼は全く検証の方法を実装していないからです...テーブルに結合されたフィールドがたくさんあるフォームを描きます。ユーザーがフィールドを入力し始めると、フィールドが移動するにつれて、前のフィールドが更新され、検証は一切行われずにテーブルに「保存」されます。彼が途中でフォームを閉じた場合、情報が失われ、プロセスチェーンの残りの部分が破られる可能性があります。 – fmonacos

+0

私はあなたが言ったことを理解しようとしていました...私はフォームがどのように機能するかを理解し始めています.Dirtyは動作し、条件が満たされた場合、.BeforeUpdateイベントのフォームでcancel = trueを設定しました。 1つのレコードのすべてのフィールドの変更を破棄するように機能しますが、連続したフォームで試してみると、フォーカスのある現在のレコードにのみ適用されます。私はまだ、フォームが開かれてからすべてのレコードに加えられた変更を "ラップ"する方法を理解していないし、フォームが "キャンセル"ボタンで閉じられたときにそれらを元に戻す。 – fmonacos

+0

フォームは一度に1つのレコードのみを編集します。だから、一度に1つのレコードを編集する通常のフォームを混同しないでください。また、AGAINが一度に1つのレコードを編集するフォームを続行しますが、多くのレコードを表示します。複数のレコードを表示したり、1つのレコードのみを表示するフォームに「多数の」レコードのナビゲーションを許可するという事実は、そのレコードの検証に関しては何も変わりません。この設定の例外は、そのようなデータの「セット」が親フォームまたは親レコードに属する場合です。それは別の問題であり、そのような問題に対するいくつかのアプローチがあります。 –

関連する問題