人に聞けない痔の悩み、これでスッキリ >>

いつもお世話になります。
ASP.NET MVCを使って構築中のサイトで、また暗礁に乗り上げております。

商品一覧の画面で、一覧表示のままCRUD(追加・更新・削除)するインターフェースを客先から求められております。
一覧表示 → 個別画面でのCRUDはできていますが、画面遷移が面倒ということで却下されました。
ASP.NETでいう、GridViewのようなテイストです。
(各行にテキストボックス・更新ボタン・削除ボタン)

モデルはこんな感じです(簡略化してあります。実際にはご教示いただいたカスタム検証もあります)
public class Lady
{
 public int ID { get; set; }
 public string name { get; set; }
 public int areaID { get; set; }
 public int salesAmount { get; set; }
}
public List<Lady> ladies;

一覧表部分のビューはこんな感じです(細かい点は省略です)

@foreach (var lady in Model.ladies){
 @using(Html.BeginForm("UpdateLady","Admin")) {
  @Html.Hidden("ID", lady.ID)
  @Html.TextBox("name", lady.name)
  @Html.DropDownList("areaID", new SelectList(model.areas, "areaID","areaName", lady.areaID))
  @Html.TextBox("salesAmount",lady.salesAmount)
  <!-- 以降不明 -->
  <input type="submit" value="更新"/>
  <input type="submit" value="削除"/>
 }
}

コントローラ

class AdminController
{
 public EditLady(){
  var model = new EditLadyView();
  return View("EditLady", model);
 }

 [HttpPost]
 public UpdateLady(Lady lady){
  if (ModelState.IsValid){
   // 更新
   // lady.IDをキーにしてDBを更新
  } else {
   // 再表示 <!-- ここがわからない -->
  }
 }

 [HttpPost]
 public DeleteLady(int ID){
  // 削除
  // IDをキーにしてDBを削除
 }

}


質問点は以下の通りです。

■表示はOKですが、できたhtmlを見ると、各行の項目が同じid / name名になります。これで正しいですか?
■同じForm内に更新ボタンが複数あった場合、formのPOST先を変える必要がありますが、javascriptを使うのでしょうか?
■検証失敗時、全体を再表示するにはどういった方法があるでしょうか? 読み直すと入力した値が消えてしまいます。

会社にMVCの経験者がおらず、苦労しています。
なにとぞお助けください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは。


一覧で表示し、更新は一行単位というのは、GridViewやListViewではよくやる処理です。
項目数が少なく行数が限定的な場合を除き、全体一括更新は使ってはいけません!

要点だけ述べます。
ご謙遜されていますが、MVCの内容ををお分かりのようなので、自分で解決策を考えてください。

1 こんな風にレンダリングされるフォームを作ります。
<input type="hiddden" name="ID" value="1012" />
<input type="text" name="1012.name" value="東京花子" />
<input type="text" name="1012.address" value="千代田区一丁目一番地" />

2 更新メソッドで、いきなりLady型のladyで受けず、IDだけを取得します。
3 取得したIDを接頭辞(prefix)として、表示に使ったビューモデルの指定ID行を、TryUpdateModelで更新します。
4 ModelStateは、TryUpdateModelでも有効です。
5 DB更新はただUpdateすればいいだけ
6 検証失敗時のリトライは、更新できなかったビューモデルをそのまま返します。

ASP.NET MVC3関連の洋書には、こういうTable CRUDの話題が良く出ています。
英語読まなあかんのですが。。苦(笑
    • good
    • 0
この回答へのお礼

詳細なアドバイスをいただき、ありがとうございます。
情けないことに、まだ問題を解決できていません。
今回なんとか、お客様に個別更新で納得いただきました。
自分の力量不足で情けないです。
でも必ず、この問題はクリアしようと思っていますので、また不明点があったらつきあってやって下さい。

お礼日時:2012/12/28 16:31

> まことにお恥ずかしい限りですが、では、どのように更新画面を組み立てれるべきだと思われますか?



仕様の話なんで、お客さん(利用者?)とつめるべきでしょう。

MVCで組みやすく、一覧形式は保持したい、ということなら

> ・一覧表表示での1行更新という仕様に問題がある。全体一括更新にすべき。

となるかな。

ちなみに、別に「泥臭い」のが悪いとはおもってません。
仕様というかお客様のこだわりで、実装は泥臭いコーディングにせざるを得ないなんてことはいくらでもあることですから。
    • good
    • 0
この回答へのお礼

onosさま、いつも有難うございます。
自分の力量不足で、一括更新を実現することができませんでした。
前にGridViewで何回もやっていた処理なので、なんでMVCでできないのか、もう一度よく考えてみます。
今回は有難うございました。

お礼日時:2012/12/28 16:35

> 一つのformに「更新」と「削除」のボタンが2つ出てくるのですが、そもそも各行ごとにformをつけるのは適正なのか? という点もわからないです。



別にformはいくつあってもかまわないと思います。

> 更新行は1行だけなのですが、検証エラー時も、再度、対象の1画面分のデータはすべて再取得しなければいけませんか?

formを各行に設定した場合、ブラウザから投げられるのは更新行のデータだけです。
サーバー側には他のデータを取得する方法はありません。

#HTMLがステートレス、というのは理解されてますよね?

まぁ、SessionだのTmpData(は、つまりSessionと同じですが)を使ってサーバ側にデータを保持しておく方法がないわけではないですが。
それであってもある意味データを再取得している、といえなくもないわけで。

あと、こういうユーザーインターフェースだと、2行文のデータなおしたあと、1行めの更新ボタンだけ押したとき、とか、いろいろと問題は多くでてきそうな気がします。
まぁ、仕様としてどう考えるか、なのでそういったときの対処方法がきちんと合意されていればよいですが。

> ASP.NETのような「サーバサイド検証」や「バインディング」の機能がないため、泥臭い大量コーディングを強いられます

この仕様だと検証やバインディングもうまく使えない、というか使えるところが限られてくるかと。
泥臭いコーディングが必要じゃないですかね。

この回答への補足

onos様、何度もありがとうございます。
本当に有難うございます(感涙

> formを各行に設定した場合、ブラウザから投げられるのは更新行のデータだけ

はい、存じております。理解できました。

> この仕様だと検証やバインディングもうまく使えない、というか使えるところが限られてくるかと。
> 泥臭いコーディングが必要じゃないですかね。

まことにお恥ずかしい限りですが、では、どのように更新画面を組み立てれるべきだと思われますか?

・一覧表表示での1行更新はOK。フォームやHtmlヘルパーの設定の仕方に問題がある。
・一覧表表示での1行更新という仕様に問題がある。全体一括更新にすべき。
・一覧表表示での更新自体に問題がある。

本当に困っています。失礼とは存じますが、ご意見お聞かせください。

補足日時:2012/12/06 17:20
    • good
    • 0

> ■表示はOKですが、できたhtmlを見ると、各行の項目が同じid / name名になります。

これで正しいですか?

OKじゃないから質問してるのでは?
それはともかく、どのようなデータを渡しているのか、またView側の受け取るデータの型がどうなっているか、とかが掲載されたプログラムだけじゃわかりません。
ちゃんと複数のデータ格納して渡せてます?

> ■同じForm内に更新ボタンが複数あった場合、formのPOST先を変える必要がありますが、javascriptを使うのでしょうか?

行ごとに存在する更新ボタンのことですよね?
だったらformのPOST先を変える必要はないように思いますが。。。

> ■検証失敗時、全体を再表示するにはどういった方法があるでしょうか? 読み直すと入力した値が消えてしまいます。

UpdateLady で受け取っているデータが一つだけなのが気になります。
ここで全データ受け取ってるならそのままもとのページに返せばいいだけのはず。
まぁ、どの部分を変更しようとしているか、という対象のとりだしに工夫が必要ですが。
データを一つしか受け取らないなら、他の行については再度取得してビュー側に渡す必要があると思います。

この回答への補足

いつもありがとうございます。
ちょっと説明不足ですいませんでした。「一覧表示」しつつ、各行に更新・削除ボタンのあるインターフェースをMVCで作りたいのです。

表示するまでは問題ありません。
Model側にEditLadyViewというビュークラスを定義し、Controllerで初期化する際、ladiesプロパティに、取得したList<Lady>型を入れています。

一つのformに「更新」と「削除」のボタンが2つ出てくるのですが、そもそも各行ごとにformをつけるのは適正なのか? という点もわからないです。

phpなどですと、
<form action="update_lady">
 <input name="ID" type="hidden" />
 <input name="name" type="text"/>
</form>
(以降繰り返し)
のように単純にタグ発生させるます(ASP.NETのような「サーバサイド検証」や「バインディング」の機能がないため、泥臭い大量コーディングを強いられます)。

こういう「行更新」をともなう集合型?のフォームについて知りたいです。
更新行は1行だけなのですが、検証エラー時も、再度、対象の1画面分のデータはすべて再取得しなければいけませんか?

補足日時:2012/12/06 14:56
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QASP.net MVC4のデータ更新について

お世話になっております。

MVC4でWEBプログラミング作成しながら勉強しています。
チュートリアル等で簡単なデータベースの更新は出来るようになりました。

各データ操作で1レコード1ページで作る方法はなんとなく分かりました。

例えば、Viewでデータの一覧を表示し、表示分の複数データを一括でControllerに
送る方法がまったくわかりません。
ネットで結構調べましたがなかなか分からなくて。。
List等でControllerに送る事が出来たら一括で更新できるかなと思っていますが。。

基本的な事でしょうがご教授お願いします。

Aベストアンサー

実例はここいらに
http://www.binaryintellect.net/articles/b1e0b153-47f4-4b29-8583-958aa22d9284.aspx

要は、
<input type="text" name="customers[0].CustomerID" />
<input type="text" name="customers[0].CustomerName" />
<input type="text" name="customers[1].CustomerID" />
<input type="text" name="customers[1].CustomerName" />
<input type="text" name="customers[2].CustomerID" />
<input type="text" name="customers[2].CustomerName" />

のようなフォームを作って、
public class Customer
{
public int CustomerID { get; set; }
public string CustomerName { get; set; }
}
なクラスで受けるバインディングを行えばいい、ということです。

Controllerはこんな感じ。
public ActionResult UpdateCustmers(List<Customer> customers){
// 別にパラメタで指定するなり、UpdateModel使うなり
}

ですね。

実例はここいらに
http://www.binaryintellect.net/articles/b1e0b153-47f4-4b29-8583-958aa22d9284.aspx

要は、
<input type="text" name="customers[0].CustomerID" />
<input type="text" name="customers[0].CustomerName" />
<input type="text" name="customers[1].CustomerID" />
<input type="text" name="customers[1].CustomerName" />
<input type="text" name="customers[2].CustomerID" />
<input type="text" name="customers[2].CustomerName" />

のようなフォームを作って、
public class Custo...続きを読む

QASP.NET MVCでObjectをjsに渡す

いつも勉強させてもらっております。
ASP.NET MVC3で、ビューに渡すモデルを用意するのですが、最近javascriptをよく使うので、一発で展開できるようにできないかと思っています。

現在は、いったん起動後、jQueryで、Ajax JSONで取得しています。こちらだとすぐjavascriptのオブジェクトが取得できるので。

javascriptで一発展開というのは例えば、
public class HogeClass
{
 public string moge { get; set; }
 public List<string> fugas { get; set; }
}
があって、ビューモデルとして
public ActionResult HogeAction(){
 var hogeObj = new HogeClass();
 return View("hoge", hogeObj);
}
のようにビューへ渡して、

ビューの"hoge.cshtml"内部で、
<script type="text/javascript">
 var hogeObj = <%=Model %>; // こんなので通るわけないですよね
</script>
とかできたらいいなあ、という話です。

いちいち起動のたびにAjaxで読み直すのは速度のこともあるし、気になります。
これまでは全部サーバでやってたのでこんなこと考えなかったんですが、皆さんはどうされてます?

いつも勉強させてもらっております。
ASP.NET MVC3で、ビューに渡すモデルを用意するのですが、最近javascriptをよく使うので、一発で展開できるようにできないかと思っています。

現在は、いったん起動後、jQueryで、Ajax JSONで取得しています。こちらだとすぐjavascriptのオブジェクトが取得できるので。

javascriptで一発展開というのは例えば、
public class HogeClass
{
 public string moge { get; set; }
 public List<string> fugas { get; set; }
}
があって、ビューモデルとして
public ActionResu...続きを読む

Aベストアンサー

AjaxでJSON渡しをやっているんだから、同じこと(シリアライズ)をやればいいんだよ。

<script type="text/javascript">
@{
 var serializer = new JavaScriptSerializer();
 var value = serializer.Serialize(Model);
}
var hogeObj = @value;
</script>

JSONに渡せる程度のオブジェクトだったら、これでいけると思う。

QC#にてDropDownListの値を動的に設定する

C#にてDropDownListの値を動的に設定したいのですが、要約すると以下の感じです。
DBより読込んだ値が「A」の場合
Items Text   Value
0 あああ  アアア
1   いいい  イイイ

DBより読込んだ値が「B」の場合
Items Text   Value
0 かかか  カカカ
1   ききき  キキキ
2   くくく  ククク

としたいのですが、どのように設定してよいか初心者のため、
分かりません。恐れ入りますが、有識者の方、ご教示下さい。

Aベストアンサー

DorpDownListに設定するデータはどこにあるのでしょう
DataSetやDataSourceにあるのか まったく関係ない配列にあるデータなのか

DBから来たデータというのはいつ取得されるものなのか ・・・

TextやValueに設定するデータがDB側にあるなら
仕様を満たす SQLを構築してDataSourceオブジェクトを作成し
DropDownListのDataSourceIDやDispaleyTextFieldおよびDataValueFieldを適切な設定をすればいいように思います

QASP.NETでのメッセージ画面を出すには

はじめまして。
ASP.NET(C#)で、開発をしています。
例えば、内部である処理が終わった後に「完了!」みたいなメッセージ画面をポップアップさせたいと思っております。いろいろ調べてはいるんですが、方法がわかりません。JSを使わなければならないのかなとは思いますが、具体的な方法がわかりません。
よい方法がありましたら、教えていただけないでしょうか。よろしくお願いいたします。

Aベストアンサー

確認は取れていませんが、多分以下のHPの内容でいけると思いますが…。
参考に如何でしょうか。

・ASP.NETでメッセージボックス(OK・NO)の処理について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5952&forum=7&6

・Webアプリでメッセージボックスを使いたい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1644&forum=7&7

Q【ASP.NET MVC】更新アクション

いつもお世話になっております。
ASP.NET MVCのコントローラで、フォーム送信を受けて動作する更新アクションの作り方について質問させてください。
いろいろな記事やチュートリアルを読んで、なんとか次のような基本計については理解できました。

public class HomeController
{

[HttpPost]
public ActionResult UpdateItem(Item item){

 if (! ModelState.IsValid){
  TempData["error"] = "入力内容にエラーがあります";
  return View("ItemEdit", item);
 } else {
  var result = false;
  //
  // 延々と更新メソッドが続く
  //
  if (result) {
    TempData["message"] = "正しく更新できました"
    ModelState.Clear();
    return Redirect("ItemList");
  } else {
    TempData["error"] = "更新でエラーが起きました";
    return View("ItemEdit", item);
  }
 }

}

}

TempData["xxx"]の処理は、ビュー側で、値に応じてjQueryUIによりダイアログを表示します。

質問したい箇所は以下の3つです。

■一体、全体の流れはこれでいいのでしょうか? if文とTempDataばっかりで。。何かスッキリしません。
■フォーム値の検証はアクション呼び出しの時点で終わっていますが、ここに任意の検証を入れたい場合はどうしたらいいのでしょう?
(必須や文字種チェックはモデルで属性設定を行っていますが、それ以外の例えば2項目が連動するような検証)
■サンプルの例文は簡単ですが、DB更新などが伴うと数百行になるため、すごく見通しが悪いです。全部別メソッドにするのも。。いい方法はないでしょうか

不明点だらけですんません(笑
どなたか愛の手を

いつもお世話になっております。
ASP.NET MVCのコントローラで、フォーム送信を受けて動作する更新アクションの作り方について質問させてください。
いろいろな記事やチュートリアルを読んで、なんとか次のような基本計については理解できました。

public class HomeController
{

[HttpPost]
public ActionResult UpdateItem(Item item){

 if (! ModelState.IsValid){
  TempData["error"] = "入力内容にエラーがあります";
  return View("ItemEdit", item);
 } else {
  var result = false;
  //
...続きを読む

Aベストアンサー

こんにちは

■全体の流れ
検証NG、検証OK->更新OK、検証OK->更新NGと、きちんと処理が書かれているので、よくまとまっていると思います。
onosさんはViewBagでメッセージを返すように仰っていますがRedirectのように画面が遷移して、遷移後にメッセージを表示しなければいけない場合には、TempDataのほうが便利です(nayutaxさんのコードで気づきました^^; これ賢いやり方ですね)

■フォーム値の検証
モデルバインディングまで踏込むと大事になるので(笑、ここはカスタム検証を定義すればいいと思います。記述的にもすっきりするし。

http://cs.gogo-asp.net/blogs/naoki/archive/2010/07/02/ASP.NET-MVC-2-_6730AB30B930BF30E0305E5C27606E305C4F106268300130AF30E930A430A230F330C830B530A430C9301C693C8A6E30DD30A430F330C830_.aspx

文献はMVC2ですが、そのまま動きます。
ASP.NET MVC3だと、確かクライアント検証が大幅に拡張されているはずですがそこまで調べてない(^^;

■コントローラメソッドの拡張
ここはやはり、IoCでしょう。
単体テストもできるようになるし、堅牢になるし、捗りますよ。

http://david9142.wordpress.com/2012/07/13/asp-net-mvc%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E3%82%92%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%81%9F1/

ですかね。

こんにちは

■全体の流れ
検証NG、検証OK->更新OK、検証OK->更新NGと、きちんと処理が書かれているので、よくまとまっていると思います。
onosさんはViewBagでメッセージを返すように仰っていますがRedirectのように画面が遷移して、遷移後にメッセージを表示しなければいけない場合には、TempDataのほうが便利です(nayutaxさんのコードで気づきました^^; これ賢いやり方ですね)

■フォーム値の検証
モデルバインディングまで踏込むと大事になるので(笑、ここはカスタム検証を定義すればいいと思います。記述的...続きを読む

Q[ASP.NET]DropDownListのDB連携のやり方。

こんにちわ。
VS.NET2003で、ASP.NET+C#で開発しております。
ちょっと悩んでしまったので、質問させてください。

とある入力フォームを作成しようと思っているのですが、そのフォームにDBと連携したDropDownListを複数配置させたいと考えております。
で、とりあえず1つ連携させてみたのですが、これを複数やるのってなんだかなぁ。っと思ってしまいました。

連携の方法としては、
(1)sqlDataAdapterを作成、クエリを作る。
(2)sqlDataAdapterからdataSetオブジェクトを作成する。
(3)Page_LoadメソッドにてsqlDataAdapter.Fill(dataSetオブジェクト)を実行し、DataBindする

なんですが、これDropDownListの数だけsqlDataAdapter作らなくちゃいけないんですかねぇ?途中で端折れるところや、使いまわし出来る部分がありましたら、どなたか教えてください。

よろしくお願いします。

Aベストアンサー

VS.NETでVisualにやる方法でやる方法がありますが、
これは初心者向けです。
コードを自分で書いた方が効率がよい。

例えば、データテーブルの読み込みメソッドを共通クラスに置く。

public DataTable ReadDataTable(string strSQL)
{
DataTable dt = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = new OleDbCommand(strSQL, 接続);
da.Fill(dt);
return dt;
}

Page_Loadでは

DropDownList1.DataSorce = 共通クラス.ReadDataTable("select * from TableHoge");
DropDownList1.DataBind();

QASPで画面間のパラメタ受け渡し

こんばんは。ASP初心者です。
ASPでWEBページの作成を行っています。画面遷移をResponse.Redirect()で行っているのですが、遷移前のページと遷移後のページでパラメタを受け渡したい場合はSession("hoge") = "hogehoge"のようにセッションに入れる以外、何か方法はないでしょうか。リクエスト間でパラメタ渡せればがいいので、セッションを通じて保持しておく必要がないのです。クエリを使用するとアドレス欄に変数の値が見えてしまうのでできれば使いたくありません。

Aベストアンサー

1. Cookieを使う
2. 画面遷移を postで行い、hidden項目に値をセットする (要JavaScript)

私は面倒なのでセッション変数使ってますが、必要なくなればセッションをクリアすれば良いだけだと思います。

Session.Contents("hoge") = Empty

Q押下ボタンによってSubmit先を変えたい・その2

つい先日、解決ソースを頂きましたuinonaです。
教わったソースを試した所、SubmitボタンにNameを付けているのに、
何も入っていないんです。(押されたボタンを受信側で判別出来ない)
SubmitのName属性さえ付ければ複数Submitボタンの判別は可能なはずなのに、
なぜなのでしょうか?なにか設定等あるのでしょうか?またまた困ってしまいました。
ご回答の程よろしくお願いします。

<!-- aaa.asp -->
<form action="aaa2.asp" method="post">
<input type="hidden" name="field" value="test">
<input type="submit" name="btnQ" value="Q">
<input type="submit" name="btnZ" value="Z">
</form>

<!-- aaa2.asp -->
<%
If Len(Request.Form("btnQ")) > 0 Then ←※
Server.Transfer "bbb.asp"
Else
Server.Transfer "ccc.asp"
End If
%>

※"btnQ"を押下しているのにLen(Request.Form("btnQ"))=0なんです・・

つい先日、解決ソースを頂きましたuinonaです。
教わったソースを試した所、SubmitボタンにNameを付けているのに、
何も入っていないんです。(押されたボタンを受信側で判別出来ない)
SubmitのName属性さえ付ければ複数Submitボタンの判別は可能なはずなのに、
なぜなのでしょうか?なにか設定等あるのでしょうか?またまた困ってしまいました。
ご回答の程よろしくお願いします。

<!-- aaa.asp -->
<form action="aaa2.asp" method="post">
<input type="hidden" name="field" value="test">
<inpu...続きを読む

Aベストアンサー

そのソースを提供した張本人です。
前提条件として、該当ASPはIIS5(Windows2000Professional/Server/Advance Server)上で実行されているでしょうか?
前回の回答でも書いていますが、Server.Transferを使用している都合上、IIS3またはIIS4では動作しませんので

aaa.asp
aaa2.asp
bbb.asp
ccc.asp

を用意し、上記のソースだけでテストしましたが
btnQ, btnZの両方とも正常に分岐しました

bbb.asp側で Request.Form("btnQ") の値も出力しましたが、正常に「Q」が入っていることも確認しています。

デフォルトの設定なら動作するとは思いますが、
もしかすると該当WebサーバーでURLクエリをチェックするようなISAPIフィルタなどを導入されていないでしょうか?
#URLScanとかGuard3.dllとか・・・

私の知識ではこれぐらいしか思い浮かばないです。
参考までに

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング