2012-03-04 78 views
3

我的代碼有點問題。我有一個包含汽車詳細信息,名稱,價格和數量的表格,所以我試圖創建一個名爲buy的功能,該功能將用於購買特定的汽車。當用戶購買例如5輛寶馬汽車時,他們將撥打buy_car(bmw,5)。在此之後,我想更新寶馬汽車的新數量。如何更新Erlang中的Mnesia表

我的嘗試是在下面,但我似乎無法解決它,我是新來的Erlang。

buy_car(X,Ncars) -> 

    F = fun() -> 

     %% ----first i find the number of car X available in the shop 
     [Xcars] = mnesia:read({car,X}), 
     Nc = Xcars#car.quantity, 
     Leftcars = Xcars#car{quantity = Nc - Ncars}, 

     %% ---now we update the database 
     mnesia:write(Leftcars), 

    end, 
    mnesia:transaction(F). 

請幫助我如何寫一個從商店購買汽車的功能。

回答

5

但是你的實現工作正常,除非你在mnesia之後添加了非法的逗號:write(Leftcars)。 這裏是可用的代碼(我試過你的實現爲buy_car2)。

-module(q). 

-export([setup/0, buy_car/2, buy_car2/2]). 

-record(car, {brand, quantity}). 

setup() -> 
    mnesia:start(), 
    mnesia:create_table(car, [{attributes, record_info(fields, car)}]), 
    mnesia:transaction(fun() -> mnesia:write(#car{brand=bmw, quantity=1000}) end). 

buy_car(Brand, Ncars) -> 
    F = fun() -> 
     [Car] = mnesia:read(car, Brand), % crash if the car is missing 
     mnesia:write(Car#car{quantity = Car#car.quantity - Ncars}) 
    end, 
    mnesia:transaction(F). 

buy_car2(X,Ncars) -> 
    F = fun() -> 
     %% ----first i find the number of car X available in the shop 
     [Xcars] = mnesia:read({car,X}), 
     Nc = Xcars#car.quantity, 
     Leftcars = Xcars#car{quantity = Nc - Ncars}, 
     %% ---now we update the database 
     mnesia:write(Leftcars) 
    end, 
    mnesia:transaction(F). 
+0

非常感謝你,這正是我所需要的,我對erlang很陌生,但對其他語言非常好,謝謝你的幫助。 5 * – Onty 2012-03-05 00:29:15

-1

我會做類似如下:

 
Considering the record is defined as : 
-record(car_record, {car, quantity}). 

The following function will update the data: 
buy_car(X,NCars) -> 
    Row = #car_record{car = X, quantity = NCars}. 
    mnesia:ets(fun()-> mnesia:dirty_write(Row) end), 
    mnesia:change_table_copy_type(guiding_data, node(), disc_copies). 

使用上述方法,Mnesia的表必須爲「ram_copies」並沒有複製節點創建。另外,如果有很多更新發生,您可能不想將ram_copies複製到磁盤上,以便進行每次更新(由於性能問題),而是以時間觸發的方式進行更新。

+0

謝謝你的迴應,你知道我可以從已經在表格中的數量中減去NCars,然後用新的數量值更新記錄嗎?例如數量=數量 - NCars,是否可以,如果我這樣寫? – Onty 2012-03-04 14:38:22

相關問題