-1

私はこのテーブルを持っています:

-record(person, {id, firstname, lastname, address}).

たとえば、このテーブルには次の値が含まれています。

2  alen     dumas      paris
5  franco   mocci      parma
3  ali      othmani    london

Key これで、この値を含む 変数ができました 10

idすべてのテーブルを変更する関数を erlang で開発したいperson

this の新しい値はid 、以前の値 + の値になります。Key

テーブルパーソンはこうなる

   12  alen     dumas      paris
    15  franco   mocci      parma
    13  ali      othmani    london

それぞれが10ずつ追加されることを意味idします(の値ですKey):(2 + 10)(5 + 10)(3 + 10)

私はあなたのコードで試してみます:

testmodify()->
    Key=22, 
    [ P#person{id=P#person.id+Key} || P <- Persons ].

しかし、sysntax に次のエラーがあります。variable Persons is unbound

このコードでこの問題を解決しようとしています:

testmodify()->
    Key=22, 
    [ P#person{id=P#person.id+Key} || P <- mnesia:table(person) ]. 

しかし、私はこのエラーがあります:

1> model:testmodify().
** exception error: no function clause matching 
                    model:'-testmodify/0-lc$^0/1-0-'({qlc_handle,
                                                      {qlc_table,
                                                       #Fun<mnesia.20.112329951>,
                                                       true,
                                                       #Fun<mnesia.21.62211129>, 
                                                       #Fun<mnesia.22.75429001>, 
                                                       #Fun<mnesia.23.26336897>, 
                                                       #Fun<mnesia.26.62819299>, 
                                                       #Fun<mnesia.25.51075493>, 
                                                       #Fun<mnesia.24.47804912>, 
                                                       '=:=',undefined,
                                                       no_match_spec}})
4

1 に答える 1

1

テーブルがリストとして保存されていると仮定します。

[ P#person{id=P#person.id+Key} || P <- Persons ].

更新: Mnesia テーブルの場合、QLC で同様の結果を取得できます。

-include_lib("stdlib/include/qlc.hrl").
⋮
[ P#person{id=P#person.id+Key} || P <- mnesia:table(person) ].

これは、変換された人物レコードのリストのみを提供することに注意してください。レコードを更新するには、おそらく既存のレコードを削除し、新しいレコードをトランザクションに書き込む必要があります。これは、変更されたキーを持つレコード (それがそうであると仮定id) が別のレコードとして扱われるためです。たとえば、次のようになります。

mnesia:transaction(fun() ->
    Old = [ P                            || P <- mnesia:table(person) ],
    New = [ P#person{id=P#person.id+Key} || P <- Old ],
    [ mnesia:delete({person, P#Person.id}) || P <- Old ],
    [ mnesia:write(P) || P <- New ]
end)

を使用して 1 回のパスでこれを実行できる可能性がありますが、 を発行して内部でmnesia:foldr実行するとどうなるかはわかりません。無限ループに陥る可能性があります (ただし、引用しないでください)。mnesia:deletemnesia:writemnesia:foldr

于 2013-02-20T09:17:47.010 に答える