问题描述
Cumulative Total =
CALculaTE (
SUM ( Table[Value] ),FILTER (
ALL ( Table[Index] ),Table[Index]
<= MAX ( Table[Index] )
)
)
我正在尝试了解上述公式的逻辑运作方式。
首先计算第二个参数。第二个参数返回一个包含单列的过滤表。
在 FILTER 中,第一个参数从索引列中删除任何过滤器。过滤器的第二个参数检查索引应该小于或等于来自外部表的最大值。
但是 CALculaTEs SUM 是如何累积的? FILTER 是否适用于 SUM 的每条记录?
解决方法
from datetime import *
import time
from tkinter import *
ENTER_EMP_NAME = 'Enter Employee Name'
NUM_EMP_NAMES = 6
EMP_LOG_FILENAME = 'emp_log.txt'
# define GUI
root = Tk()
root.title("Make Communication Record")
root.geometry("550x775")
# Time Stamp Label
day = datetime.today()
hour = time.strftime("%H")
minute = time.strftime("%M")
sec = time.strftime("%S")
f_daydisplay = day.strftime("%A - %B %d,%Y ")
t = f_daydisplay + " " + hour + ":" + minute + ":" + sec
#Refresh clock for time stamp label
def clock():
day = datetime.today()
f_daydisplay = day.strftime("%A - %B %d,%Y at ")
hour = time.strftime("%H")
minute = time.strftime("%M")
sec = time.strftime("%S")
timelab.config(text=f_daydisplay+hour + ":" + minute + ":" + sec)
timelab.after(1000,clock)
#Time stamp label
timelab = Label(root,text="")
timelab.grid(row=13,columnspan=4)
clock()
# Button actions
def onclick(args):
if args == 1: # Submit clicked.
names = [var.get() for var in name_vars if var.get() != ENTER_EMP_NAME]
if not names:
print('No names were filled in,no log file written.')
return
print(f'Saving {len(names)} names to file.')
with open(EMP_LOG_FILENAME,'w') as log_file:
for name in names:
log_file.write(name+'\n')
return
if args == 2: # Reset button clicked.
for entry in name_entries:
entry.delete(0,END) # Delete entire current contents.
entry.insert(0,ENTER_EMP_NAME)
return
# Name entry boxes
name_vars = []
name_entries = []
for i in range(NUM_EMP_NAMES):
name_var = StringVar(value=ENTER_EMP_NAME)
name_vars.append(name_var)
name_entry = Entry(root,width=30,borderwidth=5,textvariable=name_var)
name_entry.grid(row=i+2,column=0,columnspan=1,padx=10,pady=10)
name_entries.append(name_entry)
# Buttons
btn1 = Button(root,text="Submit",width=20,command=lambda: onclick(1))
btn1.grid(row=12,pady=10)
btn2 = Button(root,text="Reset Fields",command=lambda: onclick(2))
btn2.grid(row=12,column=2,pady=10)
root.mainloop()
是迭代器,FILTER
不是。在此公式中,CALCULATE
返回一个具有单列 FILTER
的表,其中包含小于或等于 'Table'[Index]
时存在的过滤器上下文中评估的所有索引 {{1} } 被执行。
当 MAX( 'Table'[Index] )
在 CALCULATE
内被评估时,在上一步评估的过滤表被应用为过滤上下文。这会替换同一列上现有的任何过滤器上下文,但会与其他列上可能存在的其他过滤器组合。
这些过滤器应用于 SUM( 'Table'[Value] )
,只有满足这些条件的行才会被 CALCULATE
迭代。
所以迭代 Table
的不是 SUM
。并且 CALCULATE
迭代 Table
已经被 SUM
修改的过滤器上下文过滤。