在Vaadin中调用FileDownloader时,使用过滤的dataProvider内容

时间:2018-05-13 17:06:57

标签: kotlin vaadin vaadin8

我在将过滤器应用到DataProvider后尝试下载csv文件。

由于某种原因,过滤后的结果显示在网格中,但下载的csv文件仍包含所有数据。

from z3 import *

vy0, y0 = Reals("vy0 y0")  # initial velocity, initial position
dt, vy, y = Reals("dt vy y")  # time(s), acceleration, velocity, position
solver = Solver()  # Optmize doesn't work, but why?
solver.add(vy0 == 0)
solver.add(y0 == 3)

solver.add(dt >= 0)  # time needs to be positive
solver.add(vy == vy0 - 9.81 * dt)  # the velocity is initial - acceleration * time 
solver.add(y == y0 + vy/2 * dt)  # the position changes with the velocity (s = v/2 * t)
solver.add(y == 0)
# solver.minimize(dt)  # Optmize doesn't work, but why?
print(solver.check())
print(solver.model())

@AutoView class FinancialTransactionsView : VerticalLayout(), View { private val grid: Grid<FinancialTransaction> private val yearField: ComboBox<Int> private val dataProvider = DataProvider.ofCollection(FinancialTransaction.findAll()) private val fileDownloader: FileDownloader init { label("Financial Transactions") { styleName = ValoTheme.LABEL_H1 } yearField = comboBox("Select Year") { setItems(listOf(2016, 2017, 2018)) addSelectionListener { // Filter the data based on the selected year if (it.value != it.oldValue) setDataProvider() } } // Create FileDownloader and initialize with all contents in the DataProvider fileDownloader = FileDownloader(createCsvResource()) val downloadButton = button("Download csv") { styleName = ValoTheme.BUTTON_PRIMARY onLeftClick { // The idea here is to assign values from the filtered DataProvider to the FileDownloader fileDownloader.fileDownloadResource = createCsvResource() } } fileDownloader.extend(downloadButton) fileDownloader.fileDownloadResource = createCsvResource() grid = grid(dataProvider = dataProvider) { expandRatio = 1f setSizeFull() addColumnFor(FinancialTransaction::companyId) addColumnFor(FinancialTransaction::fiscalYear) addColumnFor(FinancialTransaction::fiscalPeriod) addColumnFor(FinancialTransaction::currency) addColumnFor(FinancialTransaction::finalizedDebitAmountInCurrency) addColumnFor(FinancialTransaction::finalizedCreditAmountInCurrency) appendHeaderRow().generateFilterComponents(this, FinancialTransaction::class) } } private fun createCsvResource(): StreamResource { return StreamResource(StreamResource.StreamSource { val csv = dataProvider.items.toList().toCsv() try { return@StreamSource csv.byteInputStream() } catch (e: IOException) { e.printStackTrace() return@StreamSource null } }, "financial_transactions.csv") } private fun setDataProvider() { dataProvider.clearFilters() if (!yearField.isEmpty) dataProvider.setFilterByValue(FinancialTransaction::fiscalYear, yearField.value) } } 是一个扩展函数toCsv(),它返回一个包含csv数据的字符串。

如何在我的csv文件中获取过滤结果?

1 个答案:

答案 0 :(得分:0)

感谢您使用Koadin上的Vaadin!

我刚刚更新了Databases Guide,希望能回答您所有的问题。如果没有,请告诉我,我将相应地更新指南。

  1. ListDataProvider.items将不应用任何过滤器,并且将始终返回所有项目。 您需要使用getAll()扩展功能来遵守Grid设置的过滤器。 现在,在《数据库指南》的“从数据提供者导出数据”一章中对此进行了说明。

  2. 在您的代码中,gridyearField会将过滤器设置为同一数据提供者, 从而覆盖彼此设置的值。请阅读《数据库指南》中的“链接数据提供者”一章,以了解如何对由多个组件设置的多个过滤器进行AND。

  3. 使用private val dataProvider = DataProvider.ofCollection(FinancialTransaction.findAll())时,将从内存中的数据库中加载所有事务。您可以使用内存效率更高的方法:private val dataProvider = FinancialTransaction.dataProvider(假设FinancialTransactionEntity

如果这能回答您的问题,请告诉我。谢谢!