2011-01-28 9 views
0

ここやスーパーユーザに問い合わせるかどうか分からないので、ここに属していないと謝ります。MS AccessまたはOpenOffice.org BaseでPHP/MySQLデータベースアプリケーションをクローン化する

私は、ママのショップの顧客ロイヤルティデータを管理するための小さなPHP/MySQLデータベースアプリケーションを作成しました。これをXAMPPを使用してキャッシュレジスターコンピュータにローカルに設定しようとしています。しかし、私はMS AccessやOpenOffice BaseなどのGUIリレーショナルデータベースでシステムを再実装するように頼まれました。彼女はGUIを使ってメールマージやグラフィカルなレポートを書くことができます(私は書く必要はありません) 。

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

ここでは、役立つ場合のために作成しようとしていることの概要を簡単に説明します。長さは申し訳ありません。

ビジネスはテイク&ベークフードマーケットで、データベースは物理的なスタンプカードのロイヤルティシステムを置き換えています。各顧客は、彼らが費やす25ドルごとに自分のカードに印をつけます。彼らは次のように無料食事を得る:
- 8回目のスタンプで、彼らは無料のおかずを得る。
- 16回目のスタンプで、彼らは無料のレギュラーサイズの食事を獲得します。
- 24回目のスタンプでは、無料のファミリーサイズの食事を獲得し、カードはゼロスタンプにリセットされます。
各スタンプの日付を記録する必要があります(そうでなければ、スタンプテーブルを持つ代わりに1つのフィールドを増やすだけです)。

私は3つのテーブル:customers,stampsおよびfreebiesを持っています。 customersは、stampsfreebiesの1対多の関係を持っています。

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

は、ここで私はアクセス/ベースで実装する方法を知らない私のPHPから魔法です:ユーザーが顧客を選択してクリックすると

  1. 「を追加スタンプ」ボタン:

    • stampsは、その顧客=>ローカル変数のための最後のスタンプN
    • からインデックスをつかむために照会され
    • N == 24の場合、N = 0に設定します.Nを1だけインクリメントします。
    • N == 8、16又は24レコードが適切なサイズおよびアラートとfreebiesに挿入された場合にレコードが現在の日付、顧客ID及びN
    • の指標
    • stampsに挿入されている通知するように見えます顧客がいくつかの無料のたわごとを獲得したユーザー。
  2. 彼らは次の償還されていない景品にボタンを「買い戻す」と、獲得した全てのスタンプや景品を示し、「ビュー顧客」ページのいくつかの種類(?レポートを形成します?)。一般的に

私はそれはかなりばかプルーフと「ビッグ・ボタン」にする必要がある - 自動化可能な限り - お店でレジ係はデータベースの予備知識でそれを使用することができるはずです。

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

答えて

1

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

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

+0

これは私が採用を終えた解決策です。私は他の従業員が私を信頼して、店内に専用のLAMPサーバーを設置するように納得しました:P今、私はそのサーバー上でより複雑なプロジェクトに取り組んでいます。 –

2

私はベースについて話すことができません。ただし、AccessはMySQLデータベースに直接リンクすることができますので、データをやり直す必要はありません。限り、Accessで非常に簡単なコードのビットと部分を作成します。 Access、Word、およびExcelでは、Access、WordまたはExcelのオブジェクトモデル固有のものを除き、Visual Basic 6.0に同じVBAを使用します。実際、VBAエディタを使用しているときの不明瞭なバグは、VB6エディタにも存在します。

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

空きテーブルでは、is_reideemedフィールドをdate_reideemedに変更します。私は間違いなく、テーブルに別々のレコードとして得られた各スタンプとフリービーを記録することに同意します。ちょうどあなたがxスタンプしか持っていないと言っているのではなく、顧客に歴史を示すのは簡単です。

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

長らくお寄せいただきありがとうございます。これにより、最初に考えていなかったかもしれないさまざまな面についていくつかの提案をすることができます。

+0

返信いただきありがとうございます。データをやり直すことは問題ではなく、実際にはまだ入力していません。私たちはすでに現金登録ソフトウェアのためにバーコードリーダを使用していますが、私はプラスチック製の財布カードを発行することは費用対効果に優れていない可能性があると考えています(私たちはかなり小さなビジネスです)。 –

+0

プラスチック製の財布カードで十分です。次に、ラベル上の小さな棒の上にバーコード付き厚紙の紙の紙の紙のものを考えてみましょう。それは生産するのに非常に安いでしょう。 –

+0

また、名字の最初の部分に検索コントロールを追加し、最後の名前に別のコントロールを追加します。 1つの10Kの名前データベースで、最初と最後の2文字がジョーとスミスという驚くべき数のレコードになってしまったことがわかりました。 –

4

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

私はあなたがPHPでできるよりも、従来のWindowsデスクトップアプリケーション(MS AccessまたはVB.Netで構築されています)からはるかに多くの機能を利用できると思います。そして、自分の意見では、少ないコードと短時間で投資できるようになるでしょう。私はVBに言及した。NETは、私はおそらくMS AccessをVB.Net上のいずれかの仕事をしますが、データベースのためにお勧めします。

Tonyが既に述べたように、AccessはVBA言語を使用します。 Basic構文を使用する他のプログラミング言語での経験がある場合を除き、少し時間がかかります。私は、VBA/ASPからPHP/Javascriptへの移行が遅くても、それほど難しくないとは思っていません。 PHPは中括弧で囲まれたCスタイルのコードを使用しています。 PHPから来る

は、ここであなたに新しいものかもしれないいくつかのものです:

強い変数のタイプ - アクセスでは、実際には、このような長い文字列、日付、整数、として指定されたデータ型を使用して変数を宣言することができます、シングル、ダブルなど私は可能な限りこれを使用することをお勧めします。 ObjectやVariantなどのより一般的な型を使用する必要があるときは、ほとんどありません。指定されたデータ型で宣言された変数は、間違ったデータ型を入力しようとするとエラーをスローします。これは、私の意見では、より良いコードを書くのに役立ちます。

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

- それらを使用した後のオブジェクト変数のクリーンアップは、MS Accessを使用するベストプラクティスの1つです。これを使用して、DAOレコードセット変数、ADO接続変数、ADOレコードセット変数、フォーム変数などをクリーンアップします。オブジェクト(または特定の種類のオブジェクト)として宣言した変数は、Nothingに設定することでクリーンアップする必要があります変数を使用する必要がなくなったとき。

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

DoCmd - MS AccessのDoCmdオブジェクトを使用すると、フォームとレポートを開いて他の一般的なタスクを実行する必要があります。ただの警告:それはしばしば不合理です。長時間アクセスのユーザーはそれほど大したことは考えていませんが、これらのコマンドはほとんど結束性や一貫性がないことがわかりました。私に例を挙げてみましょう。フォームを閉じるには、次のコードを使用します。DoCmd.Close acForm、 "frmSomeFormName"フォームを開くには、次のコードを使用します。DoCmd.OpenForm "frmName"この例では、フォームはそれ自身のOpenForm関数を取得しますが、フォームを閉じるときには、Closeを使用して、フォームを閉じることを望むアクセスを示す定数が続きます。私には答えがありません。 DoCmdはこの種の矛盾でいっぱいです。 Blueclawは最も一般的なDoCmdをリストアップするのにはかなり良い仕事をしていますが、そこにある例はまったく恒星だとは思いません。

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

ActiveX Controls - おそらく、これらを使用せずにプロジェクトを構築することをお勧めします。ソフトウェアを実行する各コンピュータに同じコントロールをインストールする必要があります。私はそれについて多くは分かっていませんが、あなたのプロジェクトでActiveXコントロールを使用した場合に生じる可能性のある互換性の問題があることを理解しています。

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

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

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

File System Object - このオブジェクトは、ファイルとフォルダにアクセスするためによく使用されます。ファイルのコピー、テキストファイルの作成、テキストファイルの読み込み、テキストファイルへの書き込みなど、Windows Script Hostの一部であるMicrosoft Scripting Runtimeの一部です(ただし、すべてのWindowsコンピュータに存在しますがそれは「壊れた」ことになります)。アクセスは、Dir()などのVBAの組み込み関数/メソッドを使用してファイルとフォルダにアクセスするいくつかの方法を提供しますが、これらの関数はすべてのベースをカバーしていません。

SQL - Server's Query Language - あなたは既にSQLに精通していますが、SQL言語のAccessの「スーパーセット」に慣れていなければなりません。それは大幅に異なるわけではありませんが、AccessではAccess関数(Len、Left、Rightなど)または独自のカスタム関数を使用できます。あなた自身の関数は、コードモジュールに存在し、publicとして宣言されている必要があります。独自の関数の例は、子親関係を持つテーブルのCount(*)に基づいてインデントを作成するために使用されることがあるRepeat(MS Accessには存在せず、MySQLに存在します)です。階層型カテゴリを保持するためにネストセットモデルを使用する場合を除き、このような関数を使用する必要はありませんが、これを例として挙げています。

変数リテラル文字列に入れることはできません - これはAccessとPHPの大きな違いです。 PHPでは次のように書くことができます: "SELECT * FROM tag WHERE tagtext = '$ mytag'" MS Accessでは、次のように書く必要があります: "SELECT * FROM tag WHERE tagtext = '" & strMyTag & " VBAでDAOまたはADOレコードセットを取得するためにクエリを書式設定しない限り、これを心配する必要はありません。私が指摘したことは、フォームやレポートのレコードソースや保存されたクエリには一般に影響しません。その中の変数)

クエリ - わかりにくくはないが、アクセスではクエリは基本的にMySQLビューです。私は実際には非常に頻繁にクエリを保存しません。私は一般にSQLの「コード」を派生させるためにのみ使用し、そのSQLを取り出し、フォームを保存されたクエリにバインドするのではなく、レコードソースとしてフォームに貼り付けます。あなたがそれをやりたいと思うのは問題ではありません。あなたがこれをすることを選択するいずれかの方法で長所と短所があります。さらに注意して、MySQLでビューを作成してAccessにリンクするのを恐れないでください。あなたがそれらにリンクするとき、Accessはテーブルとしてそれらを見る。更新可能か書き込み可能かは、ビューの構成によって異なります。特定の種類の問合せ/ビュー(共用体など)は読取り専用です。

最後に、私はOpenOffice.orgベースでMS Accessをお勧めします。私は数年前にBaseを試してみましたが、それは非常に多くの機能が欠けていることがわかりました。しかし、私はすでにMS Accessで経験していたので、私はOpenOffice Baseに公平な試用版を渡したかどうか分からない。私が見つけたのは、イベントでした。私はMS Accessのフォームを細かく調整して、ユーザーにフィードバックの多い非常に反応の良いUIを提供できることに慣れており、Baseでこれを行う方法を理解できませんでした。私が最後に試してから物事が変わったかもしれませんが、分かりません。 Here's an article comparing Base to MS access.

その他のSOアクセスの専門家は、私の答えに間違いを指摘してください。私はまだ自分自身をプログラミングのルーキーと考えています。

+0

うわー。私はあなたの時間のためにこのような深い応答を期待していなかった!私はやりたいことがたくさんあると思う。 –

+0

DoCmd.CloseとDoCmd.OpenFormの問題について:これは本当に簡単です。最初のコマンドは任意のタイプのオブジェクトを閉じるための汎用コマンドですが、OpenXXXXコマンドにはそれぞれのオブジェクトが異なるために異なる引数があります。私の意見では、複雑でも紛らわしいものでもありません。 –

+0

参考文献:私は最低3、アクセスリファレンス、VBAリファレンス、およびDAOリファレンス以外は何も使用しません(私はADOを使用しません。これはAccessで、特にこのような単純なアプリケーションではそうではありません)。 Scripting Runtimeを使用する場合は、レイトバインディングを使用し、基本バインディング3以外のレファレンスバインディングを使用します。パフォーマンスヒットは、外部コンポーネントの永続オブジェクトを初期化することで改善できます(遅延バインディングオブジェクトのメンバー/プロパティの解決では、1000ミリ秒程度の理論上のパフォーマンスヒットがあります)。 –