2014年4月24日 星期四

Domino Notes 7.0 呼叫SAP RFC來取得資產說明

上一篇做了一個簡單的RFC, 這一篇是紀錄如何呼叫SAP RFC來取得資產說明

1.首先要做一個Java agent, 接受doc.NoteID,並將結果用
session.setEnvironmentVar("AgentResult",resultMsg);來傳回Lotusscript

範例:
import lotus.domino.*;
import java.util.*;
import com.sap.mw.jco.*;
public class SAPApprove extends AgentBase {
private Session session;
private AgentContext agentContext;
private Database db;
private String sapIP,sapClient,sapAccount,sapPasswd,sapLang,sapSysNo;
private JCO.Function function;
private JCO.Client client ;
private Log log;
private boolean isError=false;
private String errMsg="";
private String resultCode;
private String resultMsg ;
private Document doc;

public void init(Session session,AgentContext agentContext) throws NotesException{
try {
this.session=session;
this.agentContext=agentContext;
this.db=agentContext.getCurrentDatabase();
Document profile=db.getProfileDocument("SystemProfile",null);
sapIP=profile.getItemValueString("SAPIP");
sapClient=profile.getItemValueString("SAPClient");
sapAccount=profile.getItemValueString("SAPAccount");
sapPasswd=profile.getItemValueString("SAPPasswd");
sapLang=profile.getItemValueString("SAPCode");
sapSysNo=profile.getItemValueString("SAPSysNO");
String logPath=profile.getItemValueString("LogPath");
log = session.createLog( db.getTitle()+" 's Agent "+agentContext.getCurrentAgent().getName()+" on " + db.getServer());
log.openNotesLog(db.getServer(),logPath);

Agent agent = agentContext.getCurrentAgent();
doc = db.getDocumentByID(agent.getParameterDocID());

System.out.println("Load Profile OK.");
}catch(Exception e) {
e.printStackTrace();
try{
session.setEnvironmentVar("AgentResult","載入SAP 設定時,發生錯誤 !!");
}catch ( Exception ex){}
}
}


public void processApprove() {
boolean isok;
Item notifyitem;
try{
System.out.println("Begin JCO Connection....");
log.logAction("Begin JCO Connection....");
client = JCO.createClient(sapClient, sapAccount, sapPasswd, sapLang, sapIP, sapSysNo);
client.connect();
JCO.Repository repository = new JCO.Repository( "Notes", client );
JCO.Attributes attr = client.getAttributes();
IFunctionTemplate ftemplate = repository.getFunctionTemplate( "Z_RFC_ASSETCHECK" );
function = new JCO.Function( ftemplate );
System.out.println("Begin Load Not Procsess Documents....");
log.logAction("Begin Load Not Procsess Documents....");
if (doc != null) {
String sn=doc.getItemValueString("ANLN1").replaceAll("\\s+", "");
String sn2=doc.getItemValueString("ANLN2").replaceAll("\\s+", "");
System.out.println("Begin Process Asset No: " + sn + "-" + sn2);
log.logAction("Begin Process Asset No: " + sn + "-" + sn2);
function.getImportParameterList().setValue(sn,"IANLN1");
function.getImportParameterList().setValue(sn2,"IANLN2");
client.execute( function );
resultCode = (String)function.getExportParameterList().getValue("STATUS");
resultMsg = (String)function.getExportParameterList().getValue("MESSAGE");
if (! (resultCode.equals("") | resultCode.equals("O")) ){
System.out.println("Return Code :"+resultCode);
System.out.println("Return Message :"+resultMsg);
log.logError(1,"Error Code : "+resultCode);
log.logError(1,"Error Message : "+sn+ "-" + sn2+" - "+resultMsg);
isError=true;
errMsg="Notes 與 SAP 溝通作業時發生錯誤";
session.setEnvironmentVar("AgentResult",resultMsg);
}else{
log.logAction("Z_RFC_ASSETCHECK SN: " + sn + "-" + sn2);
isError=false;
session.setEnvironmentVar("AgentResult",resultMsg);
}
}
}catch(java.lang.NoClassDefFoundError e){
e.printStackTrace();
try{
session.setEnvironmentVar("AgentResult","SAP 元件未安裝!!");
}catch ( Exception ex){}
}
catch(Exception e) {
e.printStackTrace();
try{
log.logError(0,e.getLocalizedMessage());
session.setEnvironmentVar("AgentResult","代理程式發生不明錯誤!!");
}catch(Exception err){}
}finally{
try{
  JCO.releaseClient(client);
log.close();
}catch(Exception err){}
}
}

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
SAPApprove sapobj=new SAPApprove();
sapobj.init(session,agentContext);

Agent agent = agentContext.getCurrentAgent();

sapobj.processApprove();

} catch(Exception e) {
e.printStackTrace();
}
}

2.Lotusscript呼叫範例:

Sub Click(Source As Button)
If uidoc.EditMode Then
uidoc.Save
Dim agent As NotesAgent
Dim m_agnrtn As String
Set agent=db.GetAgent("SAPAssetCheck")
If (agent.Run(doc.NoteID)><0) Then
Messagebox "執行 SAP 溝通之代理程式,執行錯誤!!",MB_ICONSTOP,"執行錯誤!!"
Exit Sub
End If
m_agnrtn=session.GetEnvironmentString("AgentResult")
If m_agnrtn="SAP 元件未安裝!!" Then
Messagebox "您尚未安裝與SAP溝通之必要元件,若要使用此功能,請連絡相關人員,謝謝!!",MB_ICONSTOP,"元件未安裝"
Exit Sub
End If
Call uidoc.FieldSetText("ANLATXT50", m_agnrtn )
End If
End Sub

2014年4月17日 星期四

我的第一個SAP RFC喔!

由於單據報銷電子簽核時,有要求資產必須先進SAP建檔才可進財務請款,

因此就需要寫個SAP RFC來檢查報銷單據所輸入的資產編碼是否有在SAP當中輸入完成

FUNCTION Z_RFC_ASSETCHECK.
*"----------------------------------------------------------------------
*"*"區域介面:
*"  IMPORTING
*"     VALUE(IANLN1) TYPE  ANLN1
*"     VALUE(IANLN2) TYPE  ANLN2
*"  EXPORTING
*"     VALUE(STATUS) TYPE  CHAR1
*"     VALUE(MESSAGE) TYPE  TEXT300
*"----------------------------------------------------------------------

  DATA : wa_ANLA TYPE  ANLA.

 IF ianln1 IS INITIAL.
    status = 'E'.
    message = '資產編號不得為空值'.
    RETURN.
  ENDIF.

 IF ianln2 IS INITIAL.
    status = 'E'.
    message = '資產子編號不得為空值'.
    RETURN.
  ENDIF.

  SELECT SINGLE *
    FROM ANLA
        INTO  wa_ANLA
    WHERE anln1 EQ ianln1
      AND anln2  EQ ianln2.
  IF sy-subrc NE 0.
    status = 'E'.
    message = '查無此資產'.
  ELSE.
    status = 'O'.
    message = wa_ANLA-TXT50.
  ENDIF.

    RETURN.
ENDFUNCTION.

2014年4月15日 星期二

Domino Notes 7.0 透過web API撈Json資料的範例

取網頁資料請參考這一篇(Notes Client只能在Windows平台上操作喔)

http://stackoverflow.com/questions/12719192/get-a-field-value-from-a-webpage-lotusscript

取json則請使用這個ntf建好的script程式庫

http://www.openntf.org/main.nsf/project.xsp?r=project/JSON%20LS

請先把用到的Class先準備好

這個例子是做當人事單位按開始審核按鈕時,系統自動透過webAPI取回相關打卡紀錄存入PunchCards欄位做佐證.

我放在Form的Postopen事件

Sub Postopen(Source As Notesuidocument)
If source.EditMode Then
Dim internet As New RemoteHTML()
Dim html As String
Dim sJSON As String
Dim PunchTime As String
Dim jsonReader As JSONReader
Dim vResults As Variant
Set jsonReader = New JSONReader
Set doc=uidoc.Document
url$="http://10.100.2.1:8080/API/Employees/"
url2$="/"+Format$(doc.STime(0),"yyyymmdd")+"/"+Format$(doc.ETime(0),"yyyymmdd")
url1$=url$+Ucase(Trim(doc.EmployeeID(0)))+url2$
html = internet.GetHTTP(url1$)
Set vResults = jsonReader.Parse(html) 'this is a JSONObject
If  vResults.Count > 0 Then
PunchTime = PunchTime +Chr(13) + Chr(10)+ vResults.items(0).GetItemValue("RSENO") + vResults.items(0).GetItemValue("BPNME")
For iV = 1 To  vResults.Count
PunchTime = PunchTime +Chr(13) + Chr(10) + "                   "+FindReplace(vResults.items(iv-1).GetItemValue("RSNOW"),"T", "   ")
Next
End If
Dim m_item As NotesItem
Set m_item=doc.GetFirstItem("ApplyListID")
If Not m_item  Is Nothing Then
Forall x In m_item.Values
If Len(Ucase(Cstr(x))) > 0 Then
url1$=url$+Ucase(Cstr(x))+url2$
html = internet.GetHTTP(url1$)
Set vResults = jsonReader.Parse(html) 'this is a JSONObject
If  vResults.Count > 0 Then
PunchTime = PunchTime +Chr(13) + Chr(10)+ vResults.items(0).GetItemValue("RSENO") + vResults.items(0).GetItemValue("BPNME")
For iV = 1 To  vResults.Count
PunchTime = PunchTime +Chr(13) + Chr(10)+ "                   "+FindReplace(vResults.items(iv-1).GetItemValue("RSNOW") , "T", "   ")
Next
End If
End If
End Forall
End If
Call Source.FieldSetText("PunchCards",PunchTime)
End If
End Sub

WebAPI Help

http://10.100.2.1:8080/API/Employees/ID/DATE1/DATE2

ID: 卡號 (EX:K1116)
DATE1 :日期 (EX:20140101)
DATE 2:日期 (EX:20140131)


傳回json範例

[{"RSENO":"K1116","RSTME":"07:53","RSDAT":"2014-04-01T00:00:00","RSNOW":"2014-04-01T07:53:00","BPNME":"Jeff","BPEML":"Jeff@adimxxne.com.tw"},{"RSENO":"K1116","RSTME":"17:24","RSDAT":"2014-04-01T00:00:00","RSNOW":"2014-04-01T17:24:00","BPNME":"Jeff","BPEML":"Jeff@adimxxne.com.tw"}