Gateway Script Automating Table Insert/Update

Hello all,

I have been working on a scheduled gateway script that will take values from one table and insert them into another table with some additional values in order to automate a "Charge Hours" page where the manager will charge the hours to the different crafts. I will run this script every sunday in order to handle the weekend overtime.

Included below is my script in it's current state and I will talk about it after:

def onScheduledEvent():
	#insert MOS_Signup to HoursChargedHistorical: approved sat to SaturdayOvertime, approved sun to SundayOvertime, denied sat homeshift priority 1 to SaturdayRejected for 10 hours,
	#denied sun homeshift priority 1 to SundayRejected for 10 hours, denied sat offshift priority 1 to SaturdayRejected for 2 hours, denied sun offshift priority 1 to SundayRejected for 2 hours,

	#Variables
	SundayDate = system.tag.readBlocking("[default]MOS/Date End")[0]
	Sunday = SundayDate.value
	SaturdayDate = system.tag.readBlocking("[default]MOS/Saturday Date")[0]
	Saturday = SaturdayDate.value

	#Saturday
	returnedData = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date" :Saturday})
	for row in range(returnedData.getRowCount()):
		Status = returnedData.getValueAt(row, "Status")
		Shift = returnedData.getValueAt(row, "Shift")
		Craft = returnedData.getValueAt(row, "TradeSkill")
		LastName = returnedData.getValueAt(row, "Lname")
		FirstName = returnedData.getValueAt(row, "Fname")
		ClockNumber = returnedData.getValueAt(row, "EID")
		CurrentHours = returnedData.getValueAt(row, "CurrentHours")
		ApprovedShift = returnedData.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData.getValueAt(row, "FirstShift")
		Days = returnedData.getValueAt(row, "SecondShift")
		Afternoons = returnedData.getValueAt(row, "ThirdShift")
		Time = system.date.now()
		Timestamp = system.date.format(Time, "MM/dd/YYYY hh:mm:ss a")
		if Status == 1 and ApprovedShift != 0 and ApprovedSecondShift == 0:
			SaturdayOvertime = 8
			SaturdayRejected = 0
			SundayOvertime = 0
			SundayRejected = 0
			TotalWeekOvertime = SaturdayOvertime
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "Craft" :Craft, "Shift" :Shift, "SaturdayOvertime" :SaturdayOvertime, "SaturdayRejected" :SaturdayRejected, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime, "Timestamp" :Timestamp})
		elif Status == 1 and ApprovedShift != 0 and ApprovedSecondShift != 0:
			SaturdayOvertime = 16
			SaturdayRejected = 0
			SundayOvertime = 0
			SundayRejected = 0
			TotalWeekOvertime = SaturdayOvertime
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "Craft" :Craft, "Shift" :Shift, "SaturdayOvertime" :SaturdayOvertime, "SaturdayRejected" :SaturdayRejected, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime, "Timestamp" :Timestamp})
		elif Status != 1 and (Midnights == 1 and Shift == 1) or (Days == 1 and Shift == 2) or (Afternoons == 1 and Shift == 3) or (Midnights == 4 and Shift == 1) or (Days == 4 and Shift == 2) or (Afternoons == 4 and Shift == 3):
			SaturdayOvertime = 0
			SaturdayRejected = 10
			SundayOvertime = 0
			SundayRejected = 0
			TotalWeekOvertime = SaturdayRejected
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "Craft" :Craft, "Shift" :Shift, "SaturdayOvertime" :SaturdayOvertime, "SaturdayRejected" :SaturdayRejected, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime, "Timestamp" :Timestamp})
		elif Status != 1 and (Midnights == 1 and Shift != 1) or (Days == 1 and Shift != 2) or (Afternoons == 1 and Shift != 3) or (Midnights == 4 and Shift != 1) or (Days == 4 and Shift != 2) or (Afternoons == 4 and Shift != 3):
			SaturdayOvertime = 0
			SaturdayRejected = 2
			SundayOvertime = 0
			SundayRejected = 0
			TotalWeekOvertime = SaturdayRejected
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "Craft" :Craft, "Shift" :Shift, "SaturdayOvertime" :SaturdayOvertime, "SaturdayRejected" :SaturdayRejected, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime, "Timestamp" :Timestamp})
		else:
			SaturdayOvertime = 0
			SaturdayRejected = 0
			SundayOvertime = 0
			SundayRejected = 0
			TotalWeekOvertime = 0
			TotalYearlyOvertime = CurrentHours
			system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "Craft" :Craft, "Shift" :Shift, "SaturdayOvertime" :SaturdayOvertime, "SaturdayRejected" :SaturdayRejected, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime, "Timestamp" :Timestamp})

	#Sunday (needs edited)
	returnedData1 = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date" :Sunday})
	for row in range(returnedData1.getRowCount()):
		Status = returnedData1.getValueAt(row, "Status")
		Shift = returnedData1.getValueAt(row, "Shift")
		LastName = returnedData1.getValueAt(row, "Lname")
		FirstName = returnedData1.getValueAt(row, "Fname")
		ClockNumber = returnedData1.getValueAt(row, "EID")
		CurrentHours = returnedData1.getValueAt(row, "CurrentHours") #Watch this, make sure it is new current after saturday instead of before
		ApprovedShift = returnedData1.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData1.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData1.getValueAt(row, "FirstShift")
		Days = returnedData1.getValueAt(row, "SecondShift")
		Afternoons = returnedData1.getValueAt(row, "ThirdShift")
		if Status == 1 and ApprovedShift != 0 and ApprovedSecondShift == 0:
			SundayOvertime = 8
			SundayRejected = 0
			TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayOvertime
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime})
		elif Status == 1 and ApprovedShift != 0 and ApprovedSecondShift != 0:
			SundayOvertime = 16
			SundayRejected = 0
			TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayOvertime
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime})
		elif Status != 1 and (Midnights == 1 and Shift == 1) or (Days == 1 and Shift == 2) or (Afternoons == 1 and Shift == 3) or (Midnights == 4 and Shift == 1) or (Days == 4 and Shift == 2) or (Afternoons == 4 and Shift == 3):
			SundayOvertime = 0
			SundayRejected = 10
			TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayRejected
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime})
		elif Status != 1 and (Midnights == 1 and Shift != 1) or (Days == 1 and Shift != 2) or (Afternoons == 1 and Shift != 3) or (Midnights == 4 and Shift != 1) or (Days == 4 and Shift != 2) or (Afternoons == 4 and Shift != 3):
			SundayOvertime = 0
			SundayRejected = 2
			TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayRejected
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime})
		else:
			SundayOvertime = 0
			SundayRejected = 0
			TotalWeekOvertime = SaturdayOvertime + SaturdayRejected
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update", {"OvertimeWeek" :Saturday, "ClockNumber" :ClockNumber, "LastName" :LastName, "FirstName" :FirstName, "SundayOvertime" :SundayOvertime, "SundayRejected" :SundayRejected, "TotalWeekOvertime" :TotalWeekOvertime, "TotalYearlyOvertime" :TotalYearlyOvertime})

So, the way the script works is it takes all values from a signup table and awards hours as follows:
Signed up and accepted for 1 shift = 8 hours, signed up and accepted for 2 shifts = 16 hours, signed up and rejected for their home shift = 10 hours and signed up and rejected for an off shift = 2 hours. These variables would be: Status for accepted - 1 being accepted and 2 being denied, ApprovedShift being anything but 0 is approved, approvedsecondshift being anything but 0 is approved. The script loops through these signups looking at these values and then inserts it into a charge hours table with the awarded hours.

The script works well for inserting the values for Saturday through the first for loop. It also works well with the updating of already existing records Sunday values (with the exception of the TotalWeekOvertime showing 10 for some reason when there is a 2 in SaturdayRejected and a 2 in SundayRejected, should be 4...).

What I need is to figure out how to add new records for employees who signed up for sunday and didn't sign up for saturday. I have a sunday insert query, a count query and a saturday info query that pulls the SaturdayOvertime and SaturdayRejected values from the table based on clocknumber. I was trying to fit these into the second for loop somewhere but couldn't seem to figure it out. Here are the queries I have in SQL.

Overtime/Charge Hours/Info:
SELECT Status, Shift, Lname, Fname, EID, CurrentHours, ApprovedShift, ApprovedSecondShift, FirstShift, SecondShift, ThirdShift, TradeSkill
FROM [Maintenance].[dbo].[MOS_Signup]
WHERE DateTime = :Date

Overtime/Charge Hours/Saturday Insert
INSERT INTO [Maintenance].[dbo].[MOS_HoursChargedHistorical] (OvertimeWeek, ClockNumber, LastName, FirstName, Craft, Shift, WeeklyOvertime, SaturdayOvertime, SaturdayRejected, SundayOvertime, SundayRejected, TotalWeekOvertime, TotalYearlyOvertime, Username, ChargeTimestamp)
VALUES (:OvertimeWeek, :ClockNumber, :LastName, :FirstName, :Craft, :Shift, 0, :SaturdayOvertime, :SaturdayRejected, :SundayOvertime, :SundayRejected, :TotalWeekOvertime, :TotalYearlyOvertime, 'AUTO', :Timestamp)

Overtime/Charge Hours/Sunday Update
UPDATE [Maintenance].[dbo].[MOS_HoursChargedHistorical] 
SET SundayOvertime = :SundayOvertime, SundayRejected = :SundayRejected, TotalWeekOvertime = :TotalWeekOvertime, TotalYearlyOvertime = :TotalYearlyOvertime
WHERE FirstName = :FirstName and LastName = :LastName and ClockNumber = :ClockNumber and OvertimeWeek = :OvertimeWeek

Overtime/Charge Hours/Saturday Count
SELECT COUNT(ClockNumber)
FROM [Maintenance].[dbo].[MOS_HoursChargedHistorical]
WHERE OvertimeWeek = :Date and ClockNumber = :ClockNumber

Overtime/Charge Hours/Saturday Info
SELECT SaturdayOvertime, SaturdayRejected
FROM [Maintenance].[dbo].[MOS_HoursChargedHistorical]
WHERE OvertimeWeek = :Date and ClockNumber = :ClockNumber

Overtime/Charge Hours/Sunday Insert
INSERT INTO [Maintenance].[dbo].[MOS_HoursChargedHistorical] (OvertimeWeek, ClockNumber, LastName, FirstName, Craft, Shift, WeeklyOvertime, SaturdayOvertime, SaturdayRejected, SundayOvertime, SundayRejected, TotalWeekOvertime, TotalYearlyOvertime, Username, ChargeTimestamp)
VALUES (:OvertimeWeek, :ClockNumber, :LastName, :FirstName, :Craft, :Shift, 0, 0, 0, :SundayOvertime, :SundayRejected, :TotalWeekOvertime, :TotalYearlyOvertime, 'AUTO', :Timestamp)

Not a solution to your problem (actually I don't know what the problem is yet, I'll get to that later), but I have questions.

  1. The last part of the script is
TotalWeekOvertime = SaturdayOvertime + SaturdayRejected
TotalYearlyOvertime = CurrentHours

Why isn't the total week overtime added to the yearly overtime, like it is in every other cases ?

  1. In the sunday loop, you use this:
TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayOvertime

But SaturdayOvertime and SaturdayRejected are not defined anywhere in this scope.
What do you expect this line to do ?

1 Like

You're right on the adding on the last part of the script, I added that. The SaturdayOvertime and SaturdayRejected I haven't quite found out how to do yet. I need to grab them with the Saturday Info query and match them via clock number. I'm struggling with figuring out how to loop all of this together.

I hate to rewrite other peoples code but you really need some help there... I rewrote the Sunday loop with a params dictionary you can pass into your named query.

def onScheduledEvent():
	#insert MOS_Signup to HoursChargedHistorical: approved sat to SaturdayOvertime, approved sun to SundayOvertime, denied sat homeshift priority 1 to SaturdayRejected for 10 hours,
	#denied sun homeshift priority 1 to SundayRejected for 10 hours, denied sat offshift priority 1 to SaturdayRejected for 2 hours, denied sun offshift priority 1 to SundayRejected for 2 hours,

	#Variables
	SundayDate = system.tag.readBlocking("[default]MOS/Date End")[0]
	Sunday = SundayDate.value
	SaturdayDate = system.tag.readBlocking("[default]MOS/Saturday Date")[0]
	Saturday = SaturdayDate.value
	
	params = {}
	params['Timestamp'] = system.date.format(system.date.now(), "MM/dd/YYYY hh:mm:ss a")

	#Saturday
	ds = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date" :Saturday})
	for row in range(ds.getRowCount()):
		#Unpack basic dataset into parameters for each row returned.
		params['Status'] = 				returnedData.getValueAt(row, "Status")
		params['Shift'] = 				returnedData.getValueAt(row, "Shift")
		params['TradeSkill'] = 			returnedData.getValueAt(row, "TradeSkill")
		params['Lname'] = 				returnedData.getValueAt(row, "Lname")
		params['Fname'] = 				returnedData.getValueAt(row, "Fname")
		params['EID'] = 				returnedData.getValueAt(row, "EID")
		params['CurrentHours'] = 		returnedData.getValueAt(row, "CurrentHours")
		params['ApprovedShift'] = 		returnedData.getValueAt(row, "ApprovedShift")
		params['ApprovedSecondShift'] = returnedData.getValueAt(row, "ApprovedSecondShift")
		params['FirstShift']= 			returnedData.getValueAt(row, "FirstShift")
		params['SecondShift'] = 		returnedData.getValueAt(row, "SecondShift")
		params['ThirdShift'] = 			returnedData.getValueAt(row, "ThirdShift")
		
		if Status == 1 and ApprovedShift != 0 and ApprovedSecondShift == 0:
			params['SaturdayOvertime'] = 8
			params['SaturdayRejected'] = 0
			params['SundayOvertime'] = 0
			params['SundayRejected']= 0
			params['TotalWeekOvertime'] = SaturdayOvertime
			params['TotalYearlyOvertime'] = CurrentHours + TotalWeekOvertime
		elif Status == 1 and ApprovedShift != 0 and ApprovedSecondShift != 0:
			params['SaturdayOvertime'] = 16
			params['SaturdayRejected'] = 0
			params['SundayOvertime'] = 0
			params['SundayRejected']= 0
			params['TotalWeekOvertime'] = SaturdayOvertime
			params['TotalYearlyOvertime'] = CurrentHours + TotalWeekOvertime
		elif Status != 1 and (FirstShift == 1 and Shift == 1) or (SecondShift == 1 and Shift == 2) or (ThirdShift == 1 and Shift == 3) or (FirstShift == 4 and Shift == 1) or (SecondShift == 4 and Shift == 2) or (SecondShift == 4 and Shift == 3):
			params['SaturdayOvertime'] = 0
			params['SaturdayRejected'] = 10
			params['SundayOvertime'] = 0
			params['SundayRejected']= 0
			params['TotalWeekOvertime'] = SaturdayRejected
			params['TotalYearlyOvertime'] = CurrentHours + TotalWeekOvertime
		elif Status != 1 and (FirstShift == 1 and Shift != 1) or (SecondShift == 1 and Shift != 2) or (SecondShift == 1 and Shift != 3) or (FirstShift == 4 and Shift != 1) or (SecondShift == 4 and Shift != 2) or (SecondShift == 4 and Shift != 3):
			params['SaturdayOvertime'] = 0
			params['SaturdayRejected'] = 2
			params['SundayOvertime'] = 0
			params['SundayRejected']= 0
			params['TotalWeekOvertime'] = SaturdayRejected
			params['TotalYearlyOvertime'] = CurrentHours + TotalWeekOvertime
		else:
			params['SaturdayOvertime'] = 0
			params['SaturdayRejected'] = 0
			params['SundayOvertime'] = 0
			params['SundayRejected']= 0
			params['TotalWeekOvertime'] = 0
			params['TotalYearlyOvertime'] = CurrentHours + TotalWeekOvertime

		system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert", params)

Don't worry, I love it.
I already rewrote most of it, but there were things that needed some clarification before going further.

Frankly I feel like most of all of this should be handled by queries, but I don't understand the goal well enough.

Here's a first draft of a rewrite that should make it a bit more readable.

def onScheduledEvent():
	#insert MOS_Signup to HoursChargedHistorical: approved sat to SaturdayOvertime, approved sun to SundayOvertime, denied sat homeshift priority 1 to SaturdayRejected for 10 hours,
	#denied sun homeshift priority 1 to SundayRejected for 10 hours, denied sat offshift priority 1 to SaturdayRejected for 2 hours, denied sun offshift priority 1 to SundayRejected for 2 hours,

	#Variables
	Sunday, Saturday = [qval.value for qval in system.tag.readBlocking(["[default]MOS/Date End", "[default]MOS/Saturday Date"])]

	Time = system.date.now()
	Timestamp = system.date.format(Time, "MM/dd/YYYY hh:mm:ss a")
	
	#Saturday
	returnedData = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date": Saturday})
	for row in range(returnedData.getRowCount()):
		Status = returnedData.getValueAt(row, "Status")
		Shift = returnedData.getValueAt(row, "Shift")
		Craft = returnedData.getValueAt(row, "TradeSkill")
		LastName = returnedData.getValueAt(row, "Lname")
		FirstName = returnedData.getValueAt(row, "Fname")
		ClockNumber = returnedData.getValueAt(row, "EID")
		CurrentHours = returnedData.getValueAt(row, "CurrentHours")
		ApprovedShift = returnedData.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData.getValueAt(row, "FirstShift")
		Days = returnedData.getValueAt(row, "SecondShift")
		Afternoons = returnedData.getValueAt(row, "ThirdShift")
		
		SundayOvertime, SundayRejected, SaturdayOvertime, SaturdayRejected, TotalWeekOvertime = 0
		if Status == 1 and ApprovedShift != 0:
			SaturdayOvertime = 8 if ApprovedSecondShift == 0 else 16
		elif Status != 1 and (Midnights in [1, 4] and Shift == 1) or (Days in [1, 4] and Shift == 2) or (Afternoons in [1, 4] and Shift == 3):
			SaturdayRejected = 10
		elif Status != 1 and (Midnights in [1, 4] and Shift != 1) or (Days in [1, 4] and Shift != 2) or (Afternoons in [1, 4] and Shift != 3):
			SaturdayRejected = 2
		
		TotalWeekOvertime = SaturdayRejected + SaturdayOvertime
		TotalYearlyOvertime = CurrentHours + TotalWeekOvertime

		system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert",
			{
				"OvertimeWeek": Saturday,
				"ClockNumber": ClockNumber,
				"LastName": LastName,
				"FirstName": FirstName,
				"Craft": Craft,
				"Shift": Shift,
				"SaturdayOvertime": SaturdayOvertime,
				"SaturdayRejected": SaturdayRejected,
				"SundayOvertime": SundayOvertime,
				"SundayRejected": SundayRejected,
				"TotalWeekOvertime": TotalWeekOvertime,
				"TotalYearlyOvertime": TotalYearlyOvertime,
				"Timestamp": Timestamp
			}
		)

	#Sunday (needs edited)
	returnedData1 = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date": Sunday})
	for row in range(returnedData1.getRowCount()):
		Status = returnedData1.getValueAt(row, "Status")
		Shift = returnedData1.getValueAt(row, "Shift")
		LastName = returnedData1.getValueAt(row, "Lname")
		FirstName = returnedData1.getValueAt(row, "Fname")
		ClockNumber = returnedData1.getValueAt(row, "EID")
		CurrentHours = returnedData1.getValueAt(row, "CurrentHours") #Watch this, make sure it is new current after saturday instead of before
		ApprovedShift = returnedData1.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData1.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData1.getValueAt(row, "FirstShift")
		Days = returnedData1.getValueAt(row, "SecondShift")
		Afternoons = returnedData1.getValueAt(row, "ThirdShift")
		
		SundayRejected, SundayOvertime = 0
		if Status == 1 and ApprovedShift != 0:
			SundayOvertime = 8 if ApprovedSecondShift == 0 else 16
		elif Status != 1 and (Midnights in [1, 4] and Shift == 1) or (Days in [1, 4] and Shift == 2) or (Afternoons in [1, 4] and Shift == 3):
			SundayRejected = 10
		elif Status != 1 and (Midnights in [1, 4] and Shift != 1) or (Days in [1, 4] and Shift != 2) or (Afternoons in [1, 4] and Shift != 3):
			SundayRejected = 2

		TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayRejected
		TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
		
		system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update",
			{
				"OvertimeWeek": Saturday,
				"ClockNumber": ClockNumber,
				"LastName": LastName,
				"FirstName": FirstName,
				"SundayOvertime": SundayOvertime,
				"SundayRejected": SundayRejected,
				"TotalWeekOvertime": TotalWeekOvertime,
				"TotalYearlyOvertime": TotalYearlyOvertime
			}
		)

I'm still trying to figure out how most things work together, we'll make things pretty later.

2 Likes

Wow, definitely shortened it up with shorthand code! Thank you for that, it looks much neater. So, essentially what my script is missing is the ability to check if an employee already exists in the MOS_HoursChargedHistorical (if they were added for signing up for saturday using the Saturday Count query I have made). If they are, good, just run that update query. If they aren't, insert them with the same type of query as Saturdays' Saturday Insert query. I've tried throwing the count query into the loop and run into problems.

So I try something like this, it works but it doesn't hit that sunday insert, just hits the sunday update.

def onScheduledEvent():
	#insert MOS_Signup to HoursChargedHistorical: approved sat to SaturdayOvertime, approved sun to SundayOvertime, denied sat homeshift priority 1 to SaturdayRejected for 10 hours,
	#denied sun homeshift priority 1 to SundayRejected for 10 hours, denied sat offshift priority 1 to SaturdayRejected for 2 hours, denied sun offshift priority 1 to SundayRejected for 2 hours,

	#Variables
	Sunday, Saturday = [qval.value for qval in system.tag.readBlocking(["[default]MOS/Date End", "[default]MOS/Saturday Date"])]

	Time = system.date.now()
	Timestamp = system.date.format(Time, "MM/dd/YYYY hh:mm:ss a")
	
	#Saturday
	returnedData = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date": Saturday})
	for row in range(returnedData.getRowCount()):
		Status = returnedData.getValueAt(row, "Status")
		Shift = returnedData.getValueAt(row, "Shift")
		Craft = returnedData.getValueAt(row, "TradeSkill")
		LastName = returnedData.getValueAt(row, "Lname")
		FirstName = returnedData.getValueAt(row, "Fname")
		ClockNumber = returnedData.getValueAt(row, "EID")
		CurrentHours = returnedData.getValueAt(row, "CurrentHours")
		ApprovedShift = returnedData.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData.getValueAt(row, "FirstShift")
		Days = returnedData.getValueAt(row, "SecondShift")
		Afternoons = returnedData.getValueAt(row, "ThirdShift")

		SundayOvertime = 0
		SundayRejected = 0
		SaturdayOvertime = 0
		SaturdayRejected = 0
		TotalWeekOvertime = 0
		if Status == 1 and ApprovedShift != 0:
			SaturdayOvertime = 8 if ApprovedSecondShift == 0 else 16
		elif Status != 1 and (Midnights in [1, 4] and Shift == 1) or (Days in [1, 4] and Shift == 2) or (Afternoons in [1, 4] and Shift == 3):
			SaturdayRejected = 10
		elif Status != 1 and (Midnights in [1, 4] and Shift != 1) or (Days in [1, 4] and Shift != 2) or (Afternoons in [1, 4] and Shift != 3):
			SaturdayRejected = 2

		TotalWeekOvertime = SaturdayRejected + SaturdayOvertime
		TotalYearlyOvertime = CurrentHours + TotalWeekOvertime

		system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert",
			{
				"OvertimeWeek": Saturday,
				"ClockNumber": ClockNumber,
				"LastName": LastName,
				"FirstName": FirstName,
				"Craft": Craft,
				"Shift": Shift,
				"SaturdayOvertime": SaturdayOvertime,
				"SaturdayRejected": SaturdayRejected,
				"SundayOvertime": SundayOvertime,
				"SundayRejected": SundayRejected,
				"TotalWeekOvertime": TotalWeekOvertime,
				"TotalYearlyOvertime": TotalYearlyOvertime,
				"Timestamp": Timestamp
			}
		)

	#Sunday (needs edited)
	returnedData1 = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date": Sunday})
	counts = system.db.runNamedQuery("Overtime/Charge Hours/Saturday Count", {"Date" :Saturday, "ClockNumber" :ClockNumber})
	for row in range(returnedData1.getRowCount()):
		Status = returnedData1.getValueAt(row, "Status")
		Shift = returnedData1.getValueAt(row, "Shift")
		LastName = returnedData1.getValueAt(row, "Lname")
		FirstName = returnedData1.getValueAt(row, "Fname")
		ClockNumber = returnedData1.getValueAt(row, "EID")
		CurrentHours = returnedData1.getValueAt(row, "CurrentHours") #Watch this, make sure it is new current after saturday instead of before
		ApprovedShift = returnedData1.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData1.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData1.getValueAt(row, "FirstShift")
		Days = returnedData1.getValueAt(row, "SecondShift")
		Afternoons = returnedData1.getValueAt(row, "ThirdShift")
		SundayRejected = 0
		SundayOvertime = 0
		if Status == 1 and ApprovedShift != 0:
			SundayOvertime = 8 if ApprovedSecondShift == 0 else 16
		elif Status != 1 and (Midnights in [1, 4] and Shift == 1) or (Days in [1, 4] and Shift == 2) or (Afternoons in [1, 4] and Shift == 3):
			SundayRejected = 10
		elif Status != 1 and (Midnights in [1, 4] and Shift != 1) or (Days in [1, 4] and Shift != 2) or (Afternoons in [1, 4] and Shift != 3):
			SundayRejected = 2

		TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayOvertime + SundayRejected
		TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
		for row in range(counts.getRowCount()):
			count = counts.getValueAt(row, "Count")
			if count < 1:
				system.db.runNamedQuery("Overtime/Charge Hours/Sunday Insert",
				{
					"OvertimeWeek": Saturday,
					"ClockNumber": ClockNumber,
					"LastName": LastName,
					"FirstName": FirstName,
					"Craft": Craft,
					"Shift": Shift,
					"SaturdayOvertime": SaturdayOvertime,
					"SaturdayRejected": SaturdayRejected,
					"SundayOvertime": SundayOvertime,
					"SundayRejected": SundayRejected,
					"TotalWeekOvertime": TotalWeekOvertime,
					"TotalYearlyOvertime": TotalYearlyOvertime,
					"Timestamp": Timestamp
				}
			)
			else:
				system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update",
				{
					"OvertimeWeek": Saturday,
					"ClockNumber": ClockNumber,
					"LastName": LastName,
					"FirstName": FirstName,
					"SundayOvertime": SundayOvertime,
					"SundayRejected": SundayRejected,
					"TotalWeekOvertime": TotalWeekOvertime,
					"TotalYearlyOvertime": TotalYearlyOvertime
				}
			)

You're still using variables that don't exist:
TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayOvertime + SundayRejected

I'm willing to bet that if you checked the logs you'd find a NameError: SaturdayOvertime is not defined

Surprising enough, no error. Not sure what it's grabbing. I don't think that would effect my count idea but I do also need to implement a loop to grab those values as well.

Actually it keeps the last value from the saturday loop.

So it'd be something along these lines (though this still returns the same as without it)

def onScheduledEvent():
	#insert MOS_Signup to HoursChargedHistorical: approved sat to SaturdayOvertime, approved sun to SundayOvertime, denied sat homeshift priority 1 to SaturdayRejected for 10 hours,
	#denied sun homeshift priority 1 to SundayRejected for 10 hours, denied sat offshift priority 1 to SaturdayRejected for 2 hours, denied sun offshift priority 1 to SundayRejected for 2 hours,

	#Variables
	Sunday, Saturday = [qval.value for qval in system.tag.readBlocking(["[default]MOS/Date End", "[default]MOS/Saturday Date"])]

	Time = system.date.now()
	Timestamp = system.date.format(Time, "MM/dd/YYYY hh:mm:ss a")
	
	#Saturday
	returnedData = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date": Saturday})
	for row in range(returnedData.getRowCount()):
		Status = returnedData.getValueAt(row, "Status")
		Shift = returnedData.getValueAt(row, "Shift")
		Craft = returnedData.getValueAt(row, "TradeSkill")
		LastName = returnedData.getValueAt(row, "Lname")
		FirstName = returnedData.getValueAt(row, "Fname")
		ClockNumber = returnedData.getValueAt(row, "EID")
		CurrentHours = returnedData.getValueAt(row, "CurrentHours")
		ApprovedShift = returnedData.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData.getValueAt(row, "FirstShift")
		Days = returnedData.getValueAt(row, "SecondShift")
		Afternoons = returnedData.getValueAt(row, "ThirdShift")

		SundayOvertime = 0
		SundayRejected = 0
		SaturdayOvertime = 0
		SaturdayRejected = 0
		TotalWeekOvertime = 0
		if Status == 1 and ApprovedShift != 0:
			SaturdayOvertime = 8 if ApprovedSecondShift == 0 else 16
		elif Status != 1 and (Midnights in [1, 4] and Shift == 1) or (Days in [1, 4] and Shift == 2) or (Afternoons in [1, 4] and Shift == 3):
			SaturdayRejected = 10
		elif Status != 1 and (Midnights in [1, 4] and Shift != 1) or (Days in [1, 4] and Shift != 2) or (Afternoons in [1, 4] and Shift != 3):
			SaturdayRejected = 2

		TotalWeekOvertime = SaturdayRejected + SaturdayOvertime
		TotalYearlyOvertime = CurrentHours + TotalWeekOvertime

		system.db.runNamedQuery("Overtime/Charge Hours/Saturday Insert",
			{
				"OvertimeWeek": Saturday,
				"ClockNumber": ClockNumber,
				"LastName": LastName,
				"FirstName": FirstName,
				"Craft": Craft,
				"Shift": Shift,
				"SaturdayOvertime": SaturdayOvertime,
				"SaturdayRejected": SaturdayRejected,
				"SundayOvertime": SundayOvertime,
				"SundayRejected": SundayRejected,
				"TotalWeekOvertime": TotalWeekOvertime,
				"TotalYearlyOvertime": TotalYearlyOvertime,
				"Timestamp": Timestamp
			}
		)

	#Sunday (needs edited)
	returnedData1 = system.db.runNamedQuery("Overtime/Charge Hours/Info", {"Date": Sunday})
	counts = system.db.runNamedQuery("Overtime/Charge Hours/Saturday Count", {"Date" :Saturday, "ClockNumber" :ClockNumber})
	saturdayInfo = system.db.runNamedQuery("Overtime/Charge Hours/Saturday Info", {"Date" :Saturday, "ClockNumber" :ClockNumber})
	for row in range(returnedData1.getRowCount()):
		Status = returnedData1.getValueAt(row, "Status")
		Shift = returnedData1.getValueAt(row, "Shift")
		LastName = returnedData1.getValueAt(row, "Lname")
		FirstName = returnedData1.getValueAt(row, "Fname")
		ClockNumber = returnedData1.getValueAt(row, "EID")
		CurrentHours = returnedData1.getValueAt(row, "CurrentHours") #Watch this, make sure it is new current after saturday instead of before
		ApprovedShift = returnedData1.getValueAt(row, "ApprovedShift")
		ApprovedSecondShift = returnedData1.getValueAt(row, "ApprovedSecondShift")
		Midnights = returnedData1.getValueAt(row, "FirstShift")
		Days = returnedData1.getValueAt(row, "SecondShift")
		Afternoons = returnedData1.getValueAt(row, "ThirdShift")
		SundayRejected = 0
		SundayOvertime = 0
		if Status == 1 and ApprovedShift != 0:
			SundayOvertime = 8 if ApprovedSecondShift == 0 else 16
		elif Status != 1 and (Midnights in [1, 4] and Shift == 1) or (Days in [1, 4] and Shift == 2) or (Afternoons in [1, 4] and Shift == 3):
			SundayRejected = 10
		elif Status != 1 and (Midnights in [1, 4] and Shift != 1) or (Days in [1, 4] and Shift != 2) or (Afternoons in [1, 4] and Shift != 3):
			SundayRejected = 2
		for row in range(saturdayInfo.getRowCount()):
			SaturdayOvertime = saturdayInfo.getValueAt(row, "SaturdayOvertime")
			SaturdayRejected = saturdayInfo.getValueAt(row, "SaturdayRejected")
			TotalWeekOvertime = SaturdayOvertime + SaturdayRejected + SundayOvertime + SundayRejected
			TotalYearlyOvertime = CurrentHours + TotalWeekOvertime
			for row in range(counts.getRowCount()):
				count = counts.getValueAt(row, "Count")
				if count < 1:
					system.db.runNamedQuery("Overtime/Charge Hours/Sunday Insert",
					{
						"OvertimeWeek": Saturday,
						"ClockNumber": ClockNumber,
						"LastName": LastName,
						"FirstName": FirstName,
						"Craft": Craft,
						"Shift": Shift,
						"SaturdayOvertime": SaturdayOvertime,
						"SaturdayRejected": SaturdayRejected,
						"SundayOvertime": SundayOvertime,
						"SundayRejected": SundayRejected,
						"TotalWeekOvertime": TotalWeekOvertime,
						"TotalYearlyOvertime": TotalYearlyOvertime,
						"Timestamp": Timestamp
					}
				)
				else:
					system.db.runNamedQuery("Overtime/Charge Hours/Sunday Update",
					{
						"OvertimeWeek": Saturday,
						"ClockNumber": ClockNumber,
						"LastName": LastName,
						"FirstName": FirstName,
						"SundayOvertime": SundayOvertime,
						"SundayRejected": SundayRejected,
						"TotalWeekOvertime": TotalWeekOvertime,
						"TotalYearlyOvertime": TotalYearlyOvertime
					}
				)

Wondering if what I have to do would be swap the last for loop to first and the first one to the nested? I'm not too good with nested for loops.

No, what you need is to establish clearly what data you need and where it is.
To do that, you first need to clearly establish what is the desired output and what data you have available.

We know nothing of your database architecture and what's inside, so it's near impossible for us to figure out what you should do.
For example, the right set of queries might solve most of your problems.