2016-05-17 7 views
0

私はAndroid Appを作成しています。ここで、ユーザーはいくつかの領収書とログを入力します。関係は次のとおりです。領収書has_manyログ。Android-sql query for group_by items

私の領収書とログモデルはこちらです。

@Table(name = "Logs") 
public class Logs extends Model { 
    @Column(name="PlateNumber") 
    String plate_number; 
    @Column(name="SortID") 
    String sort_id; 
    @Column(name="Grade") 
    String grade; 
    @Column(name = "Diametar") 
    double diameter; 
    @Column(name="Length") 
    double length; 
    @Column(name="CreatedAt") 
    Date createdAt; 
    @Column(name="Receipt") 
    Receipt receipt; 
    @Column(name = "Price") 
    Price price; 
} 


@Table(name = "Receipt") 
public class Receipt extends Model { 
    @Column(name="Place") 
    String place; 
    @Column(name="ShippingNumber") 
    String shippingNumber; 
    @Column(name="Warehouse") 
    String warehouse; 
    @Column(name="Carrier") 
    String carrier; 
    @Column(name="LicencePlate") 
    String licencePlate; 
    @Column(name = "Driver") 
    String driver; 
    @Column(name = "Customer") 
    String customer; 
    @Column(name= "DestWarehouse") 
    String destWarehouse; 
    @Column(name = "Employee") 
    String employee; 
    @Column(name = "PriceType") 
    String priceType; 
    @Column(name = "PriceCorrection") 
    Double priceCorrection; 
    @Column(name = "PriceCorrection2") 
    Double priceCorrection2; 
    @Column(name = "Supplier") 
    String supplier; 
    @Column(name = "CreatedAt") 
    Date createdAt; 
} 

これは私がこれを達成しようとしているが成功していない活動です。

public class LogsRecapitulation extends AppCompatActivity { 

    private ListView mainListView; 
    private BaseAdapter listAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_listview); 
     mainListView = (ListView) findViewById(R.id.ListViewItem); 

     //recieve RecepitID in displayLogs.activity 
     final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID")); 
     List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID").execute(); // I grouped Logs by sortId in this line. 

     listAdapter = new RecapitulationArrayAdapter(logsList); 
     mainListView.setAdapter(listAdapter); 
    } 

    private class RecapitulationArrayAdapter extends BaseAdapter { 
     private LayoutInflater inflater; 
     private List<Logs> logsList; 

     public RecapitulationArrayAdapter(List<Logs> logsList) { 
      inflater = LayoutInflater.from(LogsRecapitulation.this); 
      this.logsList = logsList; 
     } 

     @Override 
     public int getCount() { 
      return logsList.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return logsList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return logsList.get(position).getId(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.logs_recapitulation, parent, false); 
      } 
      Logs log = logsList.get(position); 
      ((TextView) convertView.findViewById(R.id.rec_log_sort)).setText(log.sort_id); 
      ((TextView) convertView.findViewById(R.id.rec_log_class)).setText(log.grade); 
      ((TextView) convertView.findViewById(R.id.rec_log_count)).setText(String.valueOf(logsList.size())); 
      ((TextView) convertView.findViewById(R.id.rec_logs_mass)).setText(String.format("%.2f m3", log.getM3())); 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.stumpPrice_kn)); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.roadPrice_kn)); 
      } 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.stumpPrice_kn * log.getM3())); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.roadPrice_kn * log.getM3())); 
      } 

      return convertView; 
     } 
    } 

} 

だから、私はこれまでやったことは、私は、このBaseAdapterでsortIDしてログを表示することであるが、各ソートにそれは私が唯一の最後のログを追加したのを示し、それはデータです。

今、私はそれが下のイメージにあるようなデータを表示する必要があります - ここではREKAPITULATです。そこで私はsortIDでグループ化が必要です。そして、それぞれの分類でグループ化が必要です。

たとえば、4つのログ、1つのグレード(A、B)の画像ソート1の場合、画像のように表示する必要があります。 enter image description here

私はここにこだわっていて、誰かがそれをやる方法を知っていて、助けてくれると大変感謝しています。

質問:上記の画像にあるように、SQLクエリを作成するか、このコードを修正してデータを表示するにはどうすればよいですか?ここで

+0

どのパーシスタンスフレームワークを使用していますか? – JimmyB

+0

'SortID、Grade、sum(mass)、sum(price)FROM ... SortID、Grade' – JimmyB

+0

「質量」とはどういう意味ですか?私はその名前のフィールドを見ません。 – JimmyB

答えて

1

がActiveAndroidを使用してGROUP BYJOINとクエリの例です:

new Select("SUM(Logs.Price)") 
    .from(Logs.class) 
    .join(Receipt.class) 
    .on("Receipt.Id = Logs.Receipt") 
    .groupBy("Logs.sortID") 
    .execute(); 

このクエリから、あなたはLogインスタンスを取得しますので、あなたは、有効なLogフィールドにSUM(Logs.Price)フィールドをマップする必要があります例えば、Price。例:

new Select("SUM(Logs.Price) AS Logs.Price") 

クエリは、使用例に合わせて調整する必要があります。

+0

私はsortIdとgradeによってグループを行いましたが、それぞれのグループでは私には1つのアイテムしか表示されません。しかし、例えば、ソート3は、A級とB級の2つの項目がありますが、1つしか表示されません。 – RubyDigger19