E-mail sending background job diappeared in the system
Hello Gurus,
We have one e-mail sending job in our production system. The frequency of the job is daily. Now we are not able to find the sheduled/Released/Active/Finished/Canceled status for this from the last 2 days.
Please help me to get back the job in the system.
Thanks in advance.
Thanks & Regards,
ASk
Hi,
Logon to the client from which the mails should be send, go to TA SCOT then choose menu: view -> jobs, you can also reschedule if required.
Or check via utilities when the mails were sent.
Similar Messages
-
Any Report to find out all the jobs details in the system??
Hi,
My query: Is there any Report where I can get all the background jobs scheduled in a system with client info, frequency, program name, variant name and execution user. I know these information is stored in various tables but I want to get a consolidated view through a Report.
Thanks,
JavedYou can see them in SM37 of course but tables TBTCO and TBTCP cointain the info you're looking for
Regards
Juan -
Dear All,
We have a background job, which will execute a z program. The out put of Z program will be sent as a mail to the recipient listed in "Spool list recipient" (SM36).
We did unicode conversion and upgrade to ecc 6.0.
Even now background job send the out put to mail, but when we open the attached html file in the mail which contains the out put, it displaying with junk characters.
Out put looks like " æ¼â¾â¼¼ã¹¢â¼¼æ½¦ç®ã° "
Your help will be highly appriciated.
Thanks and regards
Josephhi check this...
Save Report Output to a PDF File
This report takes another report as input, and captures the output of that report. The output is then converted to PDF and saved to a local file. This shows how to use some of the PDF function modules, as well as an easy way to create PDF files.
One thing I am not thrilled about is how the spool number is retrieved. If anyone has any better method, please let me know! Until I actually have a production use for a program like this, I will not try to find a better way.
Source Code Listing
report zabap_2_pdf.
*-- Enhancements: only allow to be run with variant. Then called
*-- program will be transparent to users
*-- TABLES
tables:
tsp01.
*-- STRUCTURES
data:
mstr_print_parms like pri_params,
mc_valid(1) type c,
mi_bytecount type i,
mi_length type i,
mi_rqident like tsp01-rqident.
*-- INTERNAL TABLES
data:
mtab_pdf like tline occurs 0 with header line,
mc_filename like rlgrap-filename.
*-- SELECTION SCREEN
parameters:
p_repid like sy-repid, " Report to execute
p_linsz like sy-linsz default 132, " Line size
p_paart like sy-paart default 'X_65_132'. " Paper Format
start-of-selection.
concatenate 'c:\'
p_repid
'.pdf'
into mc_filename.
*-- Setup the Print Parmaters
call function 'GET_PRINT_PARAMETERS'
exporting
authority= space
copies = '1'
cover_page = space
data_set = space
department = space
destination = space
expiration = '1'
immediately = space
in_archive_parameters = space
in_parameters = space
layout = space
mode = space
new_list_id = 'X'
no_dialog= 'X'
user = sy-uname
importing
out_parameters = mstr_print_parms
valid = mc_valid
exceptions
archive_info_not_found = 1
invalid_print_params = 2
invalid_archive_params = 3
others = 4.
*-- Make sure that a printer destination has been set up
*-- If this is not done the PDF function module ABENDS
if mstr_print_parms-pdest = space.
mstr_print_parms-pdest = 'LOCL'.
endif.
*-- Explicitly set line width, and output format so that
*-- the PDF conversion comes out OK
mstr_print_parms-linsz = p_linsz.
mstr_print_parms-paart = p_paart.
submit (p_repid) to sap-spool without spool dynpro
spool parameters mstr_print_parms
via selection-screen
and return.
*-- Find out what the spool number is that was just created
perform get_spool_number using sy-repid
sy-uname
changing mi_rqident.
*-- Convert Spool to PDF
call function 'CONVERT_ABAPSPOOLJOB_2_PDF'
exporting
src_spoolid= mi_rqident
no_dialog = space
dst_device = mstr_print_parms-pdest
importing
pdf_bytecount = mi_bytecount
tables
pdf = mtab_pdf
exceptions
err_no_abap_spooljob = 1
err_no_spooljob = 2
err_no_permission = 3
err_conv_not_possible = 4
err_bad_destdevice = 5
user_cancelled = 6
err_spoolerror = 7
err_temseerror = 8
err_btcjob_open_failed = 9
err_btcjob_submit_failed = 10
err_btcjob_close_failed = 11
others = 12.
call function 'DOWNLOAD'
exporting
bin_filesize = mi_bytecount
filename = mc_filename
filetype = 'BIN'
importing
act_filename = mc_filename
tables
data_tab = mtab_pdf.
FORM get_spool_number *
Get the most recent spool created by user/report *
--> F_REPID *
--> F_UNAME *
--> F_RQIDENT *
form get_spool_number using f_repid
f_uname
changing f_rqident.
data:
lc_rq2name like tsp01-rq2name.
concatenate f_repid+0(8)
f_uname+0(3)
into lc_rq2name separated by '_'.
select * from tsp01 where rq2name = lc_rq2name
order by rqcretime descending.
f_rqident = tsp01-rqident.
exit.
endselect.
if sy-subrc ne 0.
clear f_rqident.
endif.
endform." get_spool_number
regards,
venkat . -
Hi Experts,
I have faced one problem in Mail Triggering. to the User.
Our Requirement is,
Whenever we execute one report ( ALV output) in Background , The Output should go the user thro mail ( automatic Mail trigger when the background Job is finished)
if anybody knows, plz guide me to do it.
With Regards,
Mahesh.Hi Dude,
Execute This Program as it is.UR requirement will be full filled .
Here the important Thing is the FM 'SO_NEW_DOCUMENT_ATT_SEND_API1'
tables
packing_list = it_packing_list
contents_txt = it_message
receivers = it_receivers
Hope this Code helps U.
*& Report ZSENDMAIL
report zsendmail.
parameters: psubject(40) type c default 'Testing'.
PUSH BUTTON
data: it_packing_list like sopcklsti1 occurs 0 with header line,
it_contents like solisti1 occurs 0 with header line,
it_receivers like somlreci1 occurs 0 with header line,
it_attachment like solisti1 occurs 0 with header line,
gd_cnt type i,
gd_sent_all(1) type c,
gd_doc_data like sodocchgi1,
gd_error type sy-subrc.
data: it_message type standard table of solisti1 initial size 0
with header line.
*START-OF-SELECTION.
start-of-selection.
perform populate_message_table.
*Send email message, although is not sent from SAP until mail send
*program has been executed(rsconn01)
perform send_email_message.
*Instructs mail send program for SAPCONNECT to send email(rsconn01)
perform initiate_mail_execute_program.
*& Form POPULATE_MESSAGE_TABLE
adds text to email text table
form populate_message_table.
data : itab type table of sflight with header line.
data : lv_itab(255) type c.
select carrid
connid from sflight into corresponding fields of table itab
where carrid = 'LH' and connid = '0400'.
loop at itab.
write : / itab-carrid , itab-connid.
concatenate itab-carrid itab-connid into lv_itab separated by space.
append lv_itab to it_message.
endloop.
endform. " POPULATE_MESSAGE_TABLE
**& Form SEND_EMAIL_MESSAGE
*send email message
form send_email_message.
*fill the document data.
gd_doc_data-doc_size = 1.
data: tab_lines like sy-tabix.
describe table it_message lines tab_lines.
read table it_message index tab_lines.
gd_doc_data-doc_size = ( tab_lines - 1 ) * 255 + strlen( it_message ).
**POPULATE the SUBJECT/GENERIC message ATTRIBUTES
gd_doc_data-obj_langu = sy-langu.
gd_doc_data-obj_name = 'SAPRPT'.
gd_doc_data-obj_descr = psubject.
gd_doc_data-sensitivty = 'F'.
**describe the body of the message
**information about structure of data tables
clear it_packing_list.
refresh it_packing_list.
it_packing_list-transf_bin = space.
it_packing_list-head_start = 1.
it_packing_list-head_num = 0.
it_packing_list-body_start = 1.
describe table it_message lines it_packing_list-body_num.
it_packing_list-doc_type = 'RAW'.
append it_packing_list.
**add the recipients email address
clear it_receivers.
refresh it_receivers.
it_receivers-receiver = 'KRK'. "p_email.
it_receivers-rec_type = 'B'.
it_receivers-com_type = 'INT'.
it_receivers-notif_del = 'X'.
it_receivers-notif_ndel = 'X'.
append it_receivers.
it_receivers-receiver = 'OBT'. "p_email.
it_receivers-rec_type = 'B'.
it_receivers-com_type = 'INT'.
it_receivers-notif_del = 'X'.
it_receivers-notif_ndel = 'X'.
append it_receivers.
**CALL the fm TO post the MESSAGE to sapmail
call function 'SO_NEW_DOCUMENT_ATT_SEND_API1'
exporting
document_data = gd_doc_data
put_in_outbox = 'X'
importing
sent_to_all = gd_sent_all
tables
packing_list = it_packing_list
contents_txt = it_message
receivers = it_receivers
exceptions
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
others = 8.
**store function module return code
gd_error = sy-subrc.
**GET it_receivers return code
loop at it_receivers.
endloop.
endform. " SEND_EMAIL_MESSAGE
*& Form INITIATE_MAIL_EXECUTE_PROGRAM
**instructs mail send program for sapconnect to send email.
form initiate_mail_execute_program.
wait up to 2 seconds.
if gd_error eq 0.
submit rsconn01 with mode = 'INT'
with output = 'X'
and return.
endif.
endform. " INITIATE_MAIL_EXECUTE_PROGRAM -
Scheduling a background job depending on the output lenght.
Hi every one,
I have a small requirement. My client want me to run a program in a foreground if the output is small and should the program in background if the output is large.This has to be achieved through coding. The program downloads the netprices of products. The downloaded file is of .dat format. It is an urgent requirement.
Guys you would throughly rewarded for your help.
Thanks,
Kumar.9886185040.Hi Nag
that is not possible with codeing. To create a schedule a background job for the same program depending on its output is not possible.
being a programmer you need to decide, how long the code will take to execute.. accordingly you can either schedule or run in foreground. You can make some mandatory fields in the selection screen, so that the output is big mostly.
see the sample code for the Job scheduling using the fun modules
IF p_bjob = 'X'.
CONCATENATE sy-cprog sy-datum sy-uzeit
INTO jobname SEPARATED BY '_'.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = jobname
IMPORTING
jobcount = jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
CALL FUNCTION 'GET_PRINT_PARAMETERS'
IMPORTING
out_archive_parameters = arc_params
out_parameters = print_params
valid = valid
EXCEPTIONS
archive_info_not_found = 1
invalid_print_params = 2
invalid_archive_params = 3
OTHERS = 4.
IF valid = chk.
SUBMIT yREP WITH s_kunnr IN s_cust
AND RETURN
USER sy-uname
VIA JOB jobname
NUMBER jobcount
TO SAP-SPOOL
SPOOL PARAMETERS print_params
ARCHIVE PARAMETERS arc_params
WITHOUT SPOOL DYNPRO.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount
jobname = jobname
strtimmed = 'X'
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
invalid_target = 8
OTHERS = 9.
IF sy-subrc 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
MESSAGE i029 WITH jobname.
ENDIF.
ELSE.
MESSAGE s000 WITH text-003.
STOP.
ENDIF.
ENDIF.
Also,
Yes you can use job functions:
JOB_OPEN
JOB_SUBMIT
JOB_CLOSE
* You can add multiple steps into one job by using JOB_SUBMIT.
Regards
JJ -
Run the Report as a Background job and Get the Output in Excel in Local PC
Hello Gurus,
I have one following requirement.
One should be able to run the report as a background job and it should be possible to get the report in Excel format, also when running the report in background. The excel report should have the same information and look as the current SAPreport.
Please provide some solution.
Any helpful answer get surely awarded.
Thanks a lot,
VarlanirGUI_* WS_* Function In Background, CSV Upload
GUI_* and WS_* function modules do not work in background
When scheduling a job in the background the appropriate statement to read in your file is OPEN DATASET, and the file must be on the file system that the SAP server can see.
At anytime, a user can switch of the Personal Computers even though the job is still running in the background. Therefore GUI_* and WS_* function modules are not designed to work in that way, as they need to access your personal computer file.
To choose the correct download method to used, you can check the value of SY-BATCH in your code,
if it is 'X' use OPEN DATASET and if it is ' ' use WS_UPLOAD.
*-- Open dataset for reading
DATA:
dsn(20) VALUE '/usr/test.dat',
rec(80).
OPEN DATASET dsn FOR INPUT IN TEXT MODE.
IF sy-subrc = 0.
DO.
READ DATASET dsn INTO rec.
IF sy-subrc <> 0.
EXIT.
ELSE.
WRITE / rec.
ENDIF.
ENDDO.
ENDIF.
CLOSE DATASET dsn.
*-- Open dataset for writing
DATA rec(80).
OPEN DATASET dsn FOR OUTPUT IN TEXT MODE.
TRANSFER rec TO '/usr/test.dat'.
CLOSE DATASET dsn.
What is the difference when we use upload, ws_upload, gui_upload function modules?
UPLOAD, WS_UPLOAD, GUI_UPLOAD, are used in BDC concepts. ie., Batch Data Communication.
Batch Data Conversion is a concept where user can transfer the Data from non SAP to SAP R/3. So , in these various Function Modules are used.
UPLOAD--- upload a file to the presentation server (PC)
WS_UPLOAD---- Load Files from the Presentation Server to Internal ABAP Tables.
WS means Work Station.
This is used upto SAP 4.6 version.
GUI_UPLOAD------- Replaces WS_UPLOAD. Upoad file from presentation server to the app server. From 4.7 SAP version it is replaced.
How to Upload csv file to SAP?
Common File Download Upload Questions:
How you upload the data from text file to sap internal table? From my knowledge its by upload or gui_upload.
How you download the data from sap internal table to text file?
How you upload the data from xls (excel) file to sap internal table how you download the data from sap internal table to xls(excel) file.
You can upload data from presentation server to an internal table using gui_upload. Use gui_download to download from internal table to flat file.
Use fm ALSM_EXCEL_TO_INTERNAL_TABLE to upload data frm excel.
Use function module GUI_UPLOAD
The FILETYPE refer to the type of file format you need: For e.g 'WK1' - Excel format , 'ASC' - Text Format etc.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = 'C:\test.csv'
FILETYPE = 'ASC'
TABLES
DATA_TAB = itab
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17. -
Hi All,
We need to schedule a Job in background in every 30 min or 1 hr, which will monitor all the other Jobs running in background.
If any job is running more than 30000 sec, it should trigger an email.
Please guide me how to achieve this( i'm ABAPer).
Regards
VEnk@see the following t.code may be it will use
SWWCLEAR_INSERT
Workflow: Background Job 'SWWCLEAR';
Workflow: Hintergrundjob 'SWWCLEAR';
Workflow : job arr.-plan 'SWWCLEAR';
Workflow: achtergrondjob 'SWWCLEAR'
Workflow: Background Job 'SWWCLEAR'
SWWCOND_INSERT
Workflow: Background Job 'SWWCOND';
Workflow: Batchjob 'SWWCOND';
Workflow : job batch 'SWWCOND';
Workflow: achtergrondjob 'SWWCOND'
Workflow: Background Job 'SWWCOND'
SWWD
Maintain Work Item Error Monitoring;
Workitem-Fehlerüberwachung pflegen;
Gérer surveillance erreurs WI;
Workitem-foutbewaking verzorgen
Maintain Work Item Error Monitoring
Edited by: Krupaji on Feb 17, 2010 12:45 PM -
Background job link with the cycle
Hello experts
We are running the background job XXXX to run the distribution cycle. can anyone let me know where this job is having the link to the cycle which needs to be executed.
meanwhile please explain me about the functionality of the program RKALWAIT.
RegardsJay,
seems data in the TBTCPV view was corrupted .. try to re-define the failing jobs thru SM36 or SM37 ..
for RDDIMPDP -- in SE38--> Run RDDNEWPP program to re-define the Job.
-K -
Kicking off Background Job from Another SAP system
Hi,
Does anybody know how to kick off a background job from a separate SAP system??
i.e I have a job on our CRM system that is dependant on a Job finishing from our ECC6 system first.
Does anyone know how to do this? I know I might be able to use events, is there anything else I should be making use of??
Many ThanksHi Daniel,
Guess there is one more solution. In system A write a report (let us name it X) that would trigger a job in system B through an RFC call.
Now in System A create a job with 2 steps. First step would be normal one, the second one for report X. Only when step 1 is over would step 2 start. So indirectly end of the existing Job A would trigger the required Job B.
Regards.
Ruchit. -
I normally have my Yahoo! and Gmail e-mail accounts open and logged into the entire time my system is on. Using your instructions, I have set theFireFox 'mailto' option to USE GMAIL.
Seems Gmail automatically logged me out. When I logged back in and tried again, it still opened a new window, but used my open account to process the e-mail.
Must it always open a new window (which then needs to be closed) in executing this function? -
I compose a message and press send. The system states that it connecting and then that the message has been sent. When the recipient looks for the message on his system and/or the server he cannot find the message. I have sent him messages direct from my server and also Outlook Express and he does get them it is only when using Thunderbird do the messages go missing. Do I have to use special settings to send messages to Blueyonder?
I'd suggest you contact your email provider. Similar problems have been reported from Virgin users.
http://community.virginmedia.com/t5/Other-Queries/Emails-to-blueyonder-users-not-being-received/td-p/1813248 -
Send mail from background job scheduling
Hi All,
I am facing one problem in which i have one standard transaction code COOIS for which there is no userexit.
we have to run this in background get the output in excelsheet and then mail the excel output to individual.
Please help me out.
Points wil be rewarded for sure.Hi
This is the sample code previously I achieved the same requirement.
FORM send_mail_2 USING msgid msgno msgv1.
mailuser oder Gruppe like sy-uname default 'Ruckerk'.
DATA: express_hold_time LIKE sovaltime.
DATA: text LIKE sotxtinfo.
DATA: receiver LIKE somlreci1 OCCURS 0 WITH HEADER LINE.
MESSAGE ZF100 (FTP an UDB fehlgeschlagen)
text-msgid = msgid.
text-msgno = msgno.
text-msgv1 = msgv1.
text-msgv2 = ' '.
text-msgv3 = ' '.
text-msgv4 = ' '.
express_hold_time
express_hold_time-days = 01.
express_hold_time-h_min_sec = 240000.
receiver
receiver-receiver = mreceivr.
Gruppe von Empfängern
receiver-rec_type = 'C'.
und Expressmeldung ausgeben
receiver-express = 'X'.
APPEND receiver.
CALL FUNCTION 'MESSAGE_SEND_AS_MAIL'
EXPORTING
msgid = text-msgid
msgno = text-msgno
msgv1 = text-msgv1
msgv2 = text-msgv2
msgv3 = text-msgv3
TABLES
receivers = receiver.
IF sy-subrc <> 0.
WRITE:/ 'hat nicht geklappt', 'SY-SUBRC =', sy-subrc.
ENDIF.
PERFORM print_error_report.
Fehlermeldung zum Abbrechen des Report's ausgeben.
MESSAGE e398 WITH 'Jobabbruch' msgv1.
ENDFORM. " SEND_MAIL_2
Regards,
kumar -
E-Mail sending with payload field in the topic and / or in the body
Hello all,
I have follow question:
For a project, we need follow functionallity:
If we get a Purchase Oder Message into the SAP XI for the customer:
1.) XI have generating an E-Mail, which the topic contains the Order Number, or in the
body of the E-Mail is a list which contains all Order - Numbers from the Message.
2.) If we send the E-Mail, a attachment shouldn't be necessary.
Can somebody help me ?
Thanks
Kind regards
StephanHi,
Check the links for Email Adapter,If u want to send the Attachment then give me ur mail id i will send you one doc which will explain u how to send Email in Attachment.
Receiver Mail Adapter.
/people/prasad.ulagappan2/blog/2005/06/07/mail-adapter-scenarios-150-sap-exchange-infrastructure
/people/community.user/blog/2006/09/07/email-reporting
/people/community.user/blog/2006/09/08/email-report-as-attachment-excelword
/people/michal.krawczyk2/blog/2005/03/07/mail-adapter-xi--how-to-implement-dynamic-mail-address
/people/michal.krawczyk2/blog/2005/11/23/xi-html-e-mails-from-the-receiver-mail-adapter
/people/michal.krawczyk2/blog/2005/12/18/xi-sender-mail-adapter--payloadswapbean--step-by-step
eMail Reporting
/people/community.user/blog/2006/09/07/email-reporting
Regards,
Phani
Reward points if Helpful -
How to create a background job to replicate the datasource from R3 to BW?
Dear all
I always got error msg when use the RSA1 to do the relicate from R3. Did anybody can tell me how to do it in background? Thank you!
JialinTry this:
1) Go to tcode SE38 - ABAP Editor
2) Enter ABAP program name RSDS_REPL_RESET
3) Click on Execute
4) In the Selection-Screen, enter the source system to replicate from, or * if you want to replicate from all source systems.
5) If you just want to replicate BW 3.5 DataSource, enter ISFS as the Preferred Type. Or, if your preference is for BW 7.x DataSources, etner RSDS as the Preferred Type. If there is no preference, leave the field blank and it will replicate both types.
6) Go to the menu option Program > Execute in Background -
My windows firewall is disabled (protected by Comcast's Norton program) so that should not be a problem. Should I down load Bonjour?
Hello Bleedingblue65
Check out the section highlighted below to troubleshoot your issues printing through AirPrint.
AirPrint Basics
http://support.apple.com/kb/ht4356
If you are unable to print, or if you see the message "No AirPrint Printers Found"
Verify that the printer:
Has power and is turned on. If it has power, turn the printer off and then on again to see if that resolves the issue.
Is connected to the same Wi-Fi network as the iOS device.
Has the latest firmware version installed.
Has paper with enough ink or toner installed.
Is free of any errors displayed on the printer's control panel.
If necessary, consult the printer documentation or contact the printer vendor for help with the above steps.
Notes:
AirPrint printers connected to the USB port of the Apple AirPort Base Station or Time Capsules are not supported with AirPrint.
Some Wi-Fi AirPrint printers can take several minutes to join a Wi-Fi network after being turned on. Ensure that the AirPrint printer is connected to the Wi-Fi network before attempting to print.
Regards,
-Norm G.
Maybe you are looking for
-
I have tried everything I can think of to fix this, there are a couple ipads, computers, and a gaming system that all connect to the internet. But my ipod just wont let me, some help would be much appreciated.
-
'Exists in Hierarchy' column and table name
Hi All In Position hierarchy form .we all find exists in hierarchy flag ..when checking for hierarchies , can any one help me ..what is the table and column name which will tell whether position exists in hierarchy or not
-
Guys, I have a issue with sharing data control frame. I have a search page. From the search results, if the users clicks on a result row, i have to open a NEW TAB providing details of the row. So everytime the user can go back to search tab, and clic
-
i want to email with attachement throuhg JSP. is it possible to directly attach attachement File with email-message from client PC without uploading attachememt file to web Server. please provide code if possible thanx
-
Using iTune songs as ringtones problem?
Hi all, my very first post and no doubt its been asked a million times but I did a quick search and couldn't find it so hence my question! I have over 200 songs in my iTunes that I used to put on my iPod Shuffle. I upgraded my Blackberry Bold to an i