今天经理考试CMMI开卷考试,真难,对于五个级别、22个过程域还算了解,但是对于下面的子实践就不太熟悉。
posted on 2008-01-16 18:14
振南—何氏 阅读(164)
评论(8) 编辑 收藏 网摘 所属分类:
CMMI,软件工程
发表评论
能不能提供一份试卷学习一下?呵呵,我正好相反,想考一下我的下属。多谢。
Imports Freeworks.SAP.Config
Public Class RfcFunction
Private SapFunctions As Object
Private SapTemplate As Object
Private SapConn As Object
Private RfcName As String
Public Sub New(ByVal rfcName As String)
SapFunctions = CreateObject("SAP.Functions")
'Login
SapConn = SapFunctions.Connection
SapConn.ApplicationServer = XmlReader.XmlGetValue("SAP", "SERVERNAME")
SapConn.Client = XmlReader.XmlGetValue("SAP", "CLIENT")
SapConn.User = XmlReader.XmlGetValue("SAP", "USERNAME")
SapConn.Password = Decrypt(XmlReader.XmlGetValue("SAP", "USERPWD"))
SapConn.systemnumber = XmlReader.XmlGetValue("SAP", "SYSTEMNUMBER")
SapConn.Language = XmlReader.XmlGetValue("SAP", "LANGUAGE")
Dim isLogin As Boolean = SapConn.Logon(0, True)
If isLogin = False Then
Throw New Exception(SapFunctions.Exception.ToString())
End If
Me.RfcName = rfcName
SapTemplate = SapFunctions.Add(rfcName)
End Sub
Public Sub SetImport(ByVal paraName As String, ByVal paraValue As Object)
SapTemplate.Exports(paraName) = paraValue
End Sub
Public Sub SetImport(ByVal paraName As String, ByVal paraValue As Object())
For i As Integer = 1 To paraValue.Length
SapTemplate.Exports(paraName).Value(i) = paraValue(i - 1)
Next
End Sub
Public Function GetImport(ByVal paraName As String) As Object
Return SapTemplate.Exports(paraName).Value
End Function
Public Function GetImport(ByVal paraName As String, ByVal size As Integer) As Object()
Dim ret(size - 1) As Object
For i As Integer = 1 To size
ret(i - 1) = SapTemplate.Exports(paraName).value(i)
Next
Return ret
End Function
Public Sub SetExport(ByVal paraName As String, ByVal paraValue As Object)
SapTemplate.Imports(paraName) = paraValue
End Sub
Public Sub SetExport(ByVal paraName As String, ByVal paraValue As Object())
For i As Integer = 1 To paraValue.Length
SapTemplate.Imports(paraName).Value(i) = paraValue(i - 1)
Next
End Sub
Public Function GetExport(ByVal paraName As String) As Object
Return SapTemplate.Imports(paraName).Value
End Function
Public Function GetExport(ByVal paraName As String, ByVal size As Integer) As Object()
Dim ret(size - 1) As Object
For i As Integer = 1 To size
ret(i - 1) = SapTemplate.Imports(paraName).value(i)
Next
Return ret
End Function
Public Sub setTable(ByVal tableName As String, ByVal tableData As DataTable)
Dim sapTable = SapTemplate.Tables.Item(tableName)
Dim row = 1
For Each dr As DataRow In tableData.Rows
sapTable.AppendRow()
For i As Integer = 1 To tableData.Columns.Count
Dim colName As String = tableData.Columns(i - 1).ColumnName
sapTable.Columns(colName.ToString()).Value(row) = dr(i - 1)
Next
row = row + 1
Next
End Sub
Public Sub Run()
SapTemplate.Call()
End Sub
Public Sub Reset(ByVal rfcName As String)
SapTemplate = Nothing
SapFunctions.Remove(Me.RfcName)
Me.RfcName = rfcName
SapTemplate = SapFunctions.Add(rfcName)
End Sub
Public Function GetTables() As DataSet
Dim ds As DataSet = New DataSet()
For Each tbl As Object In SapTemplate.tables
ds.Tables.Add(MapToDataTable(tbl))
Next
Return ds
End Function
Protected Overrides Sub Finalize()
If Not (SapConn Is Nothing) Then
Try
SapConn.LogOff()
Catch
End Try
End If
If Not (SapFunctions Is Nothing) Then
SapFunctions = Nothing
End If
End Sub
Public Sub Dispose()
SapFunctions.Remove(Me.RfcName)
If Not (SapConn Is Nothing) Then
Try
SapConn.LogOff()
Catch
End Try
End If
SapFunctions = Nothing
End Sub
'轉換數據存儲格式
Private Function MapToDataTable(ByVal sapRs As Object) As DataTable
Dim sapColumn As Object
Dim intRowCount As Long
Dim intColCount As Integer
Dim dataTable As DataTable = New DataTable(sapRs.name)
Dim rw As System.Data.DataRow
For Each sapColumn In sapRs.Columns
dataTable.Columns.Add(sapColumn.Name)
Next
For intRowCount = 1 To sapRs.RowCount
rw = dataTable.NewRow()
For intColCount = 1 To sapRs.ColumnCount
rw(intColCount - 1) = sapRs(intRowCount, intColCount)
Next
dataTable.Rows.Add(rw)
Next
Return dataTable
End Function
'解密函數
Private Function Decrypt(ByVal psPwd As String) As String
Dim i, j As Integer
Dim sStr As String
Dim c As Char
Dim chChar As Char
Dim nAsc As Integer
Dim b As Byte
sStr = ""
j = psPwd.Length
For i = 0 To j - 1
c = psPwd.Substring(i, 1)
b = Convert.ToByte(c)
nAsc = b
If nAsc > 54 And nAsc <= 122 Then
nAsc = nAsc - 22
ElseIf nAsc > 32 And nAsc <= 54 Then
nAsc = 100 + nAsc - 32
End If
chChar = Chr(nAsc)
sStr = sStr + chChar
Next i
Return sStr
End Function
End Class
Imports System.Xml
Namespace Config
Public Class XmlReader
Shared doc As XmlDocument = New XmlDocument
Shared IsLoad As Boolean = False
Sub New()
End Sub
Public Sub Init()
doc.LoadXml(AppDomain.CurrentDomain.BaseDirectory & "MyApp.xml")
IsLoad = True
End Sub
'取得配置信息
Public Shared Function XmlGetValue(ByVal section As String, ByVal key As String) As String
If IsLoad = False Then
doc.Load(AppDomain.CurrentDomain.BaseDirectory & "MyApp.xml")
IsLoad = True
End If
Dim sReturn As String
Dim node1 As System.Xml.XmlNode
sReturn = ""
node1 = doc.SelectSingleNode("/CONFIG/" & section & "/" & key)
sReturn = node1.InnerText
Return sReturn
End Function
End Class
End Namespace
<?xml version="1.0" encoding="utf-8" ?>
<CONFIG>
<!--
<SAP>
<CLIENT>802</CLIENT>
<SERVERNAME>10.134.28.98</SERVERNAME>
<SYSTEMNUMBER>0</SYSTEMNUMBER>
<USERNAME>gmo2005</USERNAME>
<USERPWD>,w//HFFK</USERPWD>
<LANGUAGE>EN</LANGUAGE>
</SAP>
-->
<SAP>
<CLIENT>502</CLIENT>
<SERVERNAME>10.134.140.157</SERVERNAME>
<SYSTEMNUMBER>00</SYSTEMNUMBER>
<USERNAME>FIHSD</USERNAME>
<USERPWD>($/W,</USERPWD>
<LANGUAGE>EN</LANGUAGE>
</SAP>
<APP>
<TimeoutSeconds>5000</TimeoutSeconds>
<IntervalMinutes>5</IntervalMinutes>
</APP>
</CONFIG>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using Freeworks.Common.Util;
using Freeworks.SAP;
using Freeworks.Common;
using System.Collections.Generic;
public class SAPCallHelper
{
public static DataSet SearchFromSAP(string order, string werks)
{
DataTable dt1 = new DataTable("ORDER");
DataTable dt2 = new DataTable("WERKS");
dt1.Columns.Add("AUFNR", typeof(string));
dt1.Rows.Add(order);
if (!string.IsNullOrEmpty(werks))
{
dt2.Columns.Add("DWERK", typeof(string));
dt2.Rows.Add(werks);
}
RfcFunction rfcCall = new RfcFunction("ZRFC_PP_MSE_0001");
rfcCall.setTable("ORDER", dt1);
rfcCall.setTable("WERKS", dt2);
rfcCall.Run();
DataSet rtnTables = rfcCall.GetTables();
rfcCall.Dispose();
return (rtnTables.Tables["HEADER"].Rows.Count == 0) ? null : rtnTables;
}
public static object[] MaterialInfoFetch(string MaterialNo, string Plant, string Good_LOC)
{
object[] retRecord = null;
DataTable dt1 = CreateSpecTable();
DataRow dr1 = dt1.NewRow();
object[] rowArray = new object[4] { "I", "EQ", MaterialNo, "" };
dr1.ItemArray = rowArray;
dt1.Rows.Add(dr1);
DataTable dt2 = CreateSpecTable();
DataRow dr2 = dt2.NewRow();
object[] rowArray2 = new object[4] { "I", "EQ", Plant, "" };
dr2.ItemArray = rowArray2;
dt2.Rows.Add(dr2);
RfcFunction rfcall = new RfcFunction("ZRFC_MM_FIH_CQS_0001");
rfcall.setTable("S_MATNR", dt1);
rfcall.setTable("S_WERKS", dt2);
rfcall.Run();
DataSet ds = rfcall.GetTables();
rfcall.Dispose();
if (ds.Tables["T_ZSS_CQS_OUTPUT"].Rows.Count != 0)
{
// DataRow[] drCollection = ds.Tables["T_ZSS_CQS_OUTPUT"].Select("LGPRO='"+Good_LOC+"'");
// DataRow dr = drCollection[0];
DataRow dr = ds.Tables["T_ZSS_CQS_OUTPUT"].Rows[0];
// Rows[0];//默認返回第一行的匹配記錄(應該傳入倉碼的)
//MATNR--物料号码
//MAKTX--物料描述(中文) //MAKTXE--物料描述(英文)
//MEINS--基本计量单位
//BKLAS--评估类/物料形態
//STPRS--标准价格
//WAERS--货币代码
retRecord = new object[] { dr["MATNR"], dr["MAKTXE"], dr["MEINS"], dr["BKLAS"], dr["STPRS"], dr["WAERS"] };
}
else
{
throw new BusiException(MaterialNo+"|" + Plant + ":無物料數據匹配");
}
return retRecord;
}
/// <summary>
/// 將其他的幣種轉換成美金結算
/// </summary>
/// <param name="FROM_CURR">需要轉換的幣種</param>
/// <returns></returns>
public static decimal ToUSDCurrencyRatio(string FROM_CURR)
{
decimal CurrencyRatio = 0.0M;
object RATE_TYPE = "M";
object TO_CURRNCY = "USD";
DateTime _DATE = DateTime.UtcNow;
RfcFunction rfcall = new RfcFunction("BAPI_EXCHANGERATE_GETDETAIL");
rfcall.SetImport("RATE_TYPE", RATE_TYPE);
rfcall.SetImport("FROM_CURR", FROM_CURR);
rfcall.SetImport("TO_CURRNCY", TO_CURRNCY);
rfcall.SetImport("DATE", _DATE);
rfcall.Run();
string msg = rfcall.GetExport("RETURN", 4)[3].ToString();
object[] OB = rfcall.GetExport("EXCH_RATE", 10);
rfcall.Dispose();
if (!string.IsNullOrEmpty(msg))
{
throw new BusiException(msg);
}
else
{
CurrencyRatio = Convert.ToDecimal(OB[4]);
}
return CurrencyRatio;
}
/// <summary>
/// 轉出轉出倉 過551
/// </summary>
/// <param name="TransferOutMaterials"></param>
/// <returns></returns>
public static string TransferOut(DataTable TransferOutMaterials)
{
string retMessage = string.Empty;
RfcFunction rfcaller = new RfcFunction("BAPI_GOODSMVT_CREATE");
Object[] Param_Date = new Object[2] { DateTime.Now, DateTime.Now };
Object[] Param_Code = new Object[1] { "03" };
rfcaller.SetImport("GOODSMVT_HEADER", Param_Date);
rfcaller.SetImport("GOODSMVT_CODE", Param_Code);
rfcaller.setTable("GOODSMVT_ITEM", TransferOutMaterials);
rfcaller.Run();
string MaterialDoc = rfcaller.GetExport("MATERIALDOCUMENT").ToString();
DataSet rtnds = rfcaller.GetTables();
if (rtnds.Tables["RETURN"].Rows.Count == 0 && MaterialDoc != "")//沒有錯誤返回
{
rfcaller.Reset("BAPI_TRANSACTION_COMMIT");
rfcaller.Run();
retMessage = "SUCCESS:" + MaterialDoc ;//過賬全部成功返回過賬單號
}
else
{
retMessage = "ERROR:" + rtnds.Tables["RETURN"].Rows[0]["MESSAGE"].ToString();
}
rfcaller.Dispose();//釋放連接
return retMessage;
}
/// <summary>
/// 轉入報廢倉 過501
/// </summary>
/// <param name="TransferInMaterials"></param>
/// <returns></returns>
public static string TransferIN(DataTable TransferInMaterials)
{
string retMessage = string.Empty;
RfcFunction rfcaller2 = new RfcFunction("BAPI_GOODSMVT_CREATE");
Object[] Param_Code2 = new Object[1] { "05" };
Object[] Param_Date = new Object[2] { DateTime.Now, DateTime.Now };
rfcaller2.SetImport("GOODSMVT_HEADER", Param_Date);
rfcaller2.SetImport("GOODSMVT_CODE", Param_Code2);
rfcaller2.setTable("GOODSMVT_ITEM", TransferInMaterials);
rfcaller2.Run();//執行從良品倉轉入
string MaterialDoc2 = rfcaller2.GetExport("MATERIALDOCUMENT").ToString();
DataSet rtnds2 = rfcaller2.GetTables();
if (rtnds2.Tables["RETURN"].Rows.Count == 0 && MaterialDoc2 != "")
{
rfcaller2.Reset("BAPI_TRANSACTION_COMMIT");
rfcaller2.Run();
retMessage = "SUCCESS:" + MaterialDoc2;//過賬全部成功返回過賬單號
}
else
{
retMessage = "ERROR:" + rtnds2.Tables["RETURN"].Rows[0]["MESSAGE"].ToString();
}
rfcaller2.Dispose();//釋放連接
return retMessage;
}
/// <summary>
/// 連續轉入轉出,現已不用
/// </summary>
/// <param name="TransferOutMaterials"></param>
/// <param name="TransferInMaterials"></param>
/// <returns></returns>
public static string AutoBillTransform(DataTable TransferOutMaterials, DataTable TransferInMaterials)
{
string retMessage = string.Empty;
Object[] Param_Date = new Object[2] { DateTime.Now, DateTime.Now };
Object[] Param_Code = new Object[1] { "03" };
RfcFunction rfcaller = new RfcFunction("BAPI_GOODSMVT_CREATE");
rfcaller.SetImport("GOODSMVT_HEADER", Param_Date);
rfcaller.SetImport("GOODSMVT_CODE", Param_Code);
rfcaller.setTable("GOODSMVT_ITEM", TransferOutMaterials);
rfcaller.Run();
string MaterialDoc = rfcaller.GetExport("MATERIALDOCUMENT").ToString();
DataSet rtnds = rfcaller.GetTables();
if (rtnds.Tables["RETURN"].Rows.Count == 0 && MaterialDoc != "")//沒有錯誤返回,繼續執行物料向報廢倉的移轉
{
//提交從良品倉中轉出
rfcaller.Reset("BAPI_TRANSACTION_COMMIT");
rfcaller.Run();
rfcaller.Dispose();
//SAP中同一個連接必須完成一個以後才可以提交第二個事務
RfcFunction rfcaller2 = new RfcFunction("BAPI_GOODSMVT_CREATE");//新建連接
Object[] Param_Code2 = new Object[1] { "05" };
rfcaller2.SetImport("GOODSMVT_HEADER", Param_Date);
rfcaller2.SetImport("GOODSMVT_CODE", Param_Code2);
rfcaller2.setTable("GOODSMVT_ITEM", TransferInMaterials);
rfcaller2.Run();//執行從良品倉轉入
string MaterialDoc2 = rfcaller2.GetExport("MATERIALDOCUMENT").ToString();
DataSet rtnds2 = rfcaller2.GetTables();
if (rtnds2.Tables["RETURN"].Rows.Count == 0 && MaterialDoc2 != "")
{
rfcaller2.Reset("BAPI_TRANSACTION_COMMIT");
rfcaller2.Run();
retMessage = "SUCCESS:" + MaterialDoc + "|" + MaterialDoc2;//過賬全部成功返回兩個過賬單號
rfcaller2.Dispose();//釋放連接
}
else//轉出成功,轉入失敗
{
retMessage = "ERROR:" + rtnds2.Tables["RETURN"].Rows[0]["MESSAGE"].ToString();
rfcaller2.Dispose();//釋放連接
}
}
else
{
retMessage = "ERROR:" + rtnds.Tables["RETURN"].Rows[0]["MESSAGE"].ToString();
rfcaller.Dispose();
}
return retMessage;
}
public static DataTable CreateSpecTable()
{
DataTable dt = new DataTable("S_EXTWG");
dt.Columns.Add("SIGN", typeof(string));
dt.Columns.Add("OPTION", typeof(string));
dt.Columns.Add("LOW", typeof(string));
dt.Columns.Add("HIGH", typeof(string));
return dt;
}
public struct RatioResult
{
public string type;
public decimal ratio;
}
protected static IEnumerable<RatioResult> GetCustomCurrencyRatio()
{
string[] CustomCur ={ "RMB", "JPY", "EUR"};
foreach (string item in CustomCur)
{
decimal result = SAPCallHelper.ToUSDCurrencyRatio(item);
if (0.0M == result)
{
throw new BusiException("沒有從"+item+"到USD的可用轉換匯率");
}
else
{
RatioResult r=new RatioResult();
r.type=item;
r.ratio=result;
yield return r;
}
}
}
public static IDictionary GetCurrRatioDict()
{
IEnumerable<RatioResult> r = GetCustomCurrencyRatio();
IDictionary dict = new Hashtable();
foreach (RatioResult rr in r)
{
dict.Add(rr.type, rr.ratio);
}
return dict;
}
}
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Common;
using NBear.Data;
using Freeworks.Entities;
using Freeworks.Common;
using Freeworks.Common.Reflection;
using Freeworks.Common.Util;
using SSES.Entities;
using BMIS.Common.BusiObject;
using Freeworks.Services.WFInterface;
using Freeworks.Services.OMSInterface;
using Freeworks.SAP;
case WebConstants.MSE_SSES_TASK_DIV:
//SAP過551
sql = @"SELECT B.MaterialNo AS MATERIAL,A.Plant,A.TransferOut AS STGE_LOC,' ' AS BATCH,
'551' AS MOVE_TYPE,B.ScrapQuantity AS ENTRY_QNT,A.ResponsibleDept AS COSTCENTER
FROM sseFormHead A(NOLOCK) INNER JOIN sseFormBody B(NOLOCK)
ON A.RequestNo = B.RequestNo WHERE A.PID=" + PID;
dt = SvcContext.DBFacade.FromCustomSql(sql).ToDataSet().Tables[0];
if (dt != null && dt.Rows.Count > 0)
{
Object[] Param_Date = new Object[2] { DateTime.Now, DateTime.Now };
Object[] Param_Code = new Object[1] { "03" };
rfcaller = new RfcFunction("BAPI_GOODSMVT_CREATE");
rfcaller.SetImport("GOODSMVT_HEADER", Param_Date);
rfcaller.SetImport("GOODSMVT_CODE", Param_Code);
rfcaller.setTable("GOODSMVT_ITEM", dt);
rfcaller.Run();
DataSet ds = rfcaller.GetTables();
string MaterialDoc2 = rfcaller.GetExport("MATERIALDOCUMENT").ToString();
if (ds.Tables["RETURN"].Rows.Count != 0 && MaterialDoc2 == "")
{
PopError("過賬失敗", new BusiException());
return;
}
rfcaller.Reset("BAPI_TRANSACTION_COMMIT");
rfcaller.Run();
rfcaller.Dispose();
}
formHead.Status = 551;
SvcContext.DBFacade.Save<SseFormHead>(formHead);
responsibles = BusiHelper.GetKeyApprover("SSE_WareHouse", "沒有設置倉庫簽核人員");
SvcContext.WFFacade.SetTaskResponsibleID(this.Token, this.PID, WebConstants.MSE_SSES_TASK_WHCONFIRM, responsibles);
SendEmail(responsibles, WebConstants.MSE_SSES_TASK_WHCONFIRM);
break;
case WebConstants.MSE_SSES_TASK_WHCONFIRM:
//倉庫實際過賬可能不一樣需要待定
//SAP倉庫點收過賬
sql = @"SELECT B.MaterialNo AS MATERIAL,A.Plant,A.TransferIn AS STGE_LOC,'' AS BATCH,
'501' AS MOVE_TYPE,'M' AS SPEC_STOCK,'FOXCONN031' AS VENDOR,B.RealQuantity AS ENTRY_QNT
FROM sseFormHead A(NOLOCK) INNER JOIN sseFormBody B(NOLOCK)
ON A.RequestNo = B.RequestNo WHERE A.PID=" + PID;
dt = SvcContext.DBFacade.FromCustomSql(sql).ToDataSet().Tables[0];
string materialNo = string.Empty;
Decimal restQuantity, realQuantity;
DbTransaction trans = SvcContext.DBFacade.BeginTransaction();
try
{
for (int i = 0; i < dt.Rows.Count; i++)
{
if (((TextBox)GridScrap.Rows[i].FindControl("txtRealQuantity")).Text.Trim() == "")
{
throw new Exception("實際報廢數量為空");
}
realQuantity = Decimal.Parse(((TextBox)GridScrap.Rows[i].FindControl("txtRealQuantity")).Text.Trim());
dt.Rows[i]["ENTRY_QNT"] = realQuantity;
materialNo = dt.Rows[i]["MATERIAL"].ToString();
restQuantity = Decimal.Parse(((Label)GridScrap.Rows[i].FindControl("lblRestScrapUnit")).Text.Trim());
if ((restQuantity - realQuantity) < 0)
{
throw new Exception("超過實際剩餘數量");
}
sql = "UPDATE sseFormBody SET RestScrapUnit=" + (restQuantity - realQuantity);
SvcContext.DBFacade.ExecuteNonQuery(sql, trans, null);
}
dt.AcceptChanges();
if (dt != null && dt.Rows.Count > 0)
{
Object[] Param_Date = new Object[2] { DateTime.Now, DateTime.Now };
Object[] Param_Code = new Object[1] { "03" };
rfcaller = new RfcFunction("BAPI_GOODSMVT_CREATE");
rfcaller.SetImport("GOODSMVT_HEADER", Param_Date);
rfcaller.SetImport("GOODSMVT_CODE", Param_Code);
rfcaller.setTable("GOODSMVT_ITEM", dt);
rfcaller.Run();
DataSet ds = rfcaller.GetTables();
string MaterialDoc1 = rfcaller.GetExport("MATERIALDOCUMENT").ToString();
if (ds.Tables["RETURN"].Rows.Count != 0 && MaterialDoc1 == "")
{
log.Error("過賬操作失敗");
throw new BusiException("過賬操作失敗");
}
rfcaller.Reset("BAPI_TRANSACTION_COMMIT");
rfcaller.Run();
rfcaller.Dispose();
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
log.Error("操作失敗", ex);
throw ex;
return;
}
dt = SvcContext.DBFacade.FromCustomSql("select * from sseformbody a(nolock) where a.requestNo='" + txtRequestNo.Text.Trim() + "' " + "and a.RestScrapUnit>0").ToDataSet().Tables[0];
if (dt != null && dt.Rows.Count > 0)
{
BusiHelper.WriteApprovalLog(WebConstants.MODEL_MSE_SSES, this.PID, this.TID, Convert.ToBoolean(this.ddlApproveResult.SelectedValue), this.txtApproveRemark.Text);
return;
}
else//已經報廢完
{
SvcContext.WFFacade.ProcessAdvance(this.Token, WebHelper.GetUserID(), this.PID, this.TID);
formHead.Status = 501;
SvcContext.DBFacade.Save<SseFormHead>(formHead);
this.PopMessage("申請已經成功提交。");
SendEmail(responsibles, 0);
}
break;