问题描述
我想为 frappe 查询创建一个过滤器,用于查找日期介于 2 个其他日期之间的值。具体来说,工资单 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')]})
现在这行不通,因为字典中有重复的条目。因此,根据 1 和 2,我应该能够使用列表作为过滤器,但可以这样尝试
leave_count = frappe.db.count('Attendance',filters=[
['employee','=',document.get('employee')],['status','Present'],['late_entry',1],['attendance_date','>=','<=',document.get('end_date')]])
TypeError: 只能将 str(不是“list”)连接到 str
快速浏览一下代码说明,当前只支持字典,for 循环需要键而不是列表,并且 between
不是选项,因为该运算符会自动转换为 '=' 并且不会不行。
那我该怎么做?
编辑:目前最简单的方法是使用 frappe.db.get_list 并在 python 中统计结果。虽然这效率低下,但确实有效。
解决方法
您可能希望使用 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]