0

我想为 frappe 查询创建一个过滤器,以查找日期介于两个其他日期之间的值。具体来说,工资单 start_date 和 end_date 应包含出席日期。

doc_name = ##Some Salary Slip
document = frappe.get_doc('Salary Slip', doc_name)

leave_count = frappe.db.count('Attendance', filter={
    'employee': document.get('employee'),
    'status': 'Present',
    'late_entry': 1,
    'attendance_date': ['>=', document.get('start_date')],
    'attendance_date': ['<=', document.get('end_date')]})

现在这将不起作用,因为字典中有重复的条目。因此,按照12,我应该能够使用列表作为过滤器,但是像这样尝试

leave_count = frappe.db.count('Attendance', filters=[
             ['employee', '=', document.get('employee')],
             ['status', '=', 'Present'],
             ['late_entry', '=', 1],
             ['attendance_date', '>=', document.get('start_date')],
             ['attendance_date', '<=', document.get('end_date')]])

但它会引发错误,

TypeError:只能将str(不是“list”)连接到str

快速浏览一下代码解释说,目前只有字典支持需要键而不是列表的 for 循环,并且between不是选项,因为该运算符会自动转换为 '=' 并且不起作用。

那么我该怎么做呢?

编辑:目前最简单的方法是使用 frappe.db.get_list 并在 python 中计算结果。虽然这是低效的,但它确实有效。

4

1 回答 1

0

您可能希望使用frappe.db.sql方法运行原始 SQL 查询。

result = frappe.db.sql("""
SELECT COUNT(*) FROM `tabAttendance`
WHERE
    employee=%(employee)s
    AND status= 'Present'
    AND late_entry= 1,
    attendance_date between %(start_date)s AND %(end_date)s
""", {
    'employee': document.get('employee')
    'start_date' : document.get('start_date')
    'end_date' : document.get('end_date')})
leave_count = result[0][0]
于 2021-06-14T13:24:15.663 回答