跟SAP系统集成的Android应用
首先吐槽一点,这是我的第一个Android应用,很糙。
这个应用适合于上了SAP系统的企业内部使用,并且限于制造型MTO模式,需要针对生产订单报工操作的场景,因为此应用主要的一个目的,就是用来方便报工操作的。
为此,先上一幅程序目录结构全图:
下面将按源文件、资源文件、程序目录清单文件依次介绍:
源文件分为三个包:SAP业务逻辑操作包、对象实体包、工具包(包含访问SAP连接)
SAP业务逻辑操作包: com.fungchoi.sap
对象实体包: com.fungchoi.sap.entity
工具包: com.fungchoi.sap.util
SAP业务逻辑操作包按照业务逻辑顺序一共包含有8个程序文件,分别介绍如下:
应用登录:LoginActivity.java:
/**
* 用户登录类
*/
package com.fungchoi.sap; import java.lang.Thread.State;
import java.util.ArrayList;
import java.util.List; import org.apache.http.message.BasicNameValuePair; import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; /**
* @author Administrator
*
*/
public class LoginActivity extends Activity { private Activity activity; private EditText txtUserName;
private EditText txtPassword;
private Button btnLogin; private ProgressDialog pd; private PassParameter pp; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login); // 当前活动
activity = this;
// 传递参数
pp = new PassParameter();
// 设置用户手机号码
pp.setLTXA1(Helper.getPhoneNumber(activity)); // 界面控件
txtUserName = (EditText) this.findViewById(R.id.txtUserName);
txtPassword = (EditText) this.findViewById(R.id.txtPassword);
btnLogin = (Button) this.findViewById(R.id.btnLogin); // 判断网络连接
if (!Helper.checkNet(this)) {
Helper.message(this, "没有可用的3G或Wifi网络!");
Helper.disenableButton(btnLogin);
return;
} // 将当前活动压入活动堆栈
MyApplication.getInstance().addActivity(this); // 登录按钮注册事件
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 设置用户帐号和密码
pp.setUserName(txtUserName.getText().toString().trim());
pp.setPassword(txtPassword.getText().toString().trim()); // 设置正在处理窗口
pd = ProgressDialog.show(activity, "提示", "正在登录,请稍候..."); // 启动线程
if (thread.getState() == State.NEW) {
thread.start();
} else {
thread.run();
}
}
});
} // 工作线程
private Thread thread = new Thread() {
@Override
public void run() {
// 从SAP系统获取数据
String result = getJSONString(pp); Message message = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("flag", result);
message.setData(b);
handler.sendMessage(message);
}
}; // 更新UI
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
pd.dismiss();
if ("success".equals(msg.getData().getString("flag"))) {
Helper.enableButton(btnLogin);
// thread.stop();
// 成功登录,则跳转至开始报工界面
dispatch(pp);
} else {
Helper.message(activity, "帐号或者密码错误!\n登录失败 !");
thread.stop();
}
}
}; // 从SAP服务器获取内容(JSON字符串)
private String getJSONString(PassParameter pp) {
String url = Helper.getUrl("service0000");
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("UserName", pp.getUserName()));
pairs.add(new BasicNameValuePair("Password", pp.getPassword()));
return Helper.callSAPService(pp, url, pairs);
} // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
}
}
应用主界面(生产订单查询界面): MainActivity.java
package com.fungchoi.sap; import java.util.Calendar;
import java.util.Locale; import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication; import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText; public class MainActivity extends Activity {
private Activity activity; private EditText tempDate;
private EditText txtBeginDate;
private EditText txtEndDate;
private EditText txtOrderCode;
private EditText txtMaterialDesc; private int mYear;
private int mMonth;
private int mDay; private PassParameter pp; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // 判断手机电量
Helper.checkBattery(this); // 将当前活动压入活动堆栈
MyApplication.getInstance().addActivity(this); // 当前活动
activity = this; // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
pp = (PassParameter) intent.getSerializableExtra(PassParameter.PP_KEY); // 获取当前日期实例
final Calendar c = Calendar.getInstance(Locale.CHINA);
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH); // 界面控件
txtBeginDate = (EditText) this.findViewById(R.id.txtBeginDate);
txtEndDate = (EditText) this.findViewById(R.id.txtEndDate);
// 设置默认日期
Helper.updateDate(txtEndDate, mYear, mMonth, mDay);
setBeginDate(c, -2);
// 注册日期控件监听事件
registerEvents(); // 界面控件
txtOrderCode = (EditText) this.findViewById(R.id.txtOrderCode);
txtMaterialDesc = (EditText) this.findViewById(R.id.txtMatnr); // 按下返回键返回到上一个界面
Button previous = (Button) this.findViewById(R.id.btnPrevious00);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
});
// 开始报工按钮,并注册监听事件
Button btnStart = (Button) this.findViewById(R.id.btnStart);
btnStart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
pp.setBeginDate(txtBeginDate.getText().toString()
.replaceAll("-", ""));
pp.setEndDate(txtEndDate.getText().toString()
.replaceAll("-", ""));
pp.setOrderCode(txtOrderCode.getText().toString().trim());
pp.setMaterialDesc(txtMaterialDesc.getText().toString().trim());
dispatch(pp);
}
});
} // 日期控件
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth; Helper.updateDate(tempDate, mYear, mMonth, mDay);
}
}; // 显示日期控件
private void showDialog() {
DatePickerDialog dialog = new DatePickerDialog(this, mDateSetListener,
mYear, mMonth, mDay); dialog.show();
} // 注册事件
private void registerEvents() {
txtBeginDate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Helper.hideIM(activity, v);
tempDate = txtBeginDate;
showDialog();
}
});
txtEndDate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Helper.hideIM(activity, v);
tempDate = txtEndDate;
showDialog();
}
});
txtBeginDate.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == true) {
Helper.hideIM(activity, v);
tempDate = txtBeginDate;
showDialog();
}
}
});
txtEndDate.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == true) {
Helper.hideIM(activity, v);
tempDate = txtEndDate;
showDialog();
}
}
});
} // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
Intent intent = new Intent(this, OrderListActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
} // 设置开始日期
private void setBeginDate(Calendar c, int val) {
c.add(Calendar.DATE, val);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
txtBeginDate.setText(new StringBuilder().append(year).append("-")
.append((month + 1) < 10 ? "0" + (month + 1) : (month + 1))
.append("-").append((day < 10) ? "0" + day : day));
} }
生产订单列表选择界面: OrderListActivity.java
/**
* 生产订单列表选择类
*/
package com.fungchoi.sap; import java.lang.Thread.State;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import org.apache.http.message.BasicNameValuePair; import com.fungchoi.sap.entity.Order;
import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.RadioButton;
import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView; /**
* @author Administrator
*
*/
public class OrderListActivity extends Activity {
private final int FP = ViewGroup.LayoutParams.FILL_PARENT;
private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; private Activity activity; private ScrollView sv;
private HorizontalScrollView hsv;
private TableLayout tab; private PassParameter pp;
private LinkedList<Order> orders; private ProgressDialog pd;
private Button previous;
private Button next; /**
*
*/
public OrderListActivity() {
// TODO Auto-generated constructor stub
} // @SuppressWarnings("static-access")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.orderlist); // 当前活动
activity = this; // 将当前活动压入活动堆栈
MyApplication.getInstance().addActivity(this); // 获取界面控件对象
sv = (ScrollView) this.findViewById(R.id.scrollView1);
sv.setHorizontalScrollBarEnabled(true);
hsv = (HorizontalScrollView) this
.findViewById(R.id.horizontalScrollView1);
tab = (TableLayout) hsv.getChildAt(0); // 按下返回键返回到上一个界面
previous = (Button) this.findViewById(R.id.btnPrevious01);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
});
// 按下一步跳转到工序选择界面
next = (Button) this.findViewById(R.id.btnNext01);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 跳转到下一步之前判断是否选择了生产订单
if (!Helper.checkRadioButton(tab)) {
Helper.message(activity, "请选择一笔生产订单!");
return;
}
dispatch(pp);
}
}); // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
pp = (PassParameter) intent.getSerializableExtra(PassParameter.PP_KEY); // 设置正在处理窗口
pd = ProgressDialog.show(this, "提示", "正在处理,请稍候..."); // 启动线程
if (thread.getState() == State.NEW) {
thread.start();
} else {
thread.run();
}
} // 工作线程
private Thread thread = new Thread() {
@Override
public void run() {
// 从SAP系统获取数据
String result = getJSONString(pp);
orders = parseFromJson(result); Message message = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("flag", "ok");
message.setData(b);
handler.sendMessage(message);
}
}; // 更新UI
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
Helper.enableButton(next);
if ("ok".equals(msg.getData().getString("flag"))) {
// 动态添加数据记录
addRows(orders);
pd.dismiss();
thread.stop();
}
}
}; // 从SAP服务器获取内容(JSON字符串)
private String getJSONString(PassParameter pp) {
String url = Helper.getUrl("service0001");
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("BeginDate", pp.getBeginDate()));
pairs.add(new BasicNameValuePair("EndDate", pp.getEndDate()));
pairs.add(new BasicNameValuePair("OrderCode", pp.getOrderCode()));
pairs.add(new BasicNameValuePair("MaterialDesc", pp.getMaterialDesc()));
return Helper.callSAPService(pp, url, pairs);
} // 根据JSON字符串解析成订单实体对象列表
private LinkedList<Order> parseFromJson(String jsonData) {
if (jsonData == null)
return null;
if ("".equals(jsonData))
return null;
Type listType = new TypeToken<LinkedList<Order>>() {
}.getType();
Gson gson = new Gson();
LinkedList<Order> entitys = gson.fromJson(jsonData, listType);
return entitys;
} // 根据读取的记录动态添加列表行
private Boolean addRows(LinkedList<Order> orders) {
if (orders == null) {
Helper.disenableButton(next);
return false;
}
if (orders.isEmpty()) {
Helper.disenableButton(next);
return false;
} TableRow row;
TextView view;
RadioButton radio; for (Order order : orders) {
row = new TableRow(this); radio = new RadioButton(this);
radio.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
changedRadio((RadioButton) v);
}
});
row.addView(radio); view = new TextView(this);
view.setText(order.getAUFNR());
row.addView(view); view = new TextView(this);
view.setText(order.getMAKTX());
row.addView(view); view = new TextView(this);
view.setText(String.valueOf(order.getGAMNG()));
row.addView(view); view = new TextView(this);
view.setText(order.getMSEHT());
row.addView(view); tab.addView(row, new TableLayout.LayoutParams(FP, WC));
}
return true;
} // 当更改单选按钮时,获它所在行的订单编号及将其他的单选按钮置为未选中状态
private void changedRadio(RadioButton rb) {
int count = tab.getChildCount();
TableRow row;
RadioButton radio;
for (int i = 1; i < count; i++) {
row = (TableRow) tab.getChildAt(i);
radio = (RadioButton) row.getChildAt(0);
if (rb.equals(radio)) {
pp.setAUFNR(((TextView) row.getChildAt(1)).getText().toString());
} else {
if (radio.isChecked()) {
radio.setChecked(false);
}
}
}
} // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
Intent intent = new Intent(this, StepListActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
} }
工序列表选择界面:StepListActivity.java :
/**
*
*/
package com.fungchoi.sap; import java.lang.Thread.State;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import org.apache.http.message.BasicNameValuePair; import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.entity.Step;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.InputType;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.HorizontalScrollView;
import android.widget.RadioButton;
import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView; /**
* @author Administrator
*
*/
public class StepListActivity extends Activity {
private final int FP = ViewGroup.LayoutParams.FILL_PARENT;
private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; private Activity activity; private ScrollView sv;
private HorizontalScrollView hsv;
private TableLayout tab; private PassParameter pp;
private LinkedList<Step> steps; private ProgressDialog pd;
private Button previous;
private Button next; /**
*
*/
public StepListActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.steplist); // 当前活动
activity = this; // 将当前活动压入活动堆栈
MyApplication.getInstance().addActivity(this); // 获取界面控件对象
sv = (ScrollView) this.findViewById(R.id.scrollView2);
sv.setHorizontalScrollBarEnabled(true);
hsv = (HorizontalScrollView) this
.findViewById(R.id.horizontalScrollView2);
tab = (TableLayout) hsv.getChildAt(0); // 按下返回键返回到上一个界面
previous = (Button) this.findViewById(R.id.btnPrevious02);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
});
// 按下一步跳转到工序选择界面
next = (Button) this.findViewById(R.id.btnNext02);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 跳转到下一步之前判断是否选择了工序
if (!Helper.checkRadioButton(tab)) {
Helper.message(activity, "请选择一道工序!");
return;
}
dispatch(pp);
}
}); // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
pp = (PassParameter) intent.getSerializableExtra(PassParameter.PP_KEY); // 设置正在处理窗口
pd = ProgressDialog.show(this, "提示", "正在处理,请稍候..."); // 启动线程
if (thread.getState() == State.NEW) {
thread.start();
} else {
thread.run();
}
} // 工作线程
private Thread thread = new Thread() {
@Override
public void run() {
// 从SAP系统获取数据
String result = getJSONString(pp);
steps = parseFromJson(result); Message message = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("flag", "ok");
message.setData(b);
handler.sendMessage(message);
}
}; // 更新UI
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
Helper.enableButton(next);
if ("ok".equals(msg.getData().getString("flag"))) {
// 动态添加数据记录
addRows();
pd.dismiss();
thread.stop();
}
}
}; // 从SAP服务器获取内容(JSON字符串)
private String getJSONString(PassParameter pp) {
String url = Helper.getUrl("service0002");
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("OrderCode", pp.getAUFNR()));
return Helper.callSAPService(pp, url, pairs);
} // 根据JSON字符串解析成订单实体对象列表
private LinkedList<Step> parseFromJson(String jsonData) {
if (jsonData == null)
return null;
if ("".equals(jsonData))
return null;
Type listType = new TypeToken<LinkedList<Step>>() {
}.getType();
Gson gson = new Gson();
LinkedList<Step> entitys = gson.fromJson(jsonData, listType);
return entitys;
} // 根据读取的记录动态添加列表行
private Boolean addRows() {
if (steps == null) {
Helper.disenableButton(next);
return false;
}
if (steps.isEmpty()) {
Helper.disenableButton(next);
return false;
} TableRow row;
TextView view;
EditText edit;
RadioButton radio; for (Step step : steps) {
row = new TableRow(this); radio = new RadioButton(this);
radio.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
changedRadio((RadioButton) v);
}
});
row.addView(radio); view = new TextView(this);
view.setText(step.getVORNR());
row.addView(view); view = new TextView(this);
view.setText(step.getLTXA1());
row.addView(view); edit = new EditText(this);
edit.setInputType(InputType.TYPE_CLASS_NUMBER);
edit.setText(String.valueOf(step.getMGVRG()));
row.addView(edit); view = new TextView(this);
view.setText(step.getMSEHT());
row.addView(view); view = new TextView(this);
view.setVisibility(View.INVISIBLE);
view.setText(step.getMEINH());
row.addView(view); tab.addView(row, new TableLayout.LayoutParams(FP, WC));
}
return true;
} // 当更改单选按钮时,获它所在行的订单编号及将其他的单选按钮置为未选中状态
private void changedRadio(RadioButton rb) {
int count = tab.getChildCount();
TableRow row;
RadioButton radio;
for (int i = 1; i < count; i++) {
row = (TableRow) tab.getChildAt(i);
radio = (RadioButton) row.getChildAt(0);
if (rb.equals(radio)) {
pp.setVORNR(((TextView) row.getChildAt(1)).getText().toString());
pp.setLMNGA(Float.parseFloat(((TextView) row.getChildAt(3))
.getText().toString().trim()));
pp.setMEINH(((TextView) row.getChildAt(5)).getText().toString());
} else {
if (radio.isChecked()) {
radio.setChecked(false);
}
}
}
} // 重新设置传递参数中的(选中工序的)工序数量
private void resetLMNGA() {
int count = tab.getChildCount();
TableRow row;
RadioButton radio;
for (int i = 1; i < count; i++) {
row = (TableRow) tab.getChildAt(i);
radio = (RadioButton) row.getChildAt(0);
if (radio.isChecked()) {
pp.setLMNGA(Float.parseFloat(((TextView) row.getChildAt(3))
.getText().toString().trim()));
break;
}
}
} // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
resetLMNGA(); Intent intent = new Intent(this, ZuoYeActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
} }
作业输入界面:ZuoYeActivity.java:
/**
*
*/
package com.fungchoi.sap; import java.lang.Thread.State;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import org.apache.http.message.BasicNameValuePair; import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.entity.ZuoYe;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; /**
* @author Administrator
*
*/
public class ZuoYeActivity extends Activity { private PassParameter pp;
private LinkedList<ZuoYe> zuoyes; private ProgressDialog pd;
private Button previous;
private Button next; private EditText vgw01;
private EditText vgw02;
private EditText vgw03;
private EditText vgw04;
private EditText vgw05;
private EditText vgw06;
private EditText vge01;
private EditText vge02;
private EditText vge03;
private EditText vge04;
private EditText vge05;
private EditText vge06; /**
*
*/
public ZuoYeActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.zuoye); MyApplication.getInstance().addActivity(this); vgw01 = (EditText) this.findViewById(R.id.txtVgw01);
vgw02 = (EditText) this.findViewById(R.id.txtVgw02);
vgw03 = (EditText) this.findViewById(R.id.txtVgw03);
vgw04 = (EditText) this.findViewById(R.id.txtVgw04);
vgw05 = (EditText) this.findViewById(R.id.txtVgw05);
vgw06 = (EditText) this.findViewById(R.id.txtVgw06);
vge01 = (EditText) this.findViewById(R.id.txtVge01);
vge02 = (EditText) this.findViewById(R.id.txtVge02);
vge03 = (EditText) this.findViewById(R.id.txtVge03);
vge04 = (EditText) this.findViewById(R.id.txtVge04);
vge05 = (EditText) this.findViewById(R.id.txtVge05);
vge06 = (EditText) this.findViewById(R.id.txtVge06); // 按下返回键返回到上一个界面
previous = (Button) this.findViewById(R.id.btnPrevious03);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
});
// 按下一步跳转到工序选择界面
next = (Button) this.findViewById(R.id.btnNext03);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dispatch(pp);
}
}); // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
pp = (PassParameter) intent.getSerializableExtra(PassParameter.PP_KEY); // 设置正在处理窗口
pd = ProgressDialog.show(this, "提示", "正在处理,请稍候..."); // 启动线程
if (thread.getState() == State.NEW) {
thread.start();
} else {
thread.run();
}
} // 工作线程
private Thread thread = new Thread() {
@Override
public void run() {
// 从SAP系统获取数据
String result = getJSONString(pp);
zuoyes = parseFromJson(result); Message message = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("flag", "ok");
message.setData(b);
handler.sendMessage(message);
}
}; // 更新UI
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if ("ok".equals(msg.getData().getString("flag"))) {
// 设置默认值
setDefaultValue();
pd.dismiss();
thread.stop();
}
}
}; // 从SAP服务器获取内容(JSON字符串)
private String getJSONString(PassParameter pp) {
String url = Helper.getUrl("service0003");
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("OrderCode", pp.getAUFNR()));
pairs.add(new BasicNameValuePair("StepCode", pp.getVORNR()));
pairs.add(new BasicNameValuePair("Quantity", String.valueOf(pp
.getLMNGA())));
return Helper.callSAPService(pp, url, pairs);
} // 根据JSON字符串解析成订单实体对象列表
private LinkedList<ZuoYe> parseFromJson(String jsonData) {
if (jsonData == null)
return null;
if ("".equals(jsonData))
return null;
Type listType = new TypeToken<LinkedList<ZuoYe>>() {
}.getType();
Gson gson = new Gson();
LinkedList<ZuoYe> entitys = gson.fromJson(jsonData, listType);
return entitys;
} private Boolean setDefaultValue() {
if (zuoyes == null)
return false;
if (zuoyes.isEmpty())
return false; ZuoYe zuoye = zuoyes.getFirst();
vgw01.setText(String.valueOf(zuoye.getVGW01()));
vgw02.setText(String.valueOf(zuoye.getVGW02()));
vgw03.setText(String.valueOf(zuoye.getVGW03()));
vgw04.setText(String.valueOf(zuoye.getVGW04()));
vgw05.setText(String.valueOf(zuoye.getVGW05()));
vgw06.setText(String.valueOf(zuoye.getVGW06()));
vge01.setText(zuoye.getVGE01());
vge02.setText(zuoye.getVGE02());
vge03.setText(zuoye.getVGE03());
vge04.setText(zuoye.getVGE04());
vge05.setText(zuoye.getVGE05());
vge06.setText(zuoye.getVGE06()); return true;
} // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
pp.setISM01(Float.parseFloat(vgw01.getText().toString()));
pp.setISM02(Float.parseFloat(vgw02.getText().toString()));
pp.setISM03(Float.parseFloat(vgw03.getText().toString()));
pp.setISM04(Float.parseFloat(vgw04.getText().toString()));
pp.setISM05(Float.parseFloat(vgw05.getText().toString()));
pp.setISM06(Float.parseFloat(vgw06.getText().toString()));
pp.setILE01(vge01.getText().toString());
pp.setILE02(vge02.getText().toString());
pp.setILE03(vge03.getText().toString());
pp.setILE04(vge04.getText().toString());
pp.setILE05(vge05.getText().toString());
pp.setILE06(vge06.getText().toString()); Intent intent = new Intent(this, DateTimeActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
} }
记账日期和时间界面:DateTimeActivity.java:
/**
*
*/
package com.fungchoi.sap; import java.util.Calendar;
import java.util.Locale; import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication; import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker; /**
* @author Administrator
*
*/
public class DateTimeActivity extends Activity {
private Activity activity; private PassParameter pp; private Button previous;
private Button next; private EditText txtISDD;
private EditText txtISDZ;
private EditText txtIEDD;
private EditText txtIEDZ;
private EditText txtBUDAT;
private EditText tempDate;
private EditText tempTime; private int mYear;
private int mMonth;
private int mDay;
private int mHour;
private int mMinute; /**
*
*/
public DateTimeActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.datetime); MyApplication.getInstance().addActivity(this); activity = this; txtISDD = (EditText) this.findViewById(R.id.txtISDD);
txtISDZ = (EditText) this.findViewById(R.id.txtISDZ);
txtIEDD = (EditText) this.findViewById(R.id.txtIEDD);
txtIEDZ = (EditText) this.findViewById(R.id.txtIEDZ);
txtBUDAT = (EditText) this.findViewById(R.id.txtBUDAT); final Calendar c = Calendar.getInstance(Locale.CHINA);
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE); Helper.updateDate(txtISDD, mYear, mMonth, mDay);
Helper.updateDate(txtIEDD, mYear, mMonth, mDay);
txtISDZ.setText("08:30");
txtIEDZ.setText("17:30");
Helper.updateDate(txtBUDAT, mYear, mMonth, mDay); // 日期控件注册
registerEvents1();
// 时间控件注册
registerEvents2(); // 按下返回键返回到上一个界面
previous = (Button) this.findViewById(R.id.btnPrevious04);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
});
// 按下一步跳转到工序选择界面
next = (Button) this.findViewById(R.id.btnNext04);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dispatch(pp);
}
}); // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
pp = (PassParameter) intent.getSerializableExtra(PassParameter.PP_KEY); } // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
pp.setISDD(txtISDD.getText().toString().replaceAll("-", ""));
pp.setIEDD(txtIEDD.getText().toString().replaceAll("-", ""));
pp.setISDZ(txtISDZ.getText().toString().replaceAll(":", "") + "00");
pp.setIEDZ(txtIEDZ.getText().toString().replaceAll(":", "") + "00");
pp.setBUDAT(txtBUDAT.getText().toString().replaceAll("-", ""));
Intent intent = new Intent(this, EquipmentActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
} // 日期控件注册事件
private void registerEvents1() {
txtISDD.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Helper.hideIM(activity, v);
tempDate = txtISDD;
showDialog1();
}
});
txtIEDD.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Helper.hideIM(activity, v);
tempDate = txtIEDD;
showDialog1();
}
});
txtISDD.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == true) {
Helper.hideIM(activity, v);
tempDate = txtISDD;
showDialog1();
}
}
});
txtIEDD.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == true) {
Helper.hideIM(activity, v);
tempDate = txtIEDD;
showDialog1();
}
}
});
txtBUDAT.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Helper.hideIM(activity, v);
tempDate = txtBUDAT;
showDialog1();
}
});
} // 时间控件注册事件
private void registerEvents2() {
txtISDZ.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
tempTime = txtISDZ;
showDialog2();
}
});
txtIEDZ.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
tempTime = txtIEDZ;
showDialog2();
}
});
txtISDZ.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == true) {
Helper.hideIM(activity, v);
tempTime = txtISDZ;
showDialog2();
}
}
});
txtIEDZ.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus == true) {
Helper.hideIM(activity, v);
tempTime = txtIEDZ;
showDialog2();
}
}
});
} // 显示日期控件
private void showDialog1() {
DatePickerDialog dialog = new DatePickerDialog(this, mDateSetListener,
mYear, mMonth, mDay); dialog.show();
} // 显示时间控件
private void showDialog2() {
TimePickerDialog dialog = new TimePickerDialog(this, mTimeSetListener,
mHour, mMinute, true); dialog.show();
} // 日期控件事件
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth; Helper.updateDate(tempDate, mYear, mMonth, mDay);
}
}; // 时间控件事件
private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute; Helper.updateTime(tempTime, mHour, mMinute);
}
}; }
设备列表选择界面:EquipmentActivity.java:
/**
*
*/
package com.fungchoi.sap; import java.lang.Thread.State;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import org.apache.http.message.BasicNameValuePair; import com.fungchoi.sap.entity.Machine;
import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.RadioButton;
import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView; /**
* @author Administrator
*
*/
public class EquipmentActivity extends Activity { private final int FP = ViewGroup.LayoutParams.FILL_PARENT;
private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; private Activity activity; private ScrollView sv;
private HorizontalScrollView hsv;
private TableLayout tab; private PassParameter pp;
private LinkedList<Machine> machines; private ProgressDialog pd1;
private ProgressDialog pd2;
private Button previous;
private Button finish; /**
*
*/
public EquipmentActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.equipment); // 当前活动
activity = this; // 将当前活动压入活动堆栈
MyApplication.getInstance().addActivity(this); // 获取界面控件对象
sv = (ScrollView) this.findViewById(R.id.scrollView3);
sv.setHorizontalScrollBarEnabled(true);
hsv = (HorizontalScrollView) this
.findViewById(R.id.horizontalScrollView3);
tab = (TableLayout) hsv.getChildAt(0); // 按下返回键返回到上一个界面
previous = (Button) this.findViewById(R.id.btnPrevious05);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
}); // 按完成按钮提交报工数据到SAP服务完成报工处理
finish = (Button) this.findViewById(R.id.btnFinish);
finish.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 正式报工之前判断是否选择了机台或者手工组
if (!Helper.checkRadioButton(tab)) {
Helper.message(activity, "请选择一台设备或一个手工组!");
return;
}
// 提交处理-报工
process();
}
}); // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
pp = (PassParameter) intent.getSerializableExtra(PassParameter.PP_KEY); // 设置正在处理窗口
pd1 = ProgressDialog.show(this, "提示", "正在处理,请稍候...");
// 启动线程
if (thread1.getState() == State.NEW) {
thread1.start();
} else {
thread1.run();
}
} // 工作线程1
private Thread thread1 = new Thread() {
@Override
public void run() {
// 从SAP系统获取数据
String result = getJSONString(pp);
machines = parseFromJson(result); Message message = handler1.obtainMessage();
Bundle b = new Bundle();
b.putString("flag", "ok");
message.setData(b);
handler1.sendMessage(message);
}
}; // 更新UI
private Handler handler1 = new Handler() {
public void handleMessage(Message msg) {
Helper.enableButton(finish);
if ("ok".equals(msg.getData().getString("flag"))) {
// 动态添加数据记录
addRows();
pd1.dismiss();
thread1.stop();
}
}
}; // 从SAP服务器获取内容(JSON字符串)
private String getJSONString(PassParameter pp) {
String url = Helper.getUrl("service0004");
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("OrderCode", pp.getAUFNR()));
return Helper.callSAPService(pp, url, pairs);
} // 根据JSON字符串解析成订单实体对象列表
private LinkedList<Machine> parseFromJson(String jsonData) {
if (jsonData == null)
return null;
if ("".equals(jsonData))
return null;
Type listType = new TypeToken<LinkedList<Machine>>() {
}.getType();
Gson gson = new Gson();
LinkedList<Machine> entitys = gson.fromJson(jsonData, listType);
return entitys;
} // 根据读取的记录动态添加列表行
private Boolean addRows() {
if (machines == null) {
Helper.disenableButton(finish);
return false;
}
if (machines.isEmpty()) {
Helper.disenableButton(finish);
return false;
} TableRow row;
TextView view;
RadioButton radio; for (Machine machine : machines) {
row = new TableRow(this); radio = new RadioButton(this);
radio.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
changedRadio((RadioButton) v);
}
});
row.addView(radio); view = new TextView(this);
view.setText(machine.getZZSB());
row.addView(view); view = new TextView(this);
view.setText(machine.getZZSBMS());
row.addView(view); tab.addView(row, new TableLayout.LayoutParams(FP, WC));
}
return true;
} // 当更改单选按钮时,获它所在行的订单编号及将其他的单选按钮置为未选中状态
private void changedRadio(RadioButton rb) {
int count = tab.getChildCount();
TableRow row;
RadioButton radio;
for (int i = 1; i < count; i++) {
row = (TableRow) tab.getChildAt(i);
radio = (RadioButton) row.getChildAt(0);
if (rb.equals(radio)) {
pp.setZZSB(((TextView) row.getChildAt(1)).getText().toString());
} else {
if (radio.isChecked()) {
radio.setChecked(false);
}
}
}
} // 执行报工
private void process() {
// 设置正在处理窗口
pd2 = ProgressDialog.show(this, "提示", "正在处理,请稍候...");
// 启动线程
if (thread2.getState() == State.NEW) {
thread2.start();
} else {
thread2.run();
}
} // 提交处理,执行报工
private String submit(PassParameter pp) {
String url = Helper.getUrl("service0005");
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
pairs.add(new BasicNameValuePair("AUFNR", pp.getAUFNR()));
pairs.add(new BasicNameValuePair("VORNR", pp.getVORNR()));
pairs.add(new BasicNameValuePair("LMNGA", String.valueOf(pp.getLMNGA())));
pairs.add(new BasicNameValuePair("MEINH", pp.getMEINH()));
pairs.add(new BasicNameValuePair("ISM01", String.valueOf(pp.getISM01())));
pairs.add(new BasicNameValuePair("ILE01", pp.getILE01()));
pairs.add(new BasicNameValuePair("ISM02", String.valueOf(pp.getISM02())));
pairs.add(new BasicNameValuePair("ILE02", pp.getILE02()));
pairs.add(new BasicNameValuePair("ISM03", String.valueOf(pp.getISM03())));
pairs.add(new BasicNameValuePair("ILE03", pp.getILE03()));
pairs.add(new BasicNameValuePair("ISM04", String.valueOf(pp.getISM04())));
pairs.add(new BasicNameValuePair("ILE04", pp.getILE04()));
pairs.add(new BasicNameValuePair("ISM05", String.valueOf(pp.getISM05())));
pairs.add(new BasicNameValuePair("ILE05", pp.getILE05()));
pairs.add(new BasicNameValuePair("ISM06", String.valueOf(pp.getISM06())));
pairs.add(new BasicNameValuePair("ILE06", pp.getILE06()));
pairs.add(new BasicNameValuePair("ISDD", pp.getISDD()));
pairs.add(new BasicNameValuePair("ISDZ", pp.getISDZ()));
pairs.add(new BasicNameValuePair("IEDD", pp.getIEDD()));
pairs.add(new BasicNameValuePair("IEDZ", pp.getIEDZ()));
pairs.add(new BasicNameValuePair("BUDAT", pp.getBUDAT()));
pairs.add(new BasicNameValuePair("LTXA1", pp.getLTXA1()));
pairs.add(new BasicNameValuePair("ZZSB", pp.getZZSB()));
return Helper.callSAPService(pp, url, pairs);
} // 工作线程1
private Thread thread2 = new Thread() {
@Override
public void run() {
// 提交数据到SAP系统进行处理-执行报工,返回报工结果
String result = submit(pp);
pp.setResult(result); Message message = handler2.obtainMessage();
handler2.sendMessage(message);
}
}; // 更新UI
private Handler handler2 = new Handler() {
public void handleMessage(Message msg) {
pd2.dismiss();
thread2.stop();
// 跳转到结果界面
dispatch(pp);
}
}; // 跳转到下一个Activity
private void dispatch(PassParameter pp) {
Intent intent = new Intent(this, ResultActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PassParameter.PP_KEY, pp);
intent.putExtras(bundle); startActivity(intent);
} }
访问SAP报工处理结果界面: ResultActivity.java :
/**
* 处理结果
*/
package com.fungchoi.sap; import com.fungchoi.sap.entity.PassParameter;
import com.fungchoi.sap.util.Helper;
import com.fungchoi.sap.util.MyApplication; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; /**
* @author Administrator
*
*/
public class ResultActivity extends Activity { /**
*
*/
public ResultActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.result); MyApplication.getInstance().addActivity(this); // 从意图里面接收上一个Activity传过来的数据
Intent intent = this.getIntent();
PassParameter pp = (PassParameter) intent
.getSerializableExtra(PassParameter.PP_KEY); TextView view = (TextView) this.findViewById(R.id.txtContent);
view.setText(pp.getResult()); // 按下返回键返回到上一个界面
Button previous = (Button) this.findViewById(R.id.btnPrevious06);
previous.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Helper.simulateKey(KeyEvent.KEYCODE_BACK);
}
}); // 退出系统
Button exit = (Button) this.findViewById(R.id.btnExit);
exit.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MyApplication.getInstance().exit();
}
});
} }
com.fungchoi.sap.entity包包含6个实体对象文件:
用户对象:User.java
/**
*
*/
package com.fungchoi.sap.entity; /**
* @author Administrator
*
*/
public class User { /**
*
*/
public User() {
// TODO Auto-generated constructor stub
} private String userName;
private String password; /**
* @return the userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
} /**
* @return the password
*/
public String getPassword() {
return password;
} /**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
} }
生产订单对象:Order.java
/**
*
*/
package com.fungchoi.sap.entity; /**
* @author Administrator
*
*/
public class Order {
private String AUFNR;// 1 Types AUFNR CHAR 12 0 订单号
private String MAKTX;//1 Types MAKTX CHAR 40 0 物料描述(短文本)
private int GAMNG;//1 Types GAMNG QUAN 13 3 订单数量总计
private int IGMNG;//1 Types CO_IGMNG QUAN 13 3 确认订单中的产量确认
private String MEINS;//1 Types MEINS UNIT 3 0 基本计量单位
private String MSEHT;//1 Types MSEHT CHAR 10 0 度量单位文本(最多10个字符)
/**
* @return the aUFNR
*/
public String getAUFNR() {
return AUFNR;
}
/**
* @param aUFNR the aUFNR to set
*/
public void setAUFNR(String aUFNR) {
AUFNR = aUFNR;
}
/**
* @return the mAKTX
*/
public String getMAKTX() {
return MAKTX;
}
/**
* @param mAKTX the mAKTX to set
*/
public void setMAKTX(String mAKTX) {
MAKTX = mAKTX;
}
/**
* @return the gAMNG
*/
public int getGAMNG() {
return GAMNG;
}
/**
* @param gAMNG the gAMNG to set
*/
public void setGAMNG(int gAMNG) {
GAMNG = gAMNG;
}
/**
* @return the iGMNG
*/
public int getIGMNG() {
return IGMNG;
}
/**
* @param iGMNG the iGMNG to set
*/
public void setIGMNG(int iGMNG) {
IGMNG = iGMNG;
}
/**
* @return the mEINS
*/
public String getMEINS() {
return MEINS;
}
/**
* @param mEINS the mEINS to set
*/
public void setMEINS(String mEINS) {
MEINS = mEINS;
}
/**
* @return the mSEHT
*/
public String getMSEHT() {
return MSEHT;
}
/**
* @param mSEHT the mSEHT to set
*/
public void setMSEHT(String mSEHT) {
MSEHT = mSEHT;
} }
工序实体对象:Step.java
/**
*
*/
package com.fungchoi.sap.entity; /**
* @author Administrator
*
*/
public class Step { /**
*
*/
public Step() {
// TODO Auto-generated constructor stub
} private String VORNR;// 1 Types VORNR CHAR 4 0 操作/活动编号
private String STEUS;// 1 Types STEUS CHAR 4 0 控制码
private String LTXA1;// 1 Types LTXA1 CHAR 40 0 工序短文本
private float MGVRG;// 1 Types MGVRG QUAN 13 3 工序数量
private String MEINH;// 1 Types VORME UNIT 3 0 作业/工序的计量单位
private String MSEHT;// 1 Types MSEHT CHAR 10 0 度量单位文本(最多10个字符)
private String RUECK;//确认号
/**
* @return the vORNR
*/
public String getVORNR() {
return VORNR;
}
/**
* @param vORNR the vORNR to set
*/
public void setVORNR(String vORNR) {
VORNR = vORNR;
}
/**
* @return the sTEUS
*/
public String getSTEUS() {
return STEUS;
}
/**
* @param sTEUS the sTEUS to set
*/
public void setSTEUS(String sTEUS) {
STEUS = sTEUS;
}
/**
* @return the lTXA1
*/
public String getLTXA1() {
return LTXA1;
}
/**
* @param lTXA1 the lTXA1 to set
*/
public void setLTXA1(String lTXA1) {
LTXA1 = lTXA1;
}
/**
* @return the mGVRG
*/
public float getMGVRG() {
return MGVRG;
}
/**
* @param mGVRG the mGVRG to set
*/
public void setMGVRG(float mGVRG) {
MGVRG = mGVRG;
}
/**
* @return the mEINH
*/
public String getMEINH() {
return MEINH;
}
/**
* @param mEINH the mEINH to set
*/
public void setMEINH(String mEINH) {
MEINH = mEINH;
}
/**
* @return the mSEHT
*/
public String getMSEHT() {
return MSEHT;
}
/**
* @param mSEHT the mSEHT to set
*/
public void setMSEHT(String mSEHT) {
MSEHT = mSEHT;
}
/**
* @return the rUECK
*/
public String getRUECK() {
return RUECK;
}
/**
* @param rUECK the rUECK to set
*/
public void setRUECK(String rUECK) {
RUECK = rUECK;
} }
作业实体对象:ZuoYe.java
package com.fungchoi.sap.entity; public class ZuoYe { public ZuoYe() {
// TODO Auto-generated constructor stub
} private float VGW01;// 1 Types VGWRT QUAN 9 3 标准值
private float VGW02;// 1 Types VGWRT QUAN 9 3 标准值
private float VGW03;// 1 Types VGWRT QUAN 9 3 标准值
private float VGW04;// 1 Types VGWRT QUAN 9 3 标准值
private float VGW05;// 1 Types VGWRT QUAN 9 3 标准值
private float VGW06;// 1 Types VGWRT QUAN 9 3 标准值
private String VGE01;// 1 Types VGWRTEH UNIT 3 0 标准值计量单位
private String VGE02;// 1 Types VGWRTEH UNIT 3 0 标准值计量单位
private String VGE03;// 1 Types VGWRTEH UNIT 3 0 标准值计量单位
private String VGE04;// 1 Types VGWRTEH UNIT 3 0 标准值计量单位
private String VGE05;// 1 Types VGWRTEH UNIT 3 0 标准值计量单位
private String VGE06;// 1 Types VGWRTEH UNIT 3 0 标准值计量单位
/**
* @return the vGW01
*/
public float getVGW01() {
return VGW01;
}
/**
* @param vGW01 the vGW01 to set
*/
public void setVGW01(float vGW01) {
VGW01 = vGW01;
}
/**
* @return the vGW02
*/
public float getVGW02() {
return VGW02;
}
/**
* @param vGW02 the vGW02 to set
*/
public void setVGW02(float vGW02) {
VGW02 = vGW02;
}
/**
* @return the vGW03
*/
public float getVGW03() {
return VGW03;
}
/**
* @param vGW03 the vGW03 to set
*/
public void setVGW03(float vGW03) {
VGW03 = vGW03;
}
/**
* @return the vGW04
*/
public float getVGW04() {
return VGW04;
}
/**
* @param vGW04 the vGW04 to set
*/
public void setVGW04(float vGW04) {
VGW04 = vGW04;
}
/**
* @return the vGW05
*/
public float getVGW05() {
return VGW05;
}
/**
* @param vGW05 the vGW05 to set
*/
public void setVGW05(float vGW05) {
VGW05 = vGW05;
}
/**
* @return the vGW06
*/
public float getVGW06() {
return VGW06;
}
/**
* @param vGW06 the vGW06 to set
*/
public void setVGW06(float vGW06) {
VGW06 = vGW06;
}
/**
* @return the vGE01
*/
public String getVGE01() {
return VGE01;
}
/**
* @param vGE01 the vGE01 to set
*/
public void setVGE01(String vGE01) {
VGE01 = vGE01;
}
/**
* @return the vGE02
*/
public String getVGE02() {
return VGE02;
}
/**
* @param vGE02 the vGE02 to set
*/
public void setVGE02(String vGE02) {
VGE02 = vGE02;
}
/**
* @return the vGE03
*/
public String getVGE03() {
return VGE03;
}
/**
* @param vGE03 the vGE03 to set
*/
public void setVGE03(String vGE03) {
VGE03 = vGE03;
}
/**
* @return the vGE04
*/
public String getVGE04() {
return VGE04;
}
/**
* @param vGE04 the vGE04 to set
*/
public void setVGE04(String vGE04) {
VGE04 = vGE04;
}
/**
* @return the vGE05
*/
public String getVGE05() {
return VGE05;
}
/**
* @param vGE05 the vGE05 to set
*/
public void setVGE05(String vGE05) {
VGE05 = vGE05;
}
/**
* @return the vGE06
*/
public String getVGE06() {
return VGE06;
}
/**
* @param vGE06 the vGE06 to set
*/
public void setVGE06(String vGE06) {
VGE06 = vGE06;
} }
设备实体对象:Machine.java
/**
*
*/
package com.fungchoi.sap.entity; /**
* @author Administrator
*
*/
public class Machine { /**
*
*/
public Machine() {
// TODO Auto-generated constructor stub
} private String ZZSB;// 1 Types ZZSB CHAR 10 0 设备编号
private String ZZSBMS;// 1 Types ZZSBMS CHAR 20 0 设备描述
/**
* @return the zZSB
*/
public String getZZSB() {
return ZZSB;
}
/**
* @param zZSB the zZSB to set
*/
public void setZZSB(String zZSB) {
ZZSB = zZSB;
}
/**
* @return the zZSBMS
*/
public String getZZSBMS() {
return ZZSBMS;
}
/**
* @param zZSBMS the zZSBMS to set
*/
public void setZZSBMS(String zZSBMS) {
ZZSBMS = zZSBMS;
} }
传递参数对象:PassParameter.java
package com.fungchoi.sap.entity; import java.io.Serializable; public class PassParameter implements Serializable { /**
*
*/
private static final long serialVersionUID = -3185894960099294258L; public final static String PP_KEY = "com.fungchoi.sap.pp"; //帐号和密码
private String userName;//帐号
private String password;//密码 //查询参数
private String beginDate;//订单开始日期
private String endDate;//订单结束日期
private String orderCode;//订单部分编码或者完整编码
private String materialDesc;//物料部分描述或者完整描述 //报工参数
private String AUFNR;//订单
private String VORNR;//工序
private float LMNGA;//产量
private String MEINH;//单位
private float ISM01;//人工
private float ISM02;//动力
private float ISM03;//机器
private float ISM04;//油墨
private float ISM05;//通用材料
private float ISM06;//其他
private String ILE01;//人工-单位
private String ILE02;//动力-单位
private String ILE03;//机器-单位
private String ILE04;//油墨-单位
private String ILE05;//通用材料-单位
private String ILE06;//其他-单位
private String ISDD;//开始执行日期
private String IEDD;//结束执行日期
private String ISDZ;//开始执行时间
private String IEDZ;//结束执行时间
private String BUDAT;//记账日期
private String LTXA1;//确认文本-报工者的手机号码
private String ZZSB;//设备编码或者手工组 //处理结果
private String result;//报工返回处理结果 /**
* @return the beginDate
*/
public String getBeginDate() {
return beginDate;
}
/**
* @param beginDate the beginDate to set
*/
public void setBeginDate(String beginDate) {
this.beginDate = beginDate;
}
/**
* @return the endDate
*/
public String getEndDate() {
return endDate;
}
/**
* @param endDate the endDate to set
*/
public void setEndDate(String endDate) {
this.endDate = endDate;
}
/**
* @return the materialDesc
*/
public String getMaterialDesc() {
return materialDesc;
}
/**
* @param materialDesc the materialDesc to set
*/
public void setMaterialDesc(String materialDesc) {
this.materialDesc = materialDesc;
}
/**
* @return the aUFNR
*/
public String getAUFNR() {
return AUFNR;
}
/**
* @param aUFNR the aUFNR to set
*/
public void setAUFNR(String aUFNR) {
AUFNR = aUFNR;
}
/**
* @return the vORNR
*/
public String getVORNR() {
return VORNR;
}
/**
* @param vORNR the vORNR to set
*/
public void setVORNR(String vORNR) {
VORNR = vORNR;
}
/**
* @return the lMNGA
*/
public float getLMNGA() {
return LMNGA;
}
/**
* @param lMNGA the lMNGA to set
*/
public void setLMNGA(float lMNGA) {
LMNGA = lMNGA;
}
/**
* @return the iSM01
*/
public float getISM01() {
return ISM01;
}
/**
* @param iSM01 the iSM01 to set
*/
public void setISM01(float iSM01) {
ISM01 = iSM01;
}
/**
* @return the iSM02
*/
public float getISM02() {
return ISM02;
}
/**
* @param iSM02 the iSM02 to set
*/
public void setISM02(float iSM02) {
ISM02 = iSM02;
}
/**
* @return the iSM03
*/
public float getISM03() {
return ISM03;
}
/**
* @param iSM03 the iSM03 to set
*/
public void setISM03(float iSM03) {
ISM03 = iSM03;
}
/**
* @return the iSM04
*/
public float getISM04() {
return ISM04;
}
/**
* @param iSM04 the iSM04 to set
*/
public void setISM04(float iSM04) {
ISM04 = iSM04;
}
/**
* @return the iSM05
*/
public float getISM05() {
return ISM05;
}
/**
* @param iSM05 the iSM05 to set
*/
public void setISM05(float iSM05) {
ISM05 = iSM05;
}
/**
* @return the iSM06
*/
public float getISM06() {
return ISM06;
}
/**
* @param iSM06 the iSM06 to set
*/
public void setISM06(float iSM06) {
ISM06 = iSM06;
}
/**
* @return the iLE01
*/
public String getILE01() {
return ILE01;
}
/**
* @param iLE01 the iLE01 to set
*/
public void setILE01(String iLE01) {
ILE01 = iLE01;
}
/**
* @return the iLE02
*/
public String getILE02() {
return ILE02;
}
/**
* @param iLE02 the iLE02 to set
*/
public void setILE02(String iLE02) {
ILE02 = iLE02;
}
/**
* @return the iLE03
*/
public String getILE03() {
return ILE03;
}
/**
* @param iLE03 the iLE03 to set
*/
public void setILE03(String iLE03) {
ILE03 = iLE03;
}
/**
* @return the iLE04
*/
public String getILE04() {
return ILE04;
}
/**
* @param iLE04 the iLE04 to set
*/
public void setILE04(String iLE04) {
ILE04 = iLE04;
}
/**
* @return the iLE05
*/
public String getILE05() {
return ILE05;
}
/**
* @param iLE05 the iLE05 to set
*/
public void setILE05(String iLE05) {
ILE05 = iLE05;
}
/**
* @return the iLE06
*/
public String getILE06() {
return ILE06;
}
/**
* @param iLE06 the iLE06 to set
*/
public void setILE06(String iLE06) {
ILE06 = iLE06;
}
/**
* @return the iSDD
*/
public String getISDD() {
return ISDD;
}
/**
* @param iSDD the iSDD to set
*/
public void setISDD(String iSDD) {
ISDD = iSDD;
}
/**
* @return the iEDD
*/
public String getIEDD() {
return IEDD;
}
/**
* @param iEDD the iEDD to set
*/
public void setIEDD(String iEDD) {
IEDD = iEDD;
}
/**
* @return the iSDZ
*/
public String getISDZ() {
return ISDZ;
}
/**
* @param iSDZ the iSDZ to set
*/
public void setISDZ(String iSDZ) {
ISDZ = iSDZ;
}
/**
* @return the iEDZ
*/
public String getIEDZ() {
return IEDZ;
}
/**
* @param iEDZ the iEDZ to set
*/
public void setIEDZ(String iEDZ) {
IEDZ = iEDZ;
}
/**
* @return the zZSB
*/
public String getZZSB() {
return ZZSB;
}
/**
* @param zZSB the zZSB to set
*/
public void setZZSB(String zZSB) {
ZZSB = zZSB;
}
/**
* @return the orderCode
*/
public String getOrderCode() {
return orderCode;
}
/**
* @param orderCode the orderCode to set
*/
public void setOrderCode(String orderCode) {
this.orderCode = orderCode;
}
/**
* @return the mEINH
*/
public String getMEINH() {
return MEINH;
}
/**
* @param mEINH the mEINH to set
*/
public void setMEINH(String mEINH) {
MEINH = mEINH;
}
/**
* @return the lTXA1
*/
public String getLTXA1() {
return LTXA1;
}
/**
* @param lTXA1 the lTXA1 to set
*/
public void setLTXA1(String lTXA1) {
LTXA1 = lTXA1;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
/**
* @param result the result to set
*/
public void setResult(String result) {
this.result = result;
}
/**
* @return the bUDAT
*/
public String getBUDAT() {
return BUDAT;
}
/**
* @param bUDAT the bUDAT to set
*/
public void setBUDAT(String bUDAT) {
BUDAT = bUDAT;
}
/**
* @return the userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
} }
com.fungchoi.sap.util工具包有两个程序文件:
Helper类:
/**
* 帮助类
*/
package com.fungchoi.sap.util; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.util.LinkedList;
import java.util.List; import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP; import com.fungchoi.sap.R;
import com.fungchoi.sap.entity.PassParameter;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import android.app.Activity;
import android.app.AlertDialog;
import android.app.Instrumentation;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TableLayout;
import android.widget.TableRow; /**
* @author Administrator
*
*/
public final class Helper {
private final static String host = "10.10.100.239";
private final static int port = 8000;
private final static String client = "500"; // private final static String userName = "test01";
// private final static String password = "4480340"; /**
*
*/
public Helper() {
} // 调用系统按键-返回键
public static void simulateKey(final int KeyCode) {
new Thread() {
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
} catch (Exception e) {
Log.e("Exception when sendKeyDownUpSync", e.toString());
}
}
}.start();
} // 更新日期
public static void updateDate(EditText et, int mYear, int mMonth, int mDay) {
et.setText(new StringBuilder().append(mYear).append("-")
.append((mMonth + 1) < 10 ? "0" + (mMonth + 1) : (mMonth + 1))
.append("-").append((mDay < 10) ? "0" + mDay : mDay));
} // 更新时间
public static void updateTime(EditText et, int mHour, int mMinute) {
et.setText(new StringBuilder()
.append((mHour < 10) ? "0" + mHour : mHour).append(":")
.append((mMinute < 10) ? "0" + mMinute : mMinute)); } // 隐藏手机键盘
public static void hideIM(Activity activity, View edt) {
try {
InputMethodManager im = (InputMethodManager) activity
.getSystemService(Activity.INPUT_METHOD_SERVICE);
IBinder windowToken = edt.getWindowToken(); if (windowToken != null) {
im.hideSoftInputFromWindow(windowToken, 0);
}
} catch (Exception e) { }
} // 根据JSON字符串解析成实体对象列表
public static <T> LinkedList<T> parseOrderFromJson(String jsonData) {
if (jsonData == null)
return null;
if ("".equals(jsonData))
return null;
Type listType = new TypeToken<LinkedList<T>>() {
}.getType();
Gson gson = new Gson();
LinkedList<T> entitys = gson.fromJson(jsonData, listType);
return entitys;
} // 获取URL
public static String getUrl(String service) {
StringBuilder sb = new StringBuilder();
sb.append("/sap/bc/icf/").append(service).append("?sap-client=")
.append(Helper.client);
return sb.toString();
} // 访问SAP服务
public static String callSAPService(PassParameter pp, String url,
List<BasicNameValuePair> pairs) {
String result = "";
HttpHost targetHost = new HttpHost(Helper.host, Helper.port, "http");
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials(pp.getUserName(), pp
.getPassword())); // // Create AuthCache instance
// AuthCache authCache = new BasicAuthCache();
// // Generate BASIC scheme object and add it to the local auth cache
// BasicScheme basicAuth = new BasicScheme();
// authCache.put(targetHost, basicAuth);
//
// // Add AuthCache to the execution context
// BasicHttpContext localcontext = new BasicHttpContext();
// localcontext.setAttribute(ClientContext.AUTH_SCHEME_PREF, authCache); HttpPost request = new HttpPost(url);
try {
request.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
result = null;// "UnsupportedEncodingException.";
}
ResponseHandler<String> handler = new BasicResponseHandler();
try {
result = httpclient.execute(targetHost, request, handler);
} catch (ClientProtocolException e) {
result = null;// "ClientException.";
} catch (IOException e) {
result = null;// "IOException.";
} catch (Exception e) {
result = null;
} httpclient.getConnectionManager().shutdown();
return result;
} // 禁用按钮
public static void disenableButton(Button button) {
if (button == null) {
return;
}
if (button.isEnabled()) {
button.setEnabled(false);
}
} // 启用按钮
public static void enableButton(Button button) {
if (button == null) {
return;
}
if (!button.isEnabled()) {
button.setEnabled(true);
}
} // 设置窗口标题图标
public static void setIcon(Activity act) {
Window win = act.getWindow();
win.requestFeature(Window.FEATURE_LEFT_ICON);
win.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
R.drawable.fc24);
} // 判断手机电量,低于10%给予用户一个提示
private static Activity bat_activity; public static void checkBattery(Activity activity) {
bat_activity = activity;
bat_activity.registerReceiver(mReceiver, new IntentFilter(
Intent.ACTION_BATTERY_CHANGED));
} private static BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra("level", 0);
// level加%就是当前电量了
if (level <= 10) {
new AlertDialog.Builder(bat_activity).setTitle("提醒")
.setMessage("你的手机电量现在只有" + level + "%\n请及时充电!")
.setPositiveButton("确定", null).show();
}
// 注销对手机电量的监听
bat_activity.unregisterReceiver(mReceiver);
}
}; // 判断3G网络或者WIFI网络连接
public static boolean checkNet(Activity activity) {
ConnectivityManager mConnectivity = (ConnectivityManager) activity
.getSystemService(Context.CONNECTIVITY_SERVICE);
TelephonyManager mTelephony = (TelephonyManager) activity
.getSystemService(Context.TELEPHONY_SERVICE);
// 检查网络连接,如果无网络可用,就不需要进行连网操作等
NetworkInfo info = mConnectivity.getActiveNetworkInfo();
if (info == null || !mConnectivity.getBackgroundDataSetting()) {
return false;
}
// 判断网络连接类型,3G或wifi里是否连接
int netType = info.getType();
int netSubtype = info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI) {
return info.isConnected();
} else if (netType == ConnectivityManager.TYPE_MOBILE
&& netSubtype == TelephonyManager.NETWORK_TYPE_UMTS
&& !mTelephony.isNetworkRoaming()) {
return info.isConnected();
} else {
return false;
}
} // 弹出错误信息
public static void message(Activity activity, String msg) {
new AlertDialog.Builder(activity).setTitle("错误").setMessage(msg)
.setPositiveButton("确定", null).show();
} // 获取手机号码,但不一定能获取到,如果SIM卡已经写入了本机号码便能获取
public static String getPhoneNumber(Activity activity) {
TelephonyManager tm = (TelephonyManager) activity
.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getLine1Number();
} public static boolean checkRadioButton(TableLayout tab) {
int count = tab.getChildCount();
boolean flag = false;
TableRow row;
RadioButton radio;
for (int i = 1; i < count; i++) {
row = (TableRow) tab.getChildAt(i);
radio = (RadioButton) row.getChildAt(0);
if (radio.isChecked()) {
flag = true;
}
}
return flag;
} }
MyApplication类:
/**
* 完美退出系统
*/
package com.fungchoi.sap.util; import java.util.LinkedList;
import java.util.List; import android.app.Activity;
import android.app.Application; /**
* @author Administrator
*
*/
public class MyApplication extends Application {
private List<Activity> activityList = new LinkedList<Activity>();
private static MyApplication instance; /**
*
*/
private MyApplication() {
// TODO Auto-generated constructor stub
} // 单例模式中获取唯一的MyApplication实例
public static MyApplication getInstance() {
if (null == instance) {
instance = new MyApplication();
}
return instance;
} // 添加Activity到容器中
public void addActivity(Activity activity) {
activityList.add(activity);
} // 遍历所有Activity并finish
public void exit() {
for (Activity activity : activityList) {
activity.finish();
}
System.exit(0);
}
}
图片资源文件:
布局资源文件:
login.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strLogin" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strUserName" ></TextView>
<EditText
android:id="@+id/txtUserName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPassword" ></TextView>
<EditText
android:id="@+id/txtPassword"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPassword">
</EditText>
</LinearLayout> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <Button
android:id="@+id/btnLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strLoginText"
android:layout_gravity="right"
android:textStyle="bold" ></Button> </LinearLayout>
main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strQuery"
android:textStyle="bold" >
</TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white" >
</TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strBeginDate"
android:textStyle="bold" >
</TextView> <EditText
android:id="@+id/txtBeginDate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="date" >
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strEndDate"
android:textStyle="bold" >
</TextView> <EditText
android:id="@+id/txtEndDate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="date" >
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strAufnr"
android:textStyle="bold" >
</TextView> <EditText
android:id="@+id/txtOrderCode"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="number" >
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strMatnr"
android:textStyle="bold" >
</TextView> <EditText
android:id="@+id/txtMatnr"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text" >
</EditText>
</LinearLayout> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white" >
</TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" > <Button
android:id="@+id/btnPrevious00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" >
</Button> <Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strStart"
android:textStyle="bold" >
</Button>
</LinearLayout> </LinearLayout>
orderlist.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strOrderlist" ></TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <ScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scrollbars="vertical" >
<HorizontalScrollView
android:id="@+id/horizontalScrollView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true" >
<TableLayout
android:id="@+id/tabOrderList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="2" >
<TableRow>
<RadioButton
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="invisible"></RadioButton>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strAufnr2" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strMatnr2" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strQuantity" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strUnit" ></TextView>
</TableRow>
</TableLayout>
</HorizontalScrollView>
</ScrollView> <TextView
android:id="@+id/line4"
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrevious01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" ></Button>
<Button
android:id="@+id/btnNext01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strNext"
android:textStyle="bold" ></Button>
</LinearLayout> </LinearLayout>
steplist.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strSteplist" ></TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <ScrollView
android:id="@+id/scrollView2"
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scrollbars="vertical" >
<HorizontalScrollView
android:id="@+id/horizontalScrollView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true" >
<TableLayout
android:id="@+id/tabStepList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="2" >
<TableRow>
<RadioButton
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="invisible"></RadioButton>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strVornr" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strItxa1" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strMgvrg" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strMeinh" ></TextView>
</TableRow>
</TableLayout>
</HorizontalScrollView>
</ScrollView> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrevious02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" ></Button>
<Button
android:id="@+id/btnNext02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strNext"
android:textStyle="bold" ></Button>
</LinearLayout> </LinearLayout>
zuoye.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strZuoye" ></TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strVgw01" ></TextView>
<EditText
android:id="@+id/txtVgw01"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="numberDecimal">
</EditText>
<EditText
android:id="@+id/txtVge01"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strVgw02" ></TextView>
<EditText
android:id="@+id/txtVgw02"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="numberDecimal">
</EditText>
<EditText
android:id="@+id/txtVge02"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strVgw03" ></TextView>
<EditText
android:id="@+id/txtVgw03"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="numberDecimal">
</EditText>
<EditText
android:id="@+id/txtVge03"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strVgw04" ></TextView>
<EditText
android:id="@+id/txtVgw04"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="numberDecimal">
</EditText>
<EditText
android:id="@+id/txtVge04"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strVgw05" ></TextView>
<EditText
android:id="@+id/txtVgw05"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="numberDecimal">
</EditText>
<EditText
android:id="@+id/txtVge05"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strVgw06" ></TextView>
<EditText
android:id="@+id/txtVgw06"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="numberDecimal">
</EditText>
<EditText
android:id="@+id/txtVge06"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:inputType="text">
</EditText>
</LinearLayout> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrevious03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" ></Button>
<Button
android:id="@+id/btnNext03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strNext"
android:textStyle="bold" ></Button>
</LinearLayout> </LinearLayout>
datetime.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strDatetime" ></TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<EditText
android:id="@+id/txtISDD"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="date">
</EditText>
<EditText
android:id="@+id/txtISDZ"
android:layout_width="100dip"
android:layout_height="wrap_content"
android:inputType="time">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<EditText
android:id="@+id/txtIEDD"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="date">
</EditText>
<EditText
android:id="@+id/txtIEDZ"
android:layout_width="100dip"
android:layout_height="wrap_content"
android:inputType="time">
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true">
<EditText
android:id="@+id/txtBUDAT"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:inputType="date">
</EditText>
</LinearLayout> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrevious04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" ></Button>
<Button
android:id="@+id/btnNext04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strNext"
android:textStyle="bold" ></Button>
</LinearLayout> </LinearLayout>
equiment.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strEquipment" ></TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <ScrollView
android:id="@+id/scrollView3"
android:layout_width="fill_parent"
android:layout_height="300dip"
android:scrollbars="vertical" >
<HorizontalScrollView
android:id="@+id/horizontalScrollView3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true" >
<TableLayout
android:id="@+id/tabEquipmentList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="2" >
<TableRow>
<RadioButton
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="invisible"></RadioButton>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strZzsb" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strZzsbms" ></TextView>
</TableRow>
</TableLayout>
</HorizontalScrollView>
</ScrollView> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrevious05"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" ></Button>
<Button
android:id="@+id/btnFinish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strFinish"
android:textStyle="bold" ></Button>
</LinearLayout> </LinearLayout>
result.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:textStyle="bold"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/strResult" ></TextView> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:id="@+id/txtContent"
android:textStyle="bold"
android:layout_width="fill_parent"
android:layout_height="wrap_content" ></TextView>
</LinearLayout> <TextView
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/white"></TextView> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrevious06"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strPrevious"
android:textStyle="bold" ></Button>
<Button
android:id="@+id/btnExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strExit"
android:textStyle="bold" ></Button>
</LinearLayout>
</LinearLayout>
最后奉上程序清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fungchoi.sap"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
<!-- Internet Permissions -->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!-- Network State Permissions -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application
android:icon="@drawable/fc48"
android:label="@string/app_name" >
<activity
android:name=".LoginActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
<activity
android:name=".OrderListActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
<activity
android:name=".StepListActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
<activity
android:name=".ZuoYeActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
<activity
android:name=".DateTimeActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
<activity
android:name=".EquipmentActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
<activity
android:name=".ResultActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="nosensor"></activity>
</application> </manifest>
最终的效果图:
说完Android Client部分,现在来聊一聊SAP部分:
首先得应用事务码SICF创建ICF服务:
现在来看一看每一个服务的处理逻辑部分
service0000:
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
data: lv_username type String,
lv_password type String. lv_username = server->request->get_form_field( 'UserName' )."get_form_field get_uri_parameter get_header_field
lv_password = server->request->get_form_field( 'Password' )."get_form_field CALL METHOD server->response->set_header_field( name = 'Content-Type' value = 'text/plain; charset=utf-8' ).
call method server->response->set_cdata( data = 'success' ). endmethod.
service0001:
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
data: lv_begindate type afko-gstrp,
lv_enddate type afko-gltrp,
lv_ordercode type String,
lv_material type makt-maktx, wa_list type ZFC_PPS029,
ltd_list like table of wa_list,
lv_count type i,
lv_OrderList type ref to ZJSON4ABAP,
content type string. lv_begindate = server->request->get_form_field( 'BeginDate' )."get_form_field get_uri_parameter get_header_field
lv_enddate = server->request->get_form_field( 'EndDate' )."get_form_field
lv_ordercode = server->request->get_form_field( 'OrderCode' )."get_form_field
lv_material = server->request->get_form_field( 'MaterialDesc' )."get_form_field CALL FUNCTION 'ZFC_PPF011'
EXPORTING
BEGINDATE = lv_begindate
ENDDATE = lv_enddate
ORDERCODE = lv_ordercode
MATERIALDESC = lv_material
TABLES
ORDERLIST = ltd_list. CALL METHOD server->response->set_header_field( name = 'Content-Type' value = 'text/plain; charset=utf-8' ). describe table ltd_list lines lv_count.
if lv_count > .
create object lv_OrderList.
content = lv_OrderList->json( abapdata = ltd_list name = '' ).
endif. call method server->response->set_cdata( data = content ). endmethod.
service0002:
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
data: lv_ordercode type afko-aufnr, wa_list type ZFC_PPS030,
ltd_list like table of wa_list,
lv_count type i,
StepList type ref to ZJSON4ABAP,
content type string. lv_ordercode = server->request->get_form_field( 'OrderCode' )."get_form_field get_uri_parameter get_header_field CALL FUNCTION 'ZFC_PPF012'
EXPORTING
ORDERCODE = lv_ordercode
TABLES
STEPLIST = ltd_list. CALL METHOD server->response->set_header_field( name = 'Content-Type' value = 'text/plain; charset=utf-8' ). describe table ltd_list lines lv_count.
if lv_count > .
create object StepList.
content = StepList->json( abapdata = ltd_list name = '' ).
endif. call method server->response->set_cdata( data = content ). endmethod.
service0003:
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
data: lv_ordercode type afko-aufnr,
lv_vornr type afvc-vornr,
lv_quantity type afvv-mgvrg, wa_list type ZFC_PPS031,
ltd_list like table of wa_list,
lv_count type i,
ZuoYeList type ref to ZJSON4ABAP,
content type string. lv_ordercode = server->request->get_form_field( 'OrderCode' )."get_form_field get_uri_parameter get_header_field
lv_vornr = server->request->get_form_field( 'StepCode' )."get_form_field
lv_quantity = server->request->get_form_field( 'Quantity' )."get_form_field CALL FUNCTION 'ZFC_PPF013'
EXPORTING
ORDERCODE = lv_ordercode
STEPNUM = lv_vornr
QUANTITY = lv_quantity
TABLES
ZUOYE = ltd_list. CALL METHOD server->response->set_header_field( name = 'Content-Type' value = 'text/plain; charset=utf-8' ). describe table ltd_list lines lv_count.
if lv_count > .
create object ZuoYeList.
content = ZuoYeList->json( abapdata = ltd_list name = '' ).
endif. call method server->response->set_cdata( data = content ). endmethod.
service0004:
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
data: lv_ordercode type afko-aufnr, wa_list type ZFC_PPS032,
ltd_list like table of wa_list,
lv_count type i,
MachineList type ref to ZJSON4ABAP,
content type string. lv_ordercode = server->request->get_form_field( 'OrderCode' )."get_form_field get_uri_parameter get_header_field CALL FUNCTION 'ZFC_PPF014'
EXPORTING
ORDERCODE = lv_ordercode
TABLES
MACHINELIST = ltd_list. CALL METHOD server->response->set_header_field( name = 'Content-Type' value = 'text/plain; charset=utf-8' ). describe table ltd_list lines lv_count.
if lv_count > .
create object MachineList.
content = MachineList->json( abapdata = ltd_list name = '' ).
endif. call method server->response->set_cdata( data = content ). endmethod.
service0005:
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
data: lv_AUFNR type afru-aufnr,
lv_VORNR type afru-vornr,
lv_LMNGA type BDC_FVAL,"afru-lmnga,
lv_MEINH type afru-meinh,
lv_ISM01 type BDC_FVAL,"afru-ism01,
lv_ILE01 type afru-ile01,
lv_ISM02 type BDC_FVAL,"afru-ism02,
lv_ILE02 type afru-ile02,
lv_ISM03 type BDC_FVAL,"afru-ism03,
lv_ILE03 type afru-ile03,
lv_ISM04 type BDC_FVAL,"afru-ism04,
lv_ILE04 type afru-ile04,
lv_ISM05 type BDC_FVAL,"afru-ism05,
lv_ILE05 type afru-ile05,
lv_ISM06 type BDC_FVAL,"afru-ism06,
lv_ILE06 type afru-ile06,
lv_ISDD type afru-isdd,
lv_ISDZ type afru-isdz,
lv_IEDD type afru-iedd,
lv_IEDZ type afru-iedz,
lv_BUDAT type afru-budat,
lv_LTXA1 type afru-ltxa1,
lv_ZZSB type afru-zzsb, wa_list type ZFC_PPS029,
ltd_list like table of wa_list,
lv_count type i,
lv_OrderList type ref to ZJSON4ABAP,
content type string. lv_AUFNR = server->request->get_form_field( 'AUFNR' ).
lv_VORNR = server->request->get_form_field( 'VORNR' ).
lv_LMNGA = server->request->get_form_field( 'LMNGA' ).
lv_MEINH = server->request->get_form_field( 'MEINH' ).
lv_ISM01 = server->request->get_form_field( 'ISM01' ).
lv_ILE01 = server->request->get_form_field( 'ILE01' ).
lv_ISM02 = server->request->get_form_field( 'ISM02' ).
lv_ILE02 = server->request->get_form_field( 'ILE02' ).
lv_ISM03 = server->request->get_form_field( 'ISM03' ).
lv_ILE03 = server->request->get_form_field( 'ILE03' ).
lv_ISM04 = server->request->get_form_field( 'ISM04' ).
lv_ILE04 = server->request->get_form_field( 'ILE04' ).
lv_ISM05 = server->request->get_form_field( 'ISM05' ).
lv_ILE05 = server->request->get_form_field( 'ILE05' ).
lv_ISM06 = server->request->get_form_field( 'ISM06' ).
lv_ILE06 = server->request->get_form_field( 'ILE06' ).
lv_ISDD = server->request->get_form_field( 'ISDD' ).
lv_ISDZ = server->request->get_form_field( 'ISDZ' ).
lv_IEDD = server->request->get_form_field( 'IEDD' ).
lv_IEDZ = server->request->get_form_field( 'IEDZ' ).
lv_BUDAT = server->request->get_form_field( 'BUDAT' ).
lv_LTXA1 = server->request->get_form_field( 'LTXA1' ).
lv_ZZSB = server->request->get_form_field( 'ZZSB' ). CALL FUNCTION 'ZFC_PPF015'
EXPORTING
AUFNR = lv_AUFNR
VORNR = lv_VORNR
LMNGA = lv_LMNGA
MEINH = lv_MEINH ISM01 = lv_ISM01
ILE01 = lv_ILE01 ISM02 = lv_ISM02
ILE02 = lv_ILE02 ISM03 = lv_ISM03
ILE03 = lv_ILE03 ISM04 = lv_ISM04
ILE04 = lv_ILE04 ISM05 = lv_ISM05
ILE05 = lv_ILE05 ISM06 = lv_ISM06
ILE06 = lv_ILE06 ISDD = lv_ISDD
ISDZ = lv_ISDZ IEDD = lv_IEDD
IEDZ = lv_IEDZ BUDAT = lv_BUDAT
LTXA1 = lv_LTXA1
ZZSB = lv_ZZSB
IMPORTING
MESSAGE = content. CALL METHOD server->response->set_header_field( name = 'Content-Type' value = 'text/plain; charset=utf-8' ). call method server->response->set_cdata( data = content ). endmethod.
在每一个服务处理逻辑里面又分别引用到了SAP处理函数:
FUNCTION ZFC_PPF011.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(BEGINDATE) TYPE CO_GSTRP
*" VALUE(ENDDATE) TYPE CO_GLTRP
*" VALUE(ORDERCODE) TYPE STRING OPTIONAL
*" VALUE(MATERIALDESC) TYPE MAKTX OPTIONAL
*" TABLES
*" ORDERLIST STRUCTURE ZFC_PPS029 OPTIONAL
*"---------------------------------------------------------------------- data: lv_text type string,
lv_code type string,
lv_temp type string,
lth_orderlist type ZFC_PPS029. concatenate '%' MATERIALDESC '%' into lv_text.
concatenate '%' ORDERCODE '%' into lv_code. select ak~AUFNR
mt~MAKTX
ak~GAMNG
ak~IGMNG
ak~GMEIN as MEINS
ta~mseht
into corresponding fields of table orderlist
from afko as ak
inner join makt as mt on mt~matnr = ak~plnbez and mt~spras = ''
left join t006a as ta on ta~msehi = ak~gmein and ta~spras = ''
where ak~aufnr like lv_code and
( ( ak~gstrp between begindate and enddate ) or ( ak~gltrp between begindate and enddate ) ) and
mt~maktx like lv_text. loop at orderlist into lth_orderlist.
clear lv_temp.
select single js~stat
into lv_temp
from aufk as ak
inner join jest as js on ak~OBJNR = js~OBJNR and js~INACT <> 'X'
inner join tj02t as tt on tt~ISTAT = js~STAT and tt~SPRAS = ''
where ak~aufnr = lth_orderlist-aufnr and ( tt~ISTAT = 'I0002' or tt~ISTAT = 'I0010' ). if lv_temp <> 'I0002' and lv_temp <> 'I0010'.
delete table orderlist from lth_orderlist.
endif.
endloop. sort orderlist by aufnr descending. ENDFUNCTION.
FUNCTION ZFC_PPF012.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(ORDERCODE) TYPE AUFNR
*" TABLES
*" STEPLIST STRUCTURE ZFC_PPS030 OPTIONAL
*"---------------------------------------------------------------------- data: lth_steplist type ZFC_PPS030,
lv_sum type afvv-mgvrg. select distinct
ac~vornr"工序序号
ac~steus"控制码
ac~ltxa1"工序描述
av~mgvrg"工序数量
av~MEINH"作业/工序的计量单位
ta~mseht"中文单位
ac~rueck"确认号
into corresponding fields of table steplist
from afko as ak
inner join afvc as ac on ac~aufpl = ak~aufpl
inner join afvv as av on av~aufpl = ac~aufpl and av~aplzl = ac~aplzl
left join t006a as ta on ta~msehi = av~meinh and ta~spras = ''
where ak~aufnr = ordercode and ( ac~steus = 'ZP01' or ac~steus = 'ZP03' ). loop at steplist into lth_steplist.
clear lv_sum.
select sum( gmnga ) into lv_sum
from afru
where rueck = lth_steplist-rueck and STOKZ = '' and STZHL = ''."STOKZ = 'X'表示已冲销,被取消报工的原始记录;STZHL >= 1 表示取消报工的记录
if lv_sum > .
lth_steplist-mgvrg = lth_steplist-mgvrg - lv_sum.
if lth_steplist-mgvrg <= .
delete table steplist from lth_steplist.
else.
modify steplist from lth_steplist transporting mgvrg.
endif.
endif.
endloop. sort steplist by vornr ascending. ENDFUNCTION.
FUNCTION ZFC_PPF013.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(ORDERCODE) TYPE AUFNR
*" VALUE(STEPNUM) TYPE VORNR
*" VALUE(QUANTITY) TYPE MGVRG
*" TABLES
*" ZUOYE STRUCTURE ZFC_PPS031 OPTIONAL
*"----------------------------------------------------------------------
data: begin of lth_zuoye,
BMSCH like afvv-bmsch,
VGW01 like afvv-vgw01,
VGW02 like afvv-vgw02,
VGW03 like afvv-vgw03,
VGW04 like afvv-vgw04,
VGW05 like afvv-vgw05,
VGW06 like afvv-vgw06,
VGE01 like afvv-vge01,
VGE02 like afvv-vge02,
VGE03 like afvv-vge03,
VGE04 like afvv-vge04,
VGE05 like afvv-vge05,
VGE06 like afvv-vge06,
MGVRG like afvv-mgvrg,
end of lth_zuoye,
lth_zuoye2 type zfc_pps031. select single
av~BMSCH
av~VGW01
av~VGW02
av~VGW03
av~VGW04
av~VGW05
av~VGW06
av~VGE01
av~VGE02
av~VGE03
av~VGE04
av~VGE05
av~VGE06
av~MGVRG
into (lth_zuoye-BMSCH,
lth_zuoye-VGW01,
lth_zuoye-VGW02,
lth_zuoye-VGW03,
lth_zuoye-VGW04,
lth_zuoye-VGW05,
lth_zuoye-VGW06,
lth_zuoye-VGE01,
lth_zuoye-VGE02,
lth_zuoye-VGE03,
lth_zuoye-VGE04,
lth_zuoye-VGE05,
lth_zuoye-VGE06,
lth_zuoye-MGVRG)
from afko as ak
inner join afvc as ac on ac~aufpl = ak~aufpl
inner join afvv as av on av~aufpl = ac~aufpl and av~aplzl = ac~aplzl
where ak~aufnr = ordercode and ac~vornr = stepnum and ( ac~steus = 'ZP01' or ac~steus = 'ZP03' ). if quantity <> lth_zuoye-mgvrg.
lth_zuoye-vgw01 = quantity * lth_zuoye-vgw01 / lth_zuoye-bmsch.
lth_zuoye-vgw02 = quantity * lth_zuoye-vgw02 / lth_zuoye-bmsch.
lth_zuoye-vgw03 = quantity * lth_zuoye-vgw03 / lth_zuoye-bmsch.
lth_zuoye-vgw04 = quantity * lth_zuoye-vgw04 / lth_zuoye-bmsch.
lth_zuoye-vgw05 = quantity * lth_zuoye-vgw05 / lth_zuoye-bmsch.
lth_zuoye-vgw06 = quantity * lth_zuoye-vgw06 / lth_zuoye-bmsch.
endif. if lth_zuoye-vgw01 >= .
lth_zuoye-vgw01 = lth_zuoye-vgw01 / .
lth_zuoye-vge01 = 'H'.
endif. if lth_zuoye-vgw02 >= .
lth_zuoye-vgw02 = lth_zuoye-vgw02 / .
lth_zuoye-vge02 = 'H'.
endif. if lth_zuoye-vgw03 >= .
lth_zuoye-vgw03 = lth_zuoye-vgw03 / .
lth_zuoye-vge03 = 'H'.
endif. if lth_zuoye-vgw05 >= .
lth_zuoye-vgw05 = lth_zuoye-vgw05 / .
lth_zuoye-vge05 = 'H'.
endif. if lth_zuoye-vgw06 >= .
lth_zuoye-vgw06 = lth_zuoye-vgw06 / .
lth_zuoye-vge06 = 'H'.
endif. move-corresponding lth_zuoye to lth_zuoye2.
append lth_zuoye2 to zuoye. ENDFUNCTION.
FUNCTION ZFC_PPF014.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(ORDERCODE) TYPE AUFNR
*" TABLES
*" MACHINELIST STRUCTURE ZFC_PPS032 OPTIONAL
*"---------------------------------------------------------------------- data: begin of lth_machine,
zzsb like zfc_pptm_sbnl-zzsb,
zzsbms like zfc_pptm_sbnl-zzsbms,
end of lth_machine. select distinct
sb~ZZSB
sb~ZZSBMS
into corresponding fields of table machinelist
from afko as ak
inner join afvc as ac on ac~aufpl = ak~aufpl
inner join afvv as av on av~aufpl = ac~aufpl and av~aplzl = ac~aplzl
left join crhd as ch on ch~objid = ac~arbid
inner join ZFC_PPTM_SBNL as sb on sb~arbpl = ch~arbpl
where ak~aufnr = ordercode and ( ac~steus = 'ZP01' or ac~steus = 'ZP03' ). loop at machinelist into lth_machine.
if lth_machine-zzsb+() = 'ZX'.
delete table machinelist from lth_machine.
endif.
endloop. sort machinelist by zzsb descending. ENDFUNCTION.
FUNCTION ZFC_PPF015.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(AUFNR) TYPE AUFNR
*" VALUE(VORNR) TYPE VORNR
*" VALUE(LMNGA) TYPE BDC_FVAL
*" VALUE(MEINH) TYPE RU_VORME
*" VALUE(ISM01) TYPE BDC_FVAL
*" VALUE(ILE01) TYPE CO_ISMNGEH
*" VALUE(ISM02) TYPE BDC_FVAL
*" VALUE(ILE02) TYPE CO_ISMNGEH
*" VALUE(ISM03) TYPE BDC_FVAL
*" VALUE(ILE03) TYPE CO_ISMNGEH
*" VALUE(ISM04) TYPE BDC_FVAL
*" VALUE(ILE04) TYPE CO_ISMNGEH
*" VALUE(ISM05) TYPE BDC_FVAL
*" VALUE(ILE05) TYPE CO_ISMNGEH
*" VALUE(ISM06) TYPE BDC_FVAL
*" VALUE(ILE06) TYPE CO_ISMNGEH
*" VALUE(ISDD) TYPE RU_ISDD
*" VALUE(ISDZ) TYPE RU_ISDZ
*" VALUE(IEDD) TYPE RU_IEDD
*" VALUE(IEDZ) TYPE RU_IEDZ
*" VALUE(BUDAT) TYPE BUCHDATUM
*" VALUE(LTXA1) TYPE CO_RTEXT
*" VALUE(ZZSB) TYPE ZZSB
*" EXPORTING
*" VALUE(MESSAGE) TYPE CHAR8000_D
*"---------------------------------------------------------------------- "-----------------先对生产订单进行校验-------开始---------------------
data: lv_aufnr like afko-aufnr,
lv_flag type c length ,
lv_iscan type c length value 'X'.
lv_aufnr = aufnr.
shift lv_aufnr left deleting leading ''.
lv_flag = lv_aufnr+().
if lv_flag = ''.
CALL FUNCTION 'ZFC_PPF038'
EXPORTING
P_AUFNR = aufnr
P_VORNR = vornr
IMPORTING
P_FLAG = lv_iscan. if lv_iscan = ''.
message = '半品组件存在不全完报工情况!'.
return.
endif.
endif.
"-----------------先对生产订单进行校验-------结束--------------------- DATA: bdcdata_wa TYPE BDCDATA,
bdcdata_tab TYPE TABLE OF BDCDATA.
DATA: wa_bdcmsg TYPE BDCMSGCOLL,
it_bdcmsg TYPE TABLE OF BDCMSGCOLL. DATA opt TYPE CTU_PARAMS. DATA: gth_timeticket type BAPI_PP_TIMETICKET,
gtd_timeticket type table of BAPI_PP_TIMETICKET. "设置初始值
CLEAR bdcdata_wa.
bdcdata_wa-program = 'SAPLCORU_S'.
bdcdata_wa-dynpro = ''.
bdcdata_wa-dynbegin = 'X'."开始标志
APPEND bdcdata_wa TO bdcdata_tab. "---------模拟屏字段赋值开始-----------------------------
"生产订单
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-AUFNR'.
bdcdata_wa-fval = AUFNR.
APPEND bdcdata_wa TO bdcdata_tab. "工序
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-VORNR'.
bdcdata_wa-fval = VORNR.
APPEND bdcdata_wa TO bdcdata_tab. "确认类型
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-AUERU'.
bdcdata_wa-fval = ''.
APPEND bdcdata_wa TO bdcdata_tab. "产量
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-LMNGA'.
bdcdata_wa-fval = LMNGA.
APPEND bdcdata_wa TO bdcdata_tab. "产量-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-MEINH'.
bdcdata_wa-fval = MEINH.
APPEND bdcdata_wa TO bdcdata_tab. "人工
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISM01'.
bdcdata_wa-fval = ISM01.
APPEND bdcdata_wa TO bdcdata_tab. "人工-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ILE01'.
bdcdata_wa-fval = ILE01.
APPEND bdcdata_wa TO bdcdata_tab. "动力
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISM02'.
bdcdata_wa-fval = ISM02.
APPEND bdcdata_wa TO bdcdata_tab. "动力-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ILE02'.
bdcdata_wa-fval = ILE02.
APPEND bdcdata_wa TO bdcdata_tab. "机器
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISM03'.
bdcdata_wa-fval = ISM03.
APPEND bdcdata_wa TO bdcdata_tab. "机器-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ILE03'.
bdcdata_wa-fval = ILE03.
APPEND bdcdata_wa TO bdcdata_tab. "油墨
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISM04'.
bdcdata_wa-fval = ISM04.
APPEND bdcdata_wa TO bdcdata_tab. "油墨-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ILE04'.
bdcdata_wa-fval = ILE04.
APPEND bdcdata_wa TO bdcdata_tab. "通用材料
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISM05'.
bdcdata_wa-fval = ISM05.
APPEND bdcdata_wa TO bdcdata_tab. "通用材料-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ILE05'.
bdcdata_wa-fval = ILE05.
APPEND bdcdata_wa TO bdcdata_tab. "其他
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISM06'.
bdcdata_wa-fval = ISM06.
APPEND bdcdata_wa TO bdcdata_tab. "其他-单位
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ILE06'.
bdcdata_wa-fval = ILE06.
APPEND bdcdata_wa TO bdcdata_tab. "开始执行日期
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISDD'.
bdcdata_wa-fval = ISDD.
APPEND bdcdata_wa TO bdcdata_tab. "开始执行时间
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-ISDZ'.
bdcdata_wa-fval = ISDZ.
APPEND bdcdata_wa TO bdcdata_tab. "结束执行日期
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-IEDD'.
bdcdata_wa-fval = IEDD.
APPEND bdcdata_wa TO bdcdata_tab. "结束执行时间
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-IEDZ'.
bdcdata_wa-fval = IEDZ.
APPEND bdcdata_wa TO bdcdata_tab. "记账日期
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-BUDAT'.
bdcdata_wa-fval = BUDAT.
APPEND bdcdata_wa TO bdcdata_tab. "确认文本
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-LTXA1'.
bdcdata_wa-fval = LTXA1.
APPEND bdcdata_wa TO bdcdata_tab. "设备编号
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'ZAFRU-ZZSB'.
bdcdata_wa-fval = ZZSB.
APPEND bdcdata_wa TO bdcdata_tab. * "工厂
* CLEAR bdcdata_wa.
* bdcdata_wa-fnam = 'AFVGD-WERKS'.
* bdcdata_wa-fval = '1000'.
* APPEND bdcdata_wa TO bdcdata_tab.
*
* "工作中心
* CLEAR bdcdata_wa.
* bdcdata_wa-fnam = 'AFVGD-ARBPL'.
* bdcdata_wa-fval = 'ZX030104'.
* APPEND bdcdata_wa TO bdcdata_tab.
*
* "物料
* CLEAR bdcdata_wa.
* bdcdata_wa-fnam = 'CAUFVD-MATNR'.
* bdcdata_wa-fval = '610000000001'.
* APPEND bdcdata_wa TO bdcdata_tab. "获取确认号
gth_timeticket-ORDERID = AUFNR.
gth_timeticket-OPERATION = VORNR.
append gth_timeticket to gtd_timeticket.
CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP'
TABLES
TIMETICKETS = gtd_timeticket.
IF SY-SUBRC = .
read table gtd_timeticket index into gth_timeticket.
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'AFRUD-RUECK'.
bdcdata_wa-fval = gth_timeticket-CONF_NO.
APPEND bdcdata_wa TO bdcdata_tab.
endif.
"---------模拟屏字段赋值结束----------------------------- "模拟点击屏幕保存按钮
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '=BU'.
APPEND bdcdata_wa TO bdcdata_tab. "-----------------为了避开--是否确定选择额外设备?--开始-------------------------------
CLEAR bdcdata_wa.
bdcdata_wa-program = 'SAPLXCOF'.
bdcdata_wa-dynpro = ''.
bdcdata_wa-dynbegin = 'X'."开始标志
APPEND bdcdata_wa TO bdcdata_tab.
"回车
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '/00'.
APPEND bdcdata_wa TO bdcdata_tab.
"确定
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '=YES'.
APPEND bdcdata_wa TO bdcdata_tab.
"回车
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '/00'.
APPEND bdcdata_wa TO bdcdata_tab.
"-----------------为了避开--是否确定选择额外设备?--结束------------------------------- "-----------------为了避开--过量交货黄色警告信息--开始-------------------------------
CLEAR bdcdata_wa.
bdcdata_wa-program = 'SAPLCORU_S'.
bdcdata_wa-dynpro = ''.
bdcdata_wa-dynbegin = 'X'."开始标志
APPEND bdcdata_wa TO bdcdata_tab.
"回车
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '/00'.
APPEND bdcdata_wa TO bdcdata_tab.
"确定
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '/00'.
APPEND bdcdata_wa TO bdcdata_tab.
"回车
CLEAR bdcdata_wa.
bdcdata_wa-fnam = 'BDC_OKCODE'.
bdcdata_wa-fval = '/00'.
APPEND bdcdata_wa TO bdcdata_tab.
"-----------------为了避开--过量交货黄色警告信息--结束------------------------------- opt-dismode = 'N'.
opt-defsize = 'X'.
CALL TRANSACTION 'CO11N' USING bdcdata_tab OPTIONS FROM opt MESSAGES INTO it_bdcmsg. IF SY-SUBRC = .
MESSAGE = '报工成功!'.
ELSE.
data: lv_temp type string.
MESSAGE = '报工失败!请尝试在SAP系统报工。服务器程序执行错误。'.
LOOP AT it_bdcmsg INTO wa_bdcmsg.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = wa_bdcmsg-msgid
msgnr = wa_bdcmsg-msgnr
msgv1 = wa_bdcmsg-msgv1
msgv2 = wa_bdcmsg-msgv2
msgv3 = wa_bdcmsg-msgv3
msgv4 = wa_bdcmsg-msgv4
IMPORTING
message_text_output = lv_temp.
concatenate message lv_temp into message.
ENDLOOP.
ENDIF. ENDFUNCTION.
SAP里面引用到的数据结构就不弄出来了,太麻烦了。
跟SAP系统集成的Android应用的更多相关文章
- 在做和sap系统集成的一点心得
最这一个月和sap做集成,把主数据中的数据写入到sap系统中,做集成就离不开联调,平时开发中,一个复杂点的系统还容易出问题,涉及到两个系统,由于两个或多个系统来自不同的厂家,各个厂家的开发对业务的理解 ...
- SAP 传感器辅助定位
一.简述 SAP:Sensor Assist Position 传感器辅助定位.高通公司提供的技术方案,旨在提升当卫星信号较差或终端短暂丢失卫星信号时终端的定位能力.该方案可分为三个阶段,第一.二阶段 ...
- Hybris安装和各个Extention简单介绍
前言:突然想好好梳理一下这几个月所学的内容了,顺便让自己的知识有一个系统的框架. 一. 安装JDK 请安装最新的Oracle JDK 8.0版(从Oracle官网下载). 二.开发工具建议使用 In ...
- Hello World, S/4HANA for Customer Management 1.0
SAP CRM的前世今生 在我之前的微信公众号文章 SAP的这三款CRM解决方案,您能区分清楚么我曾经提到过我作为成都SAP研究院CRM产品开发团队的一员工作过一段时间. 我向在SAP德国总部工作的德 ...
- HTML5应用 + Cordova = 平台相关的混合应用
Jerry之前的一篇文章 SAP Fiori应用的三种部署方式 曾经提到SAP Fiori应用的三种部署方式: On Premise环境下以ABAP BSP应用作为Fiori应用部署和运行的载体 部署 ...
- android使用ksoap2调用sap的webservice
public void on_clicked(View view) { Thread webserviceThread = new Thread() { public void run() { Str ...
- [系统集成] Android 自动构建系统
一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包android 的打包一般 ...
- SAP C/4HANA Sales Cloud使用OData服务和第三方系统集成的一个具体例子
出于工作需要,Jerry写了这篇文章,给某些Partner做参考. 以前Jerry曾经介绍过SAP C/4HANA的五朵云到底包含哪些具体产品,其实在SAP官网上有更权威的中文解释: https:// ...
- SAP OData编程指南
OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用.我的文章标题前加上SAP的前缀,只是为了表明这篇文章介绍的是Jerry在SAP项 ...
随机推荐
- poj 2127 LCIS 带路径输出
这个题 用一维 为什么错了: 因为 用一维 dp 方程肯定也是一维:但是有没有想,第 i 个字符更新了 j 位置的最优结果,然后 k 字符又一次更新了 j 位置的最优值,然后 我的结果是 i ...
- Ubuntu跬步之图片管理digiKam
Ubuntu下自带了Image Viewer,具备基本的图片浏览功能. 偶尔有些图片需要分组,添加标注,幻灯片浏览等,所以找了款图片管理软件digiKam. 安装 Ubuntu Software Ce ...
- 用于科创的git log美化输出
git log --reverse --pretty=format:'%cd %s' --date=short > a.txt 更好的: git log --reverse --pretty=f ...
- Tomcat: localhost:8080 提示404
下午配置环境,配置完成后,欣喜地进入localhost:8080,结果给我提示404 心想:尼玛,这localhost都还会404,这不坑爹吗?! 琢磨了好久,结果被我搞定了,只需要做一个改动: 打开 ...
- 嵌入式 arm平台ping域名指定ip小结
在fs的目录/etc/下添加文件hosts,然后内容修改如下: 192.168.11.12 qycam.com ping qycam.com 解析为192.168.11.12
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
- 自定义View绘制字符串
import android.app.Activity; import android.os.Bundle; import android.view.Display; import android.v ...
- ORACLE TM锁
Oracle的TM锁类型 锁模式 锁描述 解释 SQL操作 0 none 1 NULL 空 Select 2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for upda ...
- HighChart 实现从后台取数据来实时更新柱状和折线组图
前段时间公司让弄图表,给我说有HighCharts这个js插件,于是上网上搜,由于本人是写后端的,对于JavaScript和jQuery不是很熟悉,虽然找到了模板,但是还是不明白,所以一点一点的改,但 ...
- 高级正则表达式技术(Python版)
正则表达式是从信息中搜索特定的模式的一把瑞士军刀.它们是一个巨大的工具库,其中的一些功能经常被忽视或未被充分利用.今天我将向你们展示一些正则表达式的高级用法. 举个例子,这是一个我们可能用来检测电话美 ...