#-> ParamList, string, Enter the process queue in format 'pb:ProcessName:[n/s:ParameterName:ParameterValue:]pe'
#-> ChoreName, string, Enter the chore name (any text)

#MaxParamCount = 3;

VarName1 = '';
VarName2 = '';
VarName3 = '';

VarValue1 = '';
VarValue2 = '';
VarValue3 = '';

VarTypes = '';

DBLogTableName = 'TM1_ProcessLog';

ODBCName = 'test';
DBUserName = 'test';
DBUserPass = 'test';

UserName = TM1User();

SessionID = Round(Rand() * 1000000000);

ServerName = 'CXMD';

ODBCOpen(ODBCName, DBUserName, DBUserPass);

while(ParamList @<> '');
	
	ProcParamCount = 0;
	VarTypes = '';

	ParamName = Subst(ParamList, 1, Scan(':', ParamList) - 1);
	ParamList = Subst(ParamList, Scan(':', ParamList) + 1, Long(ParamList) - Scan(':', ParamList));

	if(ParamName @= 'pb');
		ParamName = Subst(ParamList, 1, Scan(':', ParamList) - 1);
		ParamList = Subst(ParamList, Scan(':', ParamList) + 1, Long(ParamList) - Scan(':', ParamList));

		ProcName = ParamName;

		ParamName = Subst(ParamList, 1, Scan(':', ParamList) - 1);
		ParamList = Subst(ParamList, Scan(':', ParamList) + 1, Long(ParamList) - Scan(':', ParamList));

		while(ParamName @<> 'pe' & ParamList @<> '');

			ParamType = ParamName;
			VarTypes = VarTypes | ParamName;

			if(ParamType @= 'n' % ParamType @= 's');
				ProcParamCount = ProcParamCount + 1;
				
				
				ParamName = Subst(ParamList, 1, Scan(':', ParamList) - 1);
				ParamList = Subst(ParamList, Scan(':', ParamList) + 1, Long(ParamList) - Scan(':', ParamList));

				VarName = ParamName;

				ParamName = Subst(ParamList, 1, Scan(':', ParamList) - 1);
				ParamList = Subst(ParamList, Scan(':', ParamList) + 1, Long(ParamList) - Scan(':', ParamList));

				VarValue = ParamName;

				if(ProcParamCount = 1);
					VarName1 = VarName;
					VarValue1 = VarValue;
						
				elseif(ProcParamCount = 2);
					VarName2 = VarName;
					VarValue2 = VarValue;

				elseif(ProcParamCount = 3);
					VarName3 = VarName;
					VarValue3 = VarValue;

				endif;
			endif;

			ParamName = Subst(ParamList, 1, Scan(':', ParamList) - 1);
			ParamList = Subst(ParamList, Scan(':', ParamList) + 1, Long(ParamList) - Scan(':', ParamList));
		end;
		
		ProcessBeginTime = NOW();

		if(VarTypes @= '');
			ProcExitCode = ExecuteProcess(ProcName);
		elseif(VarTypes @= 's');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1);
		elseif(VarTypes @= 'n');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1));
		elseif(VarTypes @= 'nn');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1), VarName2, StringToNumber(VarValue2));
		elseif(VarTypes @= 'ns');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1), VarName2, VarValue2);
		elseif(VarTypes @= 'sn');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1, VarName2, StringToNumber(VarValue2));
		elseif(VarTypes @= 'ss');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1, VarName2, VarValue2);
		elseif(VarTypes @= 'nnn');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1), VarName2, StringToNumber(VarValue2), VarName3, StringToNumber(VarValue3));
		elseif(VarTypes @= 'snn');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1, VarName2, StringToNumber(VarValue2), VarName3, StringToNumber(VarValue3));
		elseif(VarTypes @= 'nsn');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1), VarName2, VarValue2, VarName3, StringToNumber(VarValue3));
		elseif(VarTypes @= 'ssn');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1, VarName2, VarValue2, VarName3, StringToNumber(VarValue3));
		elseif(VarTypes @= 'nns');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1), VarName2, StringToNumber(VarValue2), VarName3, VarValue3);
		elseif(VarTypes @= 'sns');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1, VarName2, StringToNumber(VarValue2), VarName3, VarValue3);
		elseif(VarTypes @= 'nss');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, StringToNumber(VarValue1), VarName2, VarValue2, VarName3, VarValue3);
		elseif(VarTypes @= 'sss');
			ProcExitCode = ExecuteProcess(ProcName, VarName1, VarValue1, VarName2, VarValue2, VarName3, VarValue3);
		else;
			ProcExitCode = -1;
		endif;

		if(ProcExitCode = ProcessExitNormal());
			Status = 'SUCCESS'; 
		elseif(ProcExitCode = ProcessExitMinorError());
			Status = 'MINOR ERROR';
		elseif(ProcExitCode = ProcessExitSeriousError());
			Status = 'ERROR';
		elseif(ProcExitCode = ProcessExitByChoreQuit());
			Status = 'CHORE QUIT';
		elseif(ProcExitCode = ProcessExitByQuit());
			Status = 'QUIT';
		elseif(ProcExitCode = ProcessExitWithMessage());
			Status = 'MESSAGE';
		elseif(ProcExitCode = ProcessExitOnInit());
			Status = 'EXIT ON INIT';
		elseif(ProcExitCode = ProcessExitByBreak());
			Status = 'BREAK';
		elseif(ProcExitCode = -1);
			Status = 'TOO MANY PARAMETERS';
		else;
			Status = 'UNKNOWN';
		endif;
		
		ProcessEndTime = NOW();
		
		ProcessBeginTimeString =
			NumberToString(TIMVL(ProcessBeginTime, 'Y')) | '-' |
			NumberToString(TIMVL(ProcessBeginTime, 'M')) | '-' |
			NumberToString(TIMVL(ProcessBeginTime, 'D')) | ' ' |
			NumberToString(TIMVL(ProcessBeginTime, 'H')) | ':' |
			NumberToString(TIMVL(ProcessBeginTime, 'I')) | ':' |
			NumberToString(TIMVL(ProcessBeginTime, 'S'));
		
		ProcessEndTimeString =
			NumberToString(TIMVL(ProcessEndTime, 'Y')) | '-' |
			NumberToString(TIMVL(ProcessEndTime, 'M')) | '-' |
			NumberToString(TIMVL(ProcessEndTime, 'D')) | ' ' |
			NumberToString(TIMVL(ProcessEndTime, 'H')) | ':' |
			NumberToString(TIMVL(ProcessEndTime, 'I')) | ':' |
			NumberToString(TIMVL(ProcessEndTime, 'S'));

		SQLScriptHead = 'insert into %DBLogTableName% (ProcessBegin, ProcessEnd, ExecTimeSeconds, ProcessName, ChoreName, ProcessStatus, UserName, SessionID, ServerName)';
		SQLScriptOpenRow = 'values (''%ProcessBeginTimeString%'', ''%ProcessEndTimeString%'', DATEDIFF(second, ''%ProcessBeginTimeString%'', ''%ProcessEndTimeString%''), ''%ProcName%'', ''%ChoreName%'', ''%Status%'', ''%UserName%'', %SessionID%, ''%ServerName%'')';
		ODBCOutPut(ODBCName, Expand(SQLScriptHead | SQLScriptOpenRow));
	
	else;
		ParamList = '';
	endif;
end;

ODBCClose(ODBCName);