Page 1 of 2
DSSendMail only upon the records reject
Posted: Mon Apr 27, 2009 9:28 am
by dsedi
Hi All,
We need to send a mail from the particular JOb if there is any reject records.we have designed like collecting allthe reject records into a sequential file then attaching that file to mail using a after Job subroutine.
The situation is we need to send the mail only if there is any reject records-if there is no rejects then do nothing.
experts- any best approch to accomplish this..
Thanks in advance.
Posted: Mon Apr 27, 2009 9:54 am
by dsuser_cai
modify the shel script, so that it will send the email only if the reject file has any records. May be you can do a count lines (wc -l) to count the number of lines in the file, and if the number of lines is more than 1 (assuming that the first line is column names) then send email else ignor it.
let me know if you need further help.
Posted: Mon Apr 27, 2009 10:25 am
by bbobpop1
Hi,
For the same design, I have developed a routine, which will take the rejected file name and path as arguments.
Then I am checking the record count (wc -l) and if the record count is greater than 1, then I am sending a mail to the user.
Consider, First line in rejected file is column header.
Routine Code:
$IFNDEF JOBCONTROL.H
$INCLUDE DSINCLUDE JOBCONTROL.H
$ENDIF
call DSLogInfo("Routine starting",GetStoreUserStatusValue)
LinkCountUnix = 0
command = "wc -l " :FilePath :FileName
call DSExecute("UNIX",command,LinkCountUnix,ExitStatus)
LinkCountUnix = Field (LinkCountUnix,"/",1,1)
call DSLogInfo("Link Count For " :FileName " is " :LinkCountUnix ,GetStoreUserStatusValue)
If LinkCountUnix = 1
Then
Ans = 0
End
Else
Ans = 1
End
After a job processing, I am calling this routine.
Thanks
Bob
Posted: Mon Apr 27, 2009 12:22 pm
by dsedi
dsuser_cai wrote:modify the shel script, so that it will send the email only if the reject file has any records. May be you can do a count lines (wc -l) to count the number of lines in the file, and if the number of lines is more than 1 (assuming that the first line is column names) then send email else ignor it.
let me know if you need further help.
I wrote a script like this
Code: Select all
#!/bin/sh
ATTFILE=$1 # File to be attached and generally requiring encoding
SUBJECT="Error File attachment" # subject liine
MAILTO=myname@mycompany.com
# Count the number of lines in the file
# The file is sent to wc using cat and a pipe
# because if you say "wc -l $1", you'll get
# the filename in the output also.
numLines=`cat $1 | wc -l`
# Test the number of lines counted
# and issue the desired output
if [ $numLines -gt 1 ]
then
echo "Error File having Data...Sending Email"
uuencode $ATTFILE | mail -s "$SUBJECT" $MAILTO
else
echo "No Data on File"
echo $numLines
cat $1
fi
But I dont see the attachment on output Email .....the process just stops after "Error File having Data...Sending Email" and when i say CTRL C on Unix prompt, it said
Code: Select all
(Interrupt -- one more to kill letter)
Null message body; hope that's ok
and I got a Empty Email with NO attachment.
Please let me know if I am doing something wrong here.
Thanks
Posted: Mon Apr 27, 2009 12:31 pm
by dsedi
bbobpop1 wrote:Hi,
For the same design, I have developed a routine, which will take the rejected file name and path as arguments.
...
..
Thanks
Bob
Bob Thanks very much.
I assumed that u have created a Transform Functions which will take more then one argument(Not before/after subroutine) ..(coz...you have FilePath and FileName in arguement)
and also
Instead of Ans = 0 we have to use the DSSentmail Routine...is that correct?
Thanks.
Posted: Mon Apr 27, 2009 1:48 pm
by bbobpop1
Hi
I tried to use the "DSSentmail Routine", but I guess I am missing some header file to include. And I am not sure which file to add in the routine.
I was checking each file in a loop and if the return code is "1" then I was sending a mail using notification activity.
Thanks
Bob
Posted: Tue Apr 28, 2009 8:27 am
by bbobpop1
Hi
Can you try / test the same routine without "DSSentmail Routine"?
I was also facing the error with "DSSentmail Routine" in my routine
Thanks
Bob
Posted: Tue Apr 28, 2009 8:49 am
by mikegohl
I normally do this in the sequence job using an exec command utility.
Command
! test -s
Parameter
#$DATA_DIR#/outbound/#USVAR_SETUPPARMS.REJECTFILE#
I use the return value <> 0 to control the link to my Notification Activity.
But if you were going to use a routine, I would use the utilities to get the count from the link that writes to the reject file and not a unix utility.
Posted: Tue Apr 28, 2009 9:36 am
by mikegohl
Here is an example of getting the row count without calling a UNIX command:
ACCTREJcount = DSGetLinkInfo( JobHandle, "LKP_Acct", "LINKAcctRejects", DSJ.LINKROWCOUNT )
Posted: Tue Apr 28, 2009 9:44 am
by dsedi
mikegohl wrote:I normally do this in the sequence job using an exec command utility.
Command
! test -s
Parameter
#$DATA_DIR#/outbound/#USVAR_SETUPPARMS.REJECTFILE#
I use the return value <> 0 to control the link to my Notification Activity.
But if you were going to use a routine, I would use the utilities to get the count from the link that writes to the reject file and not a unix utility.
Hi Mike & All,
My design is like this. I have a job performing the lookup and writing the records into a sequential file through the lookup reject link.
I want to sent out an Email only If there is any records exist in the sequential file.
Until now,
I have tried writing a UNIX script to check the line count of the file and call the UNIX mailx functionality
i created a transform function as directed by Bob and used that in a routine activity
NOW, to try your approach, I should have a sequence job. Which contains a job activity (for the job) and then exec command activity.
But what should I have in
#$DATA_DIR#/outbound/#USVAR_SETUPPARMS.REJECTFILE#
I assume
DATA_DIR is the parameter for Sequential file which is having reject records...
I am sorry I am not able to get
#USVAR_SETUPPARMS.REJECTFILE#
Is this the complete PATH for the Sequential file?
Could you elaborate little more on this for the above said design?
Thanks very much.
Posted: Tue Apr 28, 2009 9:50 am
by mikegohl
Sorry for the confusion. The parameter is just the path/filename. I'm using a combination of ENV Variables and User Variable Activity to set the path and name.
Posted: Tue Apr 28, 2009 12:09 pm
by mikegohl
I want a return code of zero when there are no rejects, that is why I use the ! operator. I turn off the "Automatically handle job runs that fail" and control the graceful exit of the program myself.
Posted: Tue Apr 28, 2009 12:44 pm
by mikegohl
mikegohl wrote:I want a return code of zero when there are no rejects, that is why I use the ! operator. I turn off the "Automatically handle job runs that fail" and control the graceful exit of the program myself.
If you don't want to deal with the non zero return code, then use the wc -l command in the execute command activity. It will have a return code of 0 for both empty file and file containing records. You would then need a custom (conditional) expression something like this Field(trim( Execute_Command_5.$CommandOutput) ,' ',1) .
Posted: Tue Apr 28, 2009 12:47 pm
by dsedi
mikegohl wrote:..... I turn off the "Automatically handle job runs that fail" and control the graceful exit of the program myself.
There you go...
![Smile :)](./images/smilies/icon_smile.gif)
That is the Point..I got it...Thanks Mike....Now...It goes well for both the situation.(Data/No data)
Just getting a warning below if there is any data... (I am using ! and <> for control the notification)
Code: Select all
send_mail1..JobControl (@Execute_Command_4): Command ! test -s did not finish OK, reply = '1'
Any advice for this? Thanks in advance.
Posted: Tue Apr 28, 2009 3:44 pm
by dsedi
mikegohl wrote:Here is an example of getting the row count without calling a UNIX command:
ACCTREJcount = DSGetLinkInfo( JobHandle, "LKP_Acct", "LINKAcctRejects", DSJ.LINKROWCOUNT )
Mike,
We are trying to test the scenario with your above suggestion.In the Job sequence, inside the Job activity trigger I have this below code in Custom(Conditional) Expression
Code: Select all
DSGetLinkInfo( Job_Activity_10.$JobName, "Lookup_70", "DsLink93", DSJ.LINKROWCOUNT )
Now, Its not controlling the Notification as we have expected.
From the DSGetLinkInfo help, i Read
Provides a method of obtaining information about a link on an active stage, which can be used generally as well as for job control. This routine may reference either a controlled job or the current job, depending on the value of JobHandle.
Question:
Can I use the DSGetLinkInfo in the Job activity Trigger expression? Or it should be used something like form "Jobbcontrol" ?
Thanks again for your inputs. It was really helpful.