簡體   English   中英

在MS Access或OpenOffice.org Base中克隆PHP / MySQL數據庫應用程序(具有一些自動化功能)

[英]Cloning a PHP/MySQL database app (w/ some automation) in MS Access or OpenOffice.org Base

我不確定是在這里還是在SuperUser上問這個問題,所以我很抱歉它是否不屬於這里。

我創建了一個小型PHP / MySQL數據庫應用程序來管理媽媽商​​店的客戶忠誠度數據,並打算通過XAMPP在她的收銀機上本地設置該數據。 但是,我被要求在GUI關系數據庫(例如MS Access或OpenOffice Base)中重新實現系統,主要是為了讓她可以使用GUI進行郵件合並和圖形報告之類的事情(我不必編寫) 。

我可以輕松地復制我的MySQL表結構和關系,並創建一些更基本的形式和報告,但是我從未在Access或Base中做過任何腳本,宏等。 我的PHP不僅僅處理表單輸入,還涉及一些腳本,但我不知道如何在Access / Base中實現。 值得注意的是:如果我最終使用Access,它將是Access 2007。

如果有幫助,這里是我正在嘗試做的快速概述。 對不起,長度。

該業務是一個外賣食品市場,該數據庫正在取代實體的郵票卡會員系統。 每位客戶每消費25美元,即可在其卡上獲得一張郵票。 他們賺取的免費飯菜如下:
-在第8張郵票上,他們可以獲得免費配菜。
-在16日郵票上,他們可以免費獲得一頓普通大餐。
-在第24張郵票上,他們可以免費獲得全家大小的一餐,並且其卡會重置為零郵票。
必須記錄每個郵票的日期(否則,我只增加一個字段而不是有一個郵票表)。

我有3張桌子: customersstampsfreebies customersstampsfreebies具有一對多的關系。

  • 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。
    • 記錄將插入帶有當前日期,客戶ID和索引N的stamps
    • 如果N == 8、16或24,則會將一條記錄插入具有適當大小的freebies ,並且會出現一條警報,通知用戶該客戶獲得了一些免費屎。
  2. 某種“查看客戶”頁面(窗體?報告?),顯示了他們已獲得的所有郵票和贈品,在尚未兌換的贈品旁邊帶有“兌換”按鈕。

總的來說,我需要使其具有相當的防白痴性和“大按鈕”(在可能的情況下實現自動化),商店的收銀員應該能夠在沒有數據庫先驗知識的情況下使用它。

這在Access或Base這樣的程序中是可行的,還是我只應該說服她使用我的PHP版本? 如果我需要編寫代碼,我需要自學什么語言? 我應該以不同的方式構造數據嗎? 我不確定從哪里開始。

真的,我認為這將是小菜一碟。 就像Tony所說的那樣,您可以繼續使用相同的表/后端,這也許是我推薦的方法。 您需要在將鏈接到MySQL數據庫的任何計算機上安裝MySQL的ODBC驅動程序。 之后,創建一個DSN,然后從Access內部通過該表訪問表。 您可能需要稍后添加代碼,以便在每次使用無DSN的表加載軟件時重新鏈接表。 這樣,數據庫可以在未配置DSN的計算機上運行。 我確實建議您使用MySQL或SQL Server Express,而不要使用MS Access后端,但是我不會花時間詳細說明原因。

我認為您實際上可以從傳統的Windows桌面應用程序(內置於MS Access或VB.Net中)獲得比PHP多得多的功能。 我個人認為,您將可以用更少的代碼和更少的時間來做到這一點。 我提到了VB.Net,但我可能會推薦通過VB.Net的MS Access用於數據庫,盡管任何一個都可以勝任。

正如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-使用對象變量后清除對象變量是使用MS Access的最佳實踐之一。 您將使用它來清理DAO Recordset變量,ADO Connection變量,ADO Recordset變量,表單變量等。聲明為對象(或某些特定類型的對象)的任何變量都應通過將其設置為Nothing來清除。當您不再需要使用變量時。

無包含-MS Access中沒有諸如Include語句之類的東西。 您可以從其他Access數據庫導入代碼模塊。 您可以調用DLL中包含的函數。 但是與PHP中一樣,Access中沒有包含內容。

DoCmd-您必須使用MS Access的DoCmd對象來打開表單和報表並執行其他常見任務。 只是警告:它經常是不合理的。 長期訪問的用戶並沒有考慮太多,但是我發現這些命令幾乎沒有凝聚力或一致性。 讓我給你舉個例子。 如果要關閉表單,請使用以下代碼: 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非常有用。 您甚至可以使用它來循環瀏覽表單控件。 我使用的一個地方是刪除行后,在發票明細中對行號進行重新排序。 另一個典型的用法是在“實用程序”功能中使用它,您需要在給定字段中進行某些更改,而這些更改是使用更新查詢無法完成的。

以我的理解,CurrentDb.Execute(“更新或刪除此處的查詢...”)CurrentDb對象的Execute方法是隱式的DAO調用。 它允許您從VBA代碼對本地表和鏈接表運行更新或刪除查詢。 您也可以使用DoCmd.RunSQL來實現此目的,但是CurrentDb.Execute是首選方法,因為如果在附加“,dbFailOnError”作為第二個參數時出現故障,它將為您提供改進的錯誤消息。

ADO-ActiveX數據對象 -我建議不要使用ActiveX控件,但這是您可能需要的一種ActiveX技術。 就我所知,ADO是唯一可用於從Access運行存儲過程的東西。 ADO與DAO相似,盡管不是真正的,但它應該替代DAO。 我傾向於在我的應用程序中同時使用它們。 需要一段時間才能弄清楚哪個人可以為您完成工作,哪個人可以做得更好。 通常,除了運行存儲過程或連接到外部數據源(即不使用鏈接表)之外,我都會堅持使用DAO。 DAO和ADO都是隨MS Access一起安裝的MDAC(Microsoft數據訪問組件)的一部分。

文件系統對象 -上面提到的此對象通常用於訪問文件和文件夾。 您可能會發現必須使用它來復制文件,創建文本文件,讀取文本文件,寫入文本文件等。它是Microsoft Scripting Runtime的一部分,它是Windows Script Host的一部分(盡管所有Windows計算機上都存在它可能會變成“破碎”)。 Access確實為您提供了使用VBA的內置函數/方法(例如Dir())訪問文件和文件夾的某些方法,但是這些函數並未涵蓋所有基礎。

SQL-服務器的查詢語言 -您可能已經很熟悉SQL,但是您需要習慣於Access的SQL語言的“超集”。 並沒有太大的不同,但是Access確實允許您使用Access函數(例如Len,Left,Right)或您自己的自定義函數。 您自己的函數只需要存在於代碼模塊中並聲明為public。 您自己的函數的一個示例是Repeat(在MS Access中不存在,在MySQL中不存在)Repeat有時用於基於具有子父關系的表中的Count(*)創建縮進。 我以它為例,盡管除非您將要使用嵌套集模型來保存層次結構類別,否則不太可能需要使用此類函數。

變量不能為文字字符串-這是Access和PHP之間的巨大差異。 PHP使您可以編寫:“ SELECT * FROM tag WHERE tagtext ='$ mytag'”在MS Access中,您必須這樣編寫:“ SELECT * FROM tag WHERE tagtext ='”&strMyTag&“'”(您可以除非您要在VBA中格式化查詢以檢索DAO或ADO記錄集,否則不必擔心這一點我剛才指出的內容通常不會影響表單或報表的記錄源或保存的查詢,因為您通常不使用這些變量。)

查詢-不難發現,但在Access中,查詢基本上是MySQL視圖。 實際上,我並不經常保存查詢。 我通常只使用它們來派生我的SQL“代碼”,然后使用該SQL並將其粘貼到表單中作為Recordsource,而不是將表單綁定到保存的查詢。 您想用哪種方式都沒關系。 無論您選擇哪種方式,都有其優點和缺點。 附帶說明一下,不要害怕在MySQL中創建視圖並在Access中鏈接到它們。 當您鏈接到它們時,Access會將它們視為表。 它是否可更新/可寫將取決於視圖的構造。 某些類型的查詢/視圖(例如聯合)是只讀的。

最后,我建議通過OpenOffice.org Base訪問MS Access。 幾年前,我嘗試了Base,但發現它缺少這么多功能。 但是,我已經具有MS Access的經驗,因此我不確定是否對OpenOffice Base進行了公平的試用。 我發現缺少的是事件。 我習慣於能夠在MS Access中微調我的表單,以便為用戶提供響應速度非常快的UI,並具有大量反饋,而且我不知道如何在Base中做到這一點。 自從我上次嘗試以來,情況可能已經發生變化,我不知道。 這是一篇比較Base和MS訪問的文章。

其他SO Access專家,請隨時指出我的答案中的任何錯誤。 我仍然認為自己是編程方面的新秀。

我不能代表基地。 但是,Access可以直接鏈接到MySQL數據庫,因此您不必重做數據。 至於在Access中創建一點點的代碼,這將非常容易。 Access,Word和Excel使用與Visual Basic 6.0相同的VBA,但Access,Word或Excel對象模型特定的內容除外。 確實,在使用VBA編輯器時,VB6編輯器中還存在一個較小的模糊錯誤。

我還將添加一個Access數據庫,其中有160個表,1200個查詢,350個表單,450個報表和7萬行代碼。 因此,通過比較,您的應用程序很小。

在贈品表上,我將is_redeemed字段更改為date_redeemed。 我絕對同意在表格中記錄每個郵票和免費贈品。 通過這種方式,向客戶顯示歷史記錄非常容易,而不僅僅是聲明您只有x印章。

還考慮使用條形碼讀取器,並向用戶發行條形碼塑料錢包卡。 這將大大加快店員查找其記錄所需的時間。 實際上,可以考慮使用他們可能已經擁有的與您所在地區相同的會員卡,例如Safeway或AirMiles卡。 我將這個數字放在單獨的表格中,盡管以防萬一他們丟掉了第一張給他們的卡片。 如此一來,他們可以追蹤多張卡片。 一個家庭可能想將積分累積到一個帳戶中。

感謝您的冗長發布。 這使我們能夠為您提供一些您可能最初沒有想到的不同方面的建議。

我的建議:不要這樣做。 在有問題的PC上運行mysql服務器,將PHP應用程序作為收銀員的前端,然后,如果要使用MS Access的報告功能,只需使Access使用ODBC連接到mysql數據庫即可。

最好的實現通常是您已經擁有的一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM