我在将过滤器应用到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文件中获取过滤结果?
答案 0 :(得分:0)
感谢您使用Koadin上的Vaadin!
我刚刚更新了Databases Guide,希望能回答您所有的问题。如果没有,请告诉我,我将相应地更新指南。
ListDataProvider.items
将不应用任何过滤器,并且将始终返回所有项目。
您需要使用getAll()
扩展功能来遵守Grid设置的过滤器。
现在,在《数据库指南》的“从数据提供者导出数据”一章中对此进行了说明。
在您的代码中,grid
和yearField
会将过滤器设置为同一数据提供者,
从而覆盖彼此设置的值。请阅读《数据库指南》中的“链接数据提供者”一章,以了解如何对由多个组件设置的多个过滤器进行AND。
使用private val dataProvider = DataProvider.ofCollection(FinancialTransaction.findAll())
时,将从内存中的数据库中加载所有事务。您可以使用内存效率更高的方法:private val dataProvider = FinancialTransaction.dataProvider
(假设FinancialTransaction
是Entity
)
如果这能回答您的问题,请告诉我。谢谢!