4

フロントエンドにMSAccess.mdbファイルを使用し、バックエンドにSQLServer2008を使用する機器管理システムに取り組んでいます。必要に応じて、フロントエンドをMSAccess2010ファイルに変換できます。

カレンダーフォームを作成しました。このフォームでは、ユーザーはどの機器が予約されているか、サインアウトされているか、または期限が過ぎているかを確認できます。次のようになります。

ここに画像の説明を入力してください

残念ながら遅い42のサブフォームを使用してこれを作成しました。上記のデータでは、ロードに約5秒しかかかりませんが、実際のデータを使用するとすぐに、許容できないほどに停止し始めます。サブフォームのソースオブジェクトを表示されるまで空白のままにし、この時点までレコードソースをロードしないことで、これをより効率的にしようとしました。これは、上記の例を無難に高速に実行するのに十分役立ちましたが、実際のデータにはまだ十分ではありません。

だから私がやりたいのは、サブフォームを使用しながらこれを効率的にする方法を見つけるか、サブフォームの代わりに機能する別のコントロールを見つけるか、リストボックスでサブフォームを切り替える方法を見つけることですが、どういうわけかまだ色をフォーマットすることができます行の。リストボックスをそのまま使用することは不可能であることは理解していますが、私はプログラマーであり、時間を無駄にしない限り、リストボックスをサブクラス化してこれを実行しようとしています。残念ながら、私はvbaサブクラス化を行ったことがないので、そうするためにいくつかの優れたリソースを指摘する必要があります。

毎日のサブフォームのレコードソースを設定するコードは次のとおりです。

f("sub" & X & Y).Form.RecordSource = "SELECT * " & _
                                     "FROM QRY_Calendar " & _
                                     "WHERE CDate(StartDate) <= #" & curDate & "# " & _
                                     "AND ((EndDate IS NULL OR CDate(EndDate) >= #" & curDate & "#)" & _
                                     IIf(CDate(curDate) <= Date, " OR ((Date_In IS NULL OR CDate(Date_In) >= #" & curDate & "#) AND Date_Out IS NOT NULL)", "") & ") " & _
                                     "ORDER BY IIF(Date_Out Is Not Null And (Date_In Is Null Or CDate2(Date_In)>=#" & curDate & "#) And CDate2(EndDate)<#" & curDate & "#,0,iif(CDate2(Date_Out)<=#" & curDate & "# And (Date_In Is Null Or CDate2(Date_In)>=#" & curDate & "#),1,2)), ID"

QRY_Calendarは次のようになります。

SELECT B.ID, Person, Initials, ProjectNum & '-' & ProjectYear & '-' & Format(TaskNum,'000') AS Project, Sign_Out_Code, Value AS Type, StartDate, EndDate, Date_Out, Date_In
FROM (((TBL_Booking AS B INNER JOIN TBL_Person AS P ON B.PersonID = P.ID) INNER JOIN LKUP_List AS T ON B.EquipTypeID = T.ID) LEFT JOIN TBL_Usage AS U ON B.ID = U.BookingID) LEFT JOIN TBL_Equipment AS E ON U.Equipment_ID = E.ID;

テーブルTBL_BookingのStartDateとEndDateは予約の開始と終了であり、テーブルTBL_UsageのDate_OutとDate_Inはサインアウトの開始と終了です。各サインアウトは、外部キーBookingIDを介して予約にリンクされています。Date_InがNULLの場合、それは機器が現在サインアウトされていることを意味します。

LKUP_Listは、私が何年も前に作業を開始する前からの名前の悪いテーブルであり、変更する必要はありませんでした。これには、(とりわけ)機器タイプのリストが含まれています。予約は機器タイプ用であり、特定のアイテムではありません。ユーザーが機器をサインアウトすると、特定の機器にリンクされたTBL_Usageのレコードが作成されます。

誰かが私がこれでどの方向に進むべきか、そして私がどこでガイダンスを探すことができるかについての考えを持っているならば、それは大いにありがたいです。

4

5 に答える 5

3

カレンダーに関連する質問が少し前に尋ねられました:Accessで「カレンダーマトリックス」を作成する

とは言うものの、重要なクエリにバインドされた43のサブフォームで良好なパフォーマンスを達成することはおそらくないでしょう。

マイナーな改善の可能性

データがバックエンドサーバー上にあるかどうかを言っているわけではありません。その場合、各サブフォームはネットワークを介してデータをフェッチする必要があります。
その場合は、サーバーに対して1つのクエリを実行して、すべてのデータをプルし、フロントエンドにキャッシュする方がよい場合があります。その場合、ローカルテーブルで単純なフィルタリングを実行するだけで済みます。これは、42のサブフォームがパフォーマンスの大きなボトルネックになる可能性がありますが、より高速になるはずです。

通常のクエリから返されたデータに基づいて呼び出されるローカルテーブルを作成していれば、簡単なINSERT INTOクエリで開始できます。myCacheTable

軽量コントロール

あなたがおそらく最初に試みるべきことは、それは由緒あるものを使うことlistboxです。
それはかなり軽量であり、それらを構成する多くの方法があります。
前述のように、これをサーバーからのデータのキャッシュと組み合わせると、パフォーマンスが向上する可能性があります。

リストボックスの例

Web対応のコントロール

HelloWが述べたように、に設定されたテキストボックスを使用TextFormat = RichTextし、単純なHTML(あまりサポートされていません)を提供して、内部のデータをフォーマットすることをお勧めします。

リッチテキストテキストボックスの例

フルオンのWebページ

セットアップは少し複雑かもしれませんが、UIの点では打ち負かすのは難しいかもしれませんが、FullCalendarなどの既存のJavascriptライブラリを使用するか、独自のhtmlをブラウザドキュメントに直接挿入することもできます(簡単<table>にカレンダーをフォーマットできます)。

アクセスフォームのコントロール内のサンプルオンラインカレンダーの例を次に示します。WebBrowser

AccessのWebカレンダービュー

于 2012-11-16T04:37:19.153 に答える
3

まず、アクセスフォームへのアクセスフォームの42個のサブフォームの読み込みは非常に高速です。実際、私はこれを何年にもわたって行っており、42個のサブフォームの読み込み時間は実際には瞬時です。

したがって、これは、ここの読者がここでのコメントを無視できることを示唆しています。HTMLなどのスクリプトベースまたはテキストベースの解釈されたシステムは、NEARダイレクト機能を備えたWindows高性能デスクトップアプリケーションと比較して、ある種のブラウザレンダリングシステム内で実行する方が高速です。ビデオグラフィックカードに直接書き込む。

Windowsデスクトップアプリケーションがビデオカードに直接書き込むことができるという単純で基本的な知識がある場合、HTMLでレンダリングされたシステムを比較しようとすると、速度の点で比較する本当の希望があることを示唆する人はほとんどいないことを覚えておいてください。ここに2つの異なるアーキテクチャがあります。

したがって、ここでの本当の問題は、缶カレンダーをどれだけ速く実行できるかということであり、42のサブフォームが問題になるのでしょうか。

答えは、42のサブフォームは問題ではなく、高速であるということです。

次の私のアクセスカレンダーは、ほぼ瞬時にレンダリングされます。

ここに画像の説明を入力してください

上記の私のアクセスカレンダーは、実稼働環境でも何年も使用されています。カレンダに画面に収まらないデータが毎日ある場合でも、ロード時間は瞬時に発生します。デスクトップ(クライアント)が、Webサイトで実行されているSQLサーバーのホストされたバージョンへの標準インターネット接続を介してSQLサーバーバックエンドにアクセスしている場合、これらの多くが実行されています。そして、このより制限された帯域幅の場合でも、カレンダーのロード時間と応答はほぼ瞬時になります。したがって、accDB(ファイルベース)バックエンドを使用している場合でも、バックエンドにSQLサーバーを使用している場合でも、パフォーマンスに問題はありません。さらに驚くべきことに、このフォームは、通常のインターネットでこのアクセスカレンダーを実行している多くの顧客に適しています。バックエンドがホストされたWebサイトで実行されているSQLサーバーである接続。

上記の設計には42のサブフォームがあり、データがない場合は、サブフォームがほぼ瞬時に読み込まれます。これを述べることは重要であり、したがって私は、基本的なコンピュータアーキテクチャを明確に把握および理解していない人々によってここで行われた他のコメントを軽蔑するために、いくつかの現実世界と事実の証拠を提供しました。したがって、これらの人々は、42のサブフォームのロードが、ソフトウェアの速度を低下させるという点で何らかの問題があることを示唆しますが、実際にはそうではないことを簡単に示すことができます。このように、ここでの他の人の証言と証言はメリットがないことを示すことができ、したがって、この見解は、コンピュータの基本的な操作が私たちの業界でどのように機能するかについての理解の欠如に基づいています。HTMLは、ここでそのような設定と比較することを期待できません。

そして、AccessがWeb公開を許可するようになったWebベースについて言えば、Webブラウザで実行されるAccessに組み込まれたカレンダーの次のビデオを投稿します。このブラウザベースのカレンダーは、Accessのみを使用し、サードパーティのツールを使用せずに作成されました。

http://www.youtube.com/watch?v=AU4mH0jPntI

上記のビデオの結果は、このカレンダーアプリケーションのより滑らかで即座にレスポンシブなWebベースのバージョンを示しています。

ここで、上記のWebベースの例では、42のサブフォームを使用しないことを指摘しておきます。これは、Webブラウザーでは、各フォームが個別のフレームであり、サーバーから送信されるフォームの再レンダリングを引き起こすためです。これは、Access Webベースの場合、42のサブフォームに基づくデザインは問題外であることを意味します。レンダリングに関しては、パフォーマンスが大幅に低下します(XMALフォームがオンデマンドでロードされるためデータがない場合でも、時間を節約できますが、この場合、この設定は問題になります)。

ただし、ビデオが示すように、Webベースのソリューション(およびクライアントベースでも機能します)は、テキストボックスをそのテーブルにバインドするテーブルに入力することでした。したがって、1つのレコード表示を持つことは、上記のビデオに示されているように、そのような結果がほぼ瞬時の応答を意味し、Webブラウザでも示されていることを示しています。

そのビデオはAccessのみを使用して作成され、他のツールは使用されていないという点で、WEBベースのアプリケーションを強調します。

ここで、パフォーマンスの問題とクライアントベースのアプリケーションに戻ります。もちろん、42のサブフォームのロードは問題ではないことがわかっているので問題です。

もちろん、問題は、データをこれらのサブフォームにプルするために、あらゆる種類の式を使用して42の個別のSQLクエリを実行することです。これは、ボトルネックとパフォーマンスの低下が発生する場所です。そのため、42個のテキストボックス、または42個のリストボックスを使用しても、このパフォーマンスの問題は変わりません。

したがって、問題は42の個別のSQLクエリを実行しようとすることです。各SQLクエリは、解析に時間がかかり、構文をチェックしてから、クエリプランなどが作成されることに注意してください。実際、特定の1つのクエリに対してデータが流れ始める前に、かなり多くのアクションを実行する必要があります。実際、1つのクエリは、帯域幅の観点から約10,000行のデータフローのコストになる可能性があることがわかりました。

上記の情報に基づいて、私のデザインでこれらの42のサブフォームをロードして瞬時に実行できる理由は、1か月分のデータを返すために1つのクエリのみを実行するためです。つまり、表示の開始日と終了日を指定してクエリを実行します。次に、VBAコードを実行して、結果のreocrdsetからのデータをサブフォーム1から42に処理します。したがって、VBAコードは、結果のレコードセットデータを42のサブフォームに詰め込みます。したがって、これは、ハイパフォーマンスコンピューティングを確保し、速度を低下させないための重要な概念と提案です。

したがって、要約と結論:

パフォーマンスのボトルネックは、42のサブフォームを使用することではなく、42のレコードセットと42のクエリを使用することであり、追加のコードと式を42回評価する必要がある可能性があります。42回のクエリと42回のクエリを排除し、そのようなSQLステートメントを再実行する必要があります。このボトルネックはほとんどなくなります。

42個のリストボックス、または42個のテキストボックスを使用し、42個のそのようなSQLステートメントを実行し続けても、パフォーマンスの価値のある改善は得られないと思います。

于 2012-11-18T00:11:12.533 に答える
2

これはHTMLで最適に機能するという考えに同意します。
各サブフォームを、リッチテキスト用にフォーマットされたテキストボックスに置き換えます。次に、フォームの読み込み(またはその他のイベント)で、その月のレコードセットを取得し、それをループして各テキストボックスにテキストを追加します。利用可能なHTMLサブセットは通常、必要なフォーマットのほとんどを取得するのに十分です。

考慮事項

  1. これには、vbaに関する限り、実際に考える必要があります。あなたはすでにこれまでに到達しているので、おそらくあなたはこれで大丈夫です。
  2. クエリは1つしかないため、速度はより許容範囲内になります
  3. 主要なHTMLタグはと<br>カラータグになります
  4. テキストの色だけで背景色を変更することはできません(ここでは間違っている可能性があります)
于 2012-11-16T03:48:01.950 に答える
2

別の解決策は、多くのテキストボックスコントロールを作成し、それぞれが暦日のレコードを表すようにすることです。

1つのクエリを高速で実行します!

VBAでは、各テキストボックスコントロールを循環し、水平および垂直の位置、コンテンツ(値)、形式、可視性を割り当てます(データのないものを表示する必要はありません)。

欠点は、必要なテキストボックスコントロールの数を事前に決定する必要があることです。クエリによって配信されるすべてのレコードに対して十分ではない可能性があります。

この問題を克服するために、100個のコントロールが最初にレコードセットからより重要なレコード(例:期限切れ)を表示し、「すべてのレコードが表示されたわけではない」ことに注意することを任意に決定できます。ユーザーがすべてのレコードを表示したい場合は、特定の日付をクリックすると、より詳細なサブフォームが開き、この日付のすべてのレコードが表示されます。

カレンダーで試したことはありませんが、タイムバーを表示するガントチャートのフォームがあります。各タイムバーはテキストボックスコントロールです。私は120のコントロールを持っており、それは即座に機能します。

于 2013-09-19T02:51:48.320 に答える
0

もう1つの解決策は、バージョン1.4.2に更新したばかりのTcalを使用することです。Tcalとは何ですか。Tcalは、完全なグラフィックインターフェイスを備えたクライアントサーバークロスプラットフォームカレンダーです。TcalServerとTCP/IPを使用して、Tcalは、イベント、期限、および稼働時間を、会社のパーソナライズされたFileMaker Pro、Microsoft Access、またはMySQLデータベースファイルに記録します。イベントにリソースとジョブ名を割り当てたり、他のリソースカレンダーを表示したり、招待を承認または拒否したりできます。TcalはMacOSXとWindow(7またはXP)で動作し、最大2人の接続ユーザーは無料です。Tcalはここにあります:http ://www.tcal.it/eng/index.html

于 2015-02-15T13:10:00.773 に答える