0

ここで質問するのか、スーパーユーザーで質問するのかわからなかったので、ここに属していない場合はお詫び申し上げます。

私は小さなPHP/MySQLデータベースアプリを作成して、母の店の顧客ロイヤルティデータを管理し、XAMPPを使用して彼女のレジコンピューターにローカルにセットアップすることを意図しました。ただし、MSAccessやOpenOfficeBaseなどのGUIリレーショナルデータベースにシステムを再実装するように依頼されました。これは主に、メールのマージやグラフィカルレポートなどをGUIで実行できるようにするためです(作成する必要はありません)。 。

MySQLのテーブル構造と関係を簡単に複製し、より基本的なフォームとレポートをいくつか作成できますが、AccessまたはBaseでスクリプトやマクロなどを実行したことはありません。私のPHPは、フォーム入力だけでなく、Access/Baseでの実装方法がわからないスクリプトが含まれていました。注目に値するのは、Accessを使用することになった場合、Access2007になります。

これが役立つ場合に備えて、私が作成しようとしているものの概要です。長さでごめんなさい。

ビジネスはテイクアンドベイクフード市場であり、データベースは物理的なスタンプカードのロイヤルティシステムに取って代わりつつあります。各顧客は、25ドルを使うごとにカードにスタンプを受け取ります。彼らは次のように無料の食事を獲得します:
-8番目のスタンプで、彼らは無料のおかずを獲得します。
-16回目のスタンプで、通常サイズの食事が無料になります。
-24回目のスタンプで家族サイズの食事が無料になり、カードがゼロスタンプにリセットされます。
各スタンプの日付を記録する必要があります(そうでない場合は、スタンプテーブルを作成する代わりに1つのフィールドをインクリメントするだけです)。

customers、、、の3つのテーブルがstampsありfreebiesます。との両方とcustomers1対多の関係があります。stampsfreebies

  • customers簡単な連絡先リストです。
    列:ID, firstname, lastname, email, phone
  • stamps獲得した各スタンプの記録を保持します。
    列:ID, customerID, date, index(1-24;その顧客のカードのN番目のスタンプ)
  • freebies彼らが獲得した各無料の食事の記録を保持します。
    列:ID, customerID, date, size, is_redeemed

これが、Access/Baseに実装する方法がわからないPHPの魔法です。

  1. ユーザーが顧客を選択して[スタンプを追加]ボタンをクリックすると、次のようになります。

    • stampsその顧客の最後のスタンプからインデックスを取得するように照会されます=>ローカル変数N
    • N == 24の場合、N=0に設定します。Nを1ずつ増やします。
    • stamps現在の日付、顧客ID、およびインデックスNのレコードが挿入されます
    • N == 8、16、または24の場合freebies、適切なサイズのレコードが挿入され、アラートが表示されて、顧客が無料のたわごとを獲得したことをユーザーに通知します。
  2. 獲得したすべてのスタンプと景品を表示するある種の「顧客の表示」ページ(フォーム?レポート?)。償還されていない景品の横に「償還」ボタンがあります。

一般的に、私はそれをかなりばかげた「大きなボタン」(可能な限り自動化)にする必要があります。店のレジ係は、データベースの予備知識がなくてもそれを使用できるはずです。

これはAccessやBaseのようなプログラムで実用的ですか、それともPHPバージョンを使用するように彼女を説得する必要がありますか?コードを書く必要がある場合、自分で教える必要のある言語は何ですか?データを別の方法で構造化する必要がありますか?ここからどこから始めればいいのかわかりません。

4

3 に答える 3

4

本当にこれはケーキだと思います。Tonyが同じテーブル/バックエンドを引き続き使用できると言ったように、それはおそらく私がお勧めするルートです。MySQLデータベースにリンクするすべてのマシンにMySQLのODBCドライバーをインストールする必要があります。その後、DSNを作成し、Access内からDSNを介してテーブルにアクセスします。後でコードを追加して、DSNのないテーブルを使用してソフトウェアがロードされるたびにテーブルを再リンクすることをお勧めします。このようにして、DSNが構成されていないマシンでデータベースを実行できます。MSAccessバックエンドではなくMySQLまたはSQLServerExpressを使用することをお勧めしますが、その理由については詳しく説明しません。

PHPを使用した場合よりも、従来のWindowsデスクトップアプリケーション(MS AccessまたはVB.Netで構築されたもの)から実際にはるかに多くの機能を取得できると思います。そして、より少ないコードとより少ない時間でそれを行うことができるだろうというのが私自身の意見です。私はVB.Netについて言及しましたが、データベースにはVB.NetよりもMSAccessをお勧めします。

Tonyがすでに述べたように、AccessはVBA言語を使用します。基本構文を使用する他のプログラミング言語の経験がない限り、実際に理解するには少し時間がかかります。VBA/ASPからPHP/Javascriptへの移行は、必ずしもそれほど難しいわけではありませんが、ゆっくりと進んでいることがわかりました。PHPは中括弧付きのCスタイルのコードを使用しますが、VBAは使用しません。

PHPから来て、ここにあなたにとって新しいかもしれないいくつかのことがあります:

より強力な変数入力-Accessでは、String、Date、Integer、Long、Single、Doubleなどの指定されたデータ型で変数を実際に宣言できます。可能な限りこれを使用することをお勧めします。ObjectやVariantなどのより一般的なタイプを使用する必要がある場合はほとんどありません。指定されたデータ型で宣言された変数に間違ったデータ型を入れようとすると、エラーがスローされます。私の意見では、これはより良いコードを書くのに役立ちます。

Option Explicit-Option Explicitは、各コードモジュールの先頭に配置できる宣言であり、使用する前にDimステートメントを使用して変数を宣言する必要があることを強制します。これを行うことを強くお勧めします。問題のトラブルシューティングにかかる​​時間を大幅に節約できます。

MyVariable = Nothingを設定します-オブジェクト変数を使用した後にクリーンアップすることは、MSAccessを使用するためのベストプラクティスの1つです。これを使用して、DAO Recordset変数、ADO接続変数、ADO Recordset変数、フォーム変数などをクリーンアップします。オブジェクト(または特定のタイプのオブジェクト)として宣言する変数は、Nothingに設定してクリーンアップする必要があります。変数を使用する必要がなくなったとき。

インクルードなし-MSAccessにはインクルードステートメントなどはありません。他のAccessデータベースからコードモジュールをインポートできます。DLLに含まれている関数を呼び出すことができます。ただし、PHPのようにAccessにはインクルードはありません。

DoCmd-フォームやレポートを開いたり、その他の一般的なタスクを実行するには、MSAccessのDoCmdオブジェクトを使用する必要があります。ただの警告:それはしばしば不合理です。長年のAccessユーザーはそれについてあまり考えていませんが、これらのコマンドにはほとんどまとまりや一貫性がないことがわかりました。例を挙げましょう。フォームを閉じる場合は、次のコードを使用します:DoCmd.Close acForm、 "frmSomeFormName"が、フォームを開く場合は、次のコードを使用します:DoCmd.OpenForm "frmName"この例では、フォームを開くときに独自のOpenForm関数を取得するのに、フォームを閉じるときにCloseを使用し、その後にフォームを閉じたいことをAccessに通知する定数を使用するのはなぜですか。答えはありません。DoCmdは、このタイプの不整合に満ちています。Blueclawは、最も一般的なDoCmdをリストするのにかなり良い仕事をしていますが、そこにある例が正確に優れているとは思いません。

参照-参照を頻繁に使用する必要はありません。これらを使用して、DAOやADO(詳細は後述)やMicrosoft Scripting Runtime(ファイルやフォルダーへのアクセス、読み取り、書き込みなどに使用されることが多い)などを有効にする必要があります。それは基本的にあなたが一度やったことであり、それからあなたはそれを忘れます。

ActiveXコントロール-おそらく、これらを使用せずにプロジェクトをビルドしようとする方が良いでしょう。ソフトウェアを実行する各コンピューターに同じコントロールをインストールする必要があります。それについてはよくわかりませんが、プロジェクトでActiveXコントロールを使用すると互換性の問題が発生する可能性があることは理解しています。

DAO-データアクセスオブジェクト-DAOは、データコンテナへのインターフェイスに使用されるAccessの元のネイティブオブジェクトセットです。これは主にAccessデータベースのバックエンド/コンテナに保持されている日付にアクセスするために使用されますが、ODBCリンクテーブルを使用している場合の一部のタスクにも使用できます。DAOは、レコードセットをループして一括で変更を加える必要がある場合に非常に役立ちます。フォームコントロールをループするために使用することもできます。私がこれを使用する1つの場所は、行が削除された後、請求書の詳細で行番号を並べ替えることです。もう1つの一般的な使用法は、更新クエリでは実行できない特定の1つまたは複数のフィールドで何かを変更する必要がある「ユーティリティ」関数で使用することです。

CurrentDb.Execute( "ここでクエリを更新または削除...")CurrentDbオブジェクトのExecuteメソッドは、私の理解では、暗黙のDAO呼び出しです。これにより、VBAコードからローカルテーブルとリンクテーブルに対して更新または削除クエリを実行できます。DoCmd.RunSQLを使用してこれを実現することもできますが、2番目の引数として「、dbFailOnError」を追加すると何かが失敗した場合にエラーメッセージが改善されるため、CurrentDb.Executeが推奨される方法です。

ADO-ActiveXデータオブジェクト-ActiveXコントロールを使用しないことをお勧めしますが、これは必要になる可能性のあるActiveXテクノロジの1つです。私の知る限り、Accessからストアドプロシージャを実行するために使用できるのはADOだけです。ADOはDAOに似ており、実際にはそうではありませんでしたが、DAOを置き換えることになっています。私は自分のアプリケーションで両方を使用する傾向があります。どちらがあなたのために仕事をするのか、どちらがそれをより良くするのかを理解するのにしばらく時間がかかります。一般に、ストアドプロシージャの実行や外部データソースへの接続(つまり、リンクされたテーブルを使用しない)を除いて、すべてDAOを使用します。DAOとADOはどちらも、MS AccessとともにインストールされるMDAC(Microsoft Data Access Components)の一部です。

ファイルシステムオブジェクト-上記のこのオブジェクトは、ファイルやフォルダにアクセスするためによく使用されます。ファイルのコピー、テキストファイルの作成、テキストファイルの読み取り、テキストファイルへの書き込みなどに使用する必要がある場合があります。これは、WindowsScriptHostの一部であるMicrosoftScriptingRuntimeの一部です(ただし、すべてのWindowsコンピューターに存在します) 「壊れた」状態になる可能性があります)。Accessは、Dir()などのVBAの組み込み関数/メソッドを使用してファイルやフォルダーにアクセスするいくつかの方法を提供しますが、これらの関数はすべてのベースを網羅しているわけではありません。

SQL-サーバーのクエリ言語-おそらくSQLについてはすでにご存知でしょうが、AccessのSQL言語の「スーパーセット」に慣れる必要があります。大幅な違いはありませんが、AccessではAccess関数(Len、Left、rightなど)または独自のカスタム関数を使用できます。独自の関数は、コードモジュールに存在し、パブリックとして宣言する必要があります。独自の関数の例としては、Repeat(MS Accessには存在しない、MySQLには存在する)があります。これは、子の親関係を持つテーブルでCount(*)に基づいてインデントを作成するために使用されることがあります。これを例として挙げますが、入れ子集合モデルを使用して階層カテゴリを保持する場合を除いて、このような関数を使用する必要はほとんどありません。

変数をリテラル文字列にすることはできません-これは、AccessとPHPの大きな違いです。PHPでは、次のように記述できます。 "SELECT * FROM tag WHERE tagtext ='$ mytag'" MS Accessでは、次のように記述する必要があります。 "SELECT * FROM tag WHERE tagtext ='"&strMyTag& "'"( DAOまたはADOレコードセットを取得するためにVBAでクエリをフォーマットする場合を除いて、これについて心配する必要はありません。先ほど指摘したことは、通常は使用しないため、フォームやレポートのレコードソースや保存されたクエリには影響しません。それらの変数。)

クエリ-理解するのは難しいことではありませんが、Accessではクエリは基本的にMySQLビューです。実際、クエリを保存することはあまりありません。私は通常、SQLの「コード」を導出するためにのみそれらを使用し、フォームを保存されたクエリにバインドする代わりに、そのSQLを取得してRecordsourceとしてフォームに貼り付けます。どちらの方法でやりたいかは関係ありません。これを行うには、どちらの方法でも長所と短所があります。補足として、MySQLでビューを作成し、Accessでそれらにリンクすることを恐れないでください。それらにリンクすると、Accessはそれらをテーブルとして認識します。更新可能/書き込み可能かどうかは、ビューの構成によって異なります。特定のタイプのクエリ/ビュー(ユニオンなど)は読み取り専用です。

最後に、OpenOffice.orgBaseよりもMSAccessをお勧めします。数年前にBaseを試してみましたが、多くの機能が不足していることがわかりました。しかし、私はすでにMS Accessの経験があるので、OpenOfficeBaseを公正な裁判にかけたかどうかはわかりません。私が行方不明にしたのはイベントでした。私はMSAccessでフォームを微調整して、ユーザーに多くのフィードバックを伴う非常に応答性の高いUIを提供できることに慣れていますが、Baseでこれを行う方法を理解できませんでした。たぶん、最後に試した時から状況が変わったのかもしれませんが、わかりません。これは、BaseとMSAccessを比較した記事です。

他のSOAccessの達人、私の答えの誤りを自由に指摘してください。私はまだ自分自身をプログラミングの新人だと思っています。

于 2011-01-28T05:47:48.713 に答える
2

私はベースのために話すことはできません。ただし、AccessはMySQLデータベースに直接リンクできるため、データをやり直す必要はありません。Accessでコードの断片を作成する限り、それは非常に簡単です。Access、Word、およびExcelは、Access、Word、またはExcelオブジェクトモデル固有のものを除いて、VisualBasic6.0と同じVBAを使用します。実際、VBAエディターを使用する際のマイナーなあいまいなバグもVB6エディターに存在します。

また、Accessデータベースの1つに、160のテーブル、1200のクエリ、350のフォーム、450のレポート、および70K行のコードが含まれていることも追加します。したがって、アプリは比較するとかなり小さいです。

景品テーブルで、is_redeemedフィールドをdate_redeemedに変更します。私は、各スタンプと獲得した景品を別々のレコードとしてテーブルに記録することに間違いなく同意します。このようにして、スタンプがx個しかないことを示すだけでなく、顧客に履歴を表示するのは非常に簡単です。

また、バーコードリーダーを検討し、ユーザーにバーコード付きのプラスチックウォレットカードを発行することも検討してください。これにより、店員が記録を検索するのに必要な時間が大幅に短縮されます。実際、SafewayやAirMilesカードなど、地域に共通のポイントカードを使用することを検討してください。与えられた最初のカードを紛失した場合に備えて、その番号を別の表に入れておきます。または、複数のカードを追跡できます。家族は1つのアカウントにポイントを貯めたいと思うかもしれません。

長い投稿をありがとう。これにより、そもそも考えもしなかったかもしれないさまざまな側面について、いくつかの提案をすることができます。

于 2011-01-28T04:08:18.843 に答える
1

私の提案:それをしないでください。問題のPCでmysqlサーバーを実行し、キャッシャーのフロントエンドとしてPHPアプリを使用します。次に、MS Accessのレポート機能が必要な場合は、AccessをODBCを使用してmysqlデータベースに接続します。

最良の実装は、かなり頻繁にあなたがすでに持っているものです。

于 2011-04-22T14:25:35.430 に答える