public override RfcPreparedFunction Prepare() { try { this.function = this.repository.CreateFunction(this.FunctionName); foreach (var parameter in this.Parameters) { int idx = this.function.Metadata.TryNameToIndex(parameter.Name); if (idx == -1) { throw new UnknownRfcParameterException(parameter.Name, this.FunctionName); } RfcDataType pType = this.function.Metadata[idx].DataType; switch (pType) { case RfcDataType.STRUCTURE: RfcStructureMetadata structureMetadata = this.function.GetStructure(idx).Metadata; IRfcStructure structure = this.structureMapper.CreateStructure(structureMetadata, parameter.Value); this.function.SetValue(parameter.Name, structure); break; case RfcDataType.TABLE: RfcTableMetadata tableMetadata = this.function.GetTable(idx).Metadata; IRfcTable table = this.structureMapper.CreateTable(tableMetadata, parameter.Value); this.function.SetValue(parameter.Name, table); break; default: object formattedValue = this.structureMapper.ToRemoteValue(this.function.Metadata[idx].GetAbapDataType(), parameter.Value); this.function.SetValue(parameter.Name, formattedValue); break; } } return(this); } catch (Exception ex) { if (ex.GetBaseException() is SharpRfcException) { throw ex; } throw new SharpRfcCallException(ex.Message, function == null ? this.FunctionName : function.ToString(), ex); } }
public static Type GetDataType(RfcDataType rfcDataType) { switch (rfcDataType) { case RfcDataType.DATE: return typeof(string); case RfcDataType.CHAR: return typeof(string); case RfcDataType.STRING: return typeof(string); case RfcDataType.BCD: return typeof(decimal); case RfcDataType.INT2: return typeof(int); case RfcDataType.INT4: return typeof(int); case RfcDataType.FLOAT: return typeof(double); default: return typeof(string); } }
internal static System.Type RfcTypeToSystemType(RfcDataType Type) { if (Type == RfcDataType.CHAR) { return System.Type.GetType("System.String"); } if (Type == RfcDataType.BYTE) { return System.Type.GetType("System.String"); } if (Type == RfcDataType.DATE) { return System.Type.GetType("System.String"); } if (Type == RfcDataType.TIME) { return System.Type.GetType("System.String"); } if (Type == RfcDataType.BCD) { return System.Type.GetType("System.Decimal"); } if (((Type == RfcDataType.INT4) || (Type == RfcDataType.INT1)) || (Type == RfcDataType.INT2)) { return System.Type.GetType("System.Int32"); } if (Type == RfcDataType.NUM) { return System.Type.GetType("System.Int32"); } if (Type != RfcDataType.FLOAT) { // throw new ERPException(string.Format(Messages.CannotconvertRFCtype_0_toascalarsystemtype, Type.ToString())); throw new Exception(string.Format("Cannot convert RFCtype {0} to a scalar system type", Type.ToString())); } return System.Type.GetType("System.Double"); }
internal static System.Type RfcTypeToSystemType(RfcDataType Type) { if (Type == RfcDataType.CHAR) { return(System.Type.GetType("System.String")); } if (Type == RfcDataType.BYTE) { return(System.Type.GetType("System.String")); } if (Type == RfcDataType.DATE) { return(System.Type.GetType("System.String")); } if (Type == RfcDataType.TIME) { return(System.Type.GetType("System.String")); } if (Type == RfcDataType.BCD) { return(System.Type.GetType("System.Decimal")); } if (((Type == RfcDataType.INT4) || (Type == RfcDataType.INT1)) || (Type == RfcDataType.INT2)) { return(System.Type.GetType("System.Int32")); } if (Type == RfcDataType.NUM) { return(System.Type.GetType("System.Int32")); } if (Type != RfcDataType.FLOAT) { // throw new ERPException(string.Format(Messages.CannotconvertRFCtype_0_toascalarsystemtype, Type.ToString())); throw new Exception(string.Format("Cannot convert RFCtype {0} to a scalar system type", Type.ToString())); } return(System.Type.GetType("System.Double")); }
/// <summary> /// convert SAP .net connector datatypes to c# datatypes /// </summary> /// <param name="rfcDataType"></param> /// <returns></returns> private Type ConvertDataType(RfcDataType rfcDataType) { Type systemType = null; try { switch (rfcDataType) { case RfcDataType.NUM: systemType = typeof(double); break; case RfcDataType.DATE: systemType = typeof(DateTime); break; default: systemType = typeof(String); break; } } catch (Exception) { systemType = typeof(String); } return systemType; }
//public static byte[] Int32ToRawBytes(int src, int Length) //{ // byte[] destination = new byte[Length]; // CopyBytes(BitConverter.GetBytes(src), destination, 0, 0, Length); // return destination; //} //public static byte[] Int64ToRawBytes(long src, int Length) //{ // byte[] destination = new byte[Length]; // CopyBytes(BitConverter.GetBytes(src), destination, 0, 0, Length); // return destination; //} internal static string NETToSoap(object NetValue, RfcDataType Type) { string str; if (Type == RfcDataType.CHAR) { str = NetValue.ToString(); } else if (Type == RfcDataType.DATE) { if (NetValue.ToString().Length == 8) { str = NetValue.ToString().Substring(0, 4) + "-" + NetValue.ToString().Substring(4, 2) + "-" + NetValue.ToString().Substring(6, 2); } else { str = NetValue.ToString(); } } else if (Type == RfcDataType.BCD) { NumberFormatInfo provider = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "" }; str = Convert.ToString((decimal)NetValue, provider); } else if (Type == RfcDataType.FLOAT) { NumberFormatInfo info2 = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "" }; str = Convert.ToString((double)NetValue, info2); } else if (((Type == RfcDataType.INT4) || (Type == RfcDataType.INT2)) || (Type == RfcDataType.INT1)) { NumberFormatInfo info3 = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "" }; str = Convert.ToString((int)NetValue, info3); } else if (Type == RfcDataType.NUM) { str = NetValue.ToString(); } else if (Type == RfcDataType.STRING) { str = NetValue.ToString(); } else if (Type == RfcDataType.TIME) { string str2 = NetValue.ToString(); if (str2.Length == 4) { str = str2.Substring(0, 2) + ":" + str2.Substring(2, 2) + ":00"; } else if (str2.Length == 6) { str = str2.Substring(0, 2) + ":" + str2.Substring(2, 2) + ":" + str2.Substring(4, 2); } else { str = str2; } } else { if ((Type == RfcDataType.XSTRING) || (Type == RfcDataType.BYTE)) { return Convert.ToBase64String((byte[])NetValue); } if (Type == RfcDataType.TABLE) { IRfcTable table = NetValue as IRfcTable; if (table == null) { return ""; } StringBuilder builder = new StringBuilder(); foreach (IRfcStructure structure in table.ToList()) { builder.Append("<item>"); if (table.Metadata.LineType.FieldCount == 1) { builder.Append(NETToSoap(structure[table.Metadata.LineType[0].Name].GetValue(), table.Metadata.LineType[0].DataType)); } else { for (var i = 1; i < table.Metadata.LineType.FieldCount; i++) { string str3 = table.Metadata.LineType[i].Name.Replace("/", "_-"); builder.Append("<" + str3 + ">"); builder.Append(NETToSoap(structure[i].GetValue(), structure[i].Metadata.DataType)); builder.Append("</" + str3 + ">"); } } builder.Append("</item>"); } return builder.ToString(); } if (Type != RfcDataType.STRUCTURE) { //throw new ERPException(string.Format(Messages.Type_0_notsupportedinthiscontext, Type.ToString())); throw new Exception(string.Format("Type{0} not supported in this context", Type.ToString())); } IRfcStructure structure2 = NetValue as IRfcStructure; if (structure2 == null) { return ""; } StringBuilder builder2 = new StringBuilder(); foreach (IRfcField column2 in structure2.ToList()) { string str4 = column2.Metadata.Name.Replace("/", "_-"); builder2.Append("<" + str4 + ">"); builder2.Append(NETToSoap(structure2[column2.Metadata.Name], column2.Metadata.DataType)); builder2.Append("</" + str4 + ">"); } return builder2.ToString(); } return StringToXMLString(str); }
//internal static IntPtr StringBytesToPtr(byte[] stringBytes) //{ // IntPtr destination = RFCAPI.RfcAllocString(stringBytes.Length); // Marshal.Copy(stringBytes, 0, destination, stringBytes.Length); // IntPtr newPointer = GetNewPointer(IntPtr.Size); // Marshal.WriteIntPtr(newPointer, destination); // return newPointer; //} public static byte[] StringToRawBytes(string src, int Length, RfcDataType type) { string s = new string(" ".ToCharArray()[0], Length); s = src; if (((type == RfcDataType.CHAR) || (type == RfcDataType.BYTE)) || (type == RfcDataType.STRING)) { s = s.PadRight(Length); } else { if (((type != RfcDataType.DATE) && (type != RfcDataType.TIME)) && (type != RfcDataType.NUM)) { throw new Exception(string.Format("Type:{0}isnotallowedinConvertsStringToRawBytes", type.ToString())); } if (IsUnicode) { s = s.PadLeft(Length / 2, "0".ToCharArray()[0]); } else { s = s.PadLeft(Length, "0".ToCharArray()[0]); } } if (type == RfcDataType.STRING) { return enc.GetBytes(s + "\0"); } return enc.GetBytes(s); }
public static object RfcToDoNetValue(Object output, RfcDataType type) { try { Object o = output; if (o == null) { o = ""; output = ""; } int iout = 0; switch (type) { case RfcDataType.BCD: if (o.ToString() == "") { o = 0; break; } o = double.Parse(output.ToString()); break; case RfcDataType.BYTE: if (o.ToString() == "") { o = 0; break; } else { o = o.ToString(); } //o = byte.Parse(o.ToString()); break; case RfcDataType.CDAY: break; case RfcDataType.CHAR: break; case RfcDataType.CLASS: break; case RfcDataType.DATE: if (o.ToString() == "00000000") { o = ""; } else { // o = o.ToString().Replace("-",""); // o = o.ToString().Substring(0, 4) + "-" + o.ToString().Substring(4, 2) + "-" + o.ToString().Substring(6, 2); } break; case RfcDataType.DECF16: break; case RfcDataType.DECF34: break; case RfcDataType.DTDAY: break; case RfcDataType.DTMONTH: break; case RfcDataType.DTWEEK: break; case RfcDataType.FLOAT: if (o.ToString() == "") { o = 0; break; } o = float.Parse(output.ToString()); break; case RfcDataType.INT1: if (o.ToString() == "") { o = 0; break; } o = int.Parse(output.ToString()); break; case RfcDataType.INT2: if (o.ToString() == "") { o = 0; break; } o = int.Parse(output.ToString()); break; case RfcDataType.INT4: if (o.ToString() == "") { o = 0; break; } o = int.Parse(output.ToString()); break; case RfcDataType.INT8: if (o.ToString() == "") { o = 0; break; } o = int.Parse(output.ToString()); break; case RfcDataType.NUM: if (output == null) { o = 0; } if (o.ToString().Trim() == "0") { o = 0; } else { int.TryParse(output.ToString(), out iout); o = iout; } break; case RfcDataType.STRING: break; case RfcDataType.STRUCTURE: break; case RfcDataType.TABLE: break; case RfcDataType.TIME: //o = o.ToString().Substring(0, 2) + ":" + o.ToString().Substring(2, 2) + ":" + o.ToString().Substring(4, 2); break; case RfcDataType.TMINUTE: break; case RfcDataType.TSECOND: break; case RfcDataType.UNKNOWN: break; case RfcDataType.UTCLONG: break; case RfcDataType.UTCMINUTE: break; case RfcDataType.UTCSECOND: break; case RfcDataType.XSTRING: break; default: break; } return o; } catch (Exception ex) { throw ex; } }
public static object ObjectToRfcValue(Object input, RfcDataType type) { Object o = input; switch (type) { case RfcDataType.BCD: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.BYTE: break; case RfcDataType.CDAY: break; case RfcDataType.CHAR: break; case RfcDataType.CLASS: break; case RfcDataType.DATE: input = input.ToString().Replace("-", ""); input = input.ToString().Replace("/", ""); if (input.ToString() != "" && input.ToString().Length != 8) { throw new SAPException(input.ToString() + " ���ڸ�ʽ����ȷ"); } break; case RfcDataType.DECF16: break; case RfcDataType.DECF34: break; case RfcDataType.DTDAY: break; case RfcDataType.DTMONTH: break; case RfcDataType.DTWEEK: break; case RfcDataType.FLOAT: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.INT1: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.INT2: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.INT4: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.INT8: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.NUM: if (input.ToString().Trim() == "") { o = 0; } break; case RfcDataType.STRING: break; case RfcDataType.STRUCTURE: break; case RfcDataType.TABLE: break; case RfcDataType.TIME: input = input.ToString().Replace(":", ""); if (input.ToString() != "" && input.ToString().Length != 6) { throw new SAPException("ʱ����ʽ����ȷ��"); } break; case RfcDataType.TMINUTE: break; case RfcDataType.TSECOND: break; case RfcDataType.UNKNOWN: break; case RfcDataType.UTCLONG: break; case RfcDataType.UTCMINUTE: break; case RfcDataType.UTCSECOND: break; case RfcDataType.XSTRING: break; default: break; } return o; }
internal static object XmlToScalarValue(string value, RfcDataType rfcType) { switch (rfcType) { case RfcDataType.CHAR: case RfcDataType.NUM: return value; case RfcDataType.DATE: if (value.Length == 10) { return value.Remove(4, 1).Remove(6, 1); } return value; case RfcDataType.BCD: if (!string.IsNullOrEmpty(value)) { return Convert.ToDecimal(value, numberFormatInfo); } return 0M; case RfcDataType.TIME: if (value.Length != 8) { return value; } return value.Remove(2, 1).Remove(4, 1); case RfcDataType.BYTE: case RfcDataType.XSTRING: if (string.IsNullOrEmpty(value)) { return new byte[0]; } return Convert.FromBase64String(value); case RfcDataType.FLOAT: if (!string.IsNullOrEmpty(value)) { return Convert.ToDouble(value, numberFormatInfo); } return 0.0; case RfcDataType.INT4: if (!string.IsNullOrEmpty(value)) { return Convert.ToInt32(value, numberFormatInfo); } return 0; case RfcDataType.INT2: if (!string.IsNullOrEmpty(value)) { return Convert.ToInt16(value, numberFormatInfo); } return 0; case RfcDataType.INT1: if (!string.IsNullOrEmpty(value)) { return Convert.ToByte(value, numberFormatInfo); } return 0; case RfcDataType.STRING: return value; } //throw new ERPException(string.Format(Messages.Type_0_notsupportedinthiscontext, rfcType.ToString())); throw new Exception(string.Format("Cannotconvert_{0}_to an internal RFCtype", rfcType.ToString())); }
//internal static string ScalarToXmlPersist(object value, RfcDataType rfcType) //{ // switch (rfcType) // { // case RfcDataType.CHAR: // case RfcDataType.NUM: // case RfcDataType.STRING: // return value.ToString(); // case RfcDataType.DATE: // { // string str = value.ToString(); // if (str.Length == 8) // { // return str.Insert(6, "-").Insert(4, "-"); // } // return str; // } // case RfcDataType.BCD: // case RfcDataType.INT4: // case RfcDataType.INT2: // case RfcDataType.INT1: // return Convert.ToString(value, numberFormatInfo); // case RfcDataType.TIME: // { // string str2 = value.ToString(); // switch (str2.Length) // { // case 4: // return (str2.Insert(2, ":") + ":00"); // case 5: // return str2; // case 6: // return str2.Insert(4, ":").Insert(2, ":"); // } // return str2; // } // case RfcDataType.BYTE: // case RfcDataType.XSTRING: // return Convert.ToBase64String((byte[])value); // case RfcDataType.FLOAT: // { // double num = (double)value; // return num.ToString("R", numberFormatInfo); // } // } // throw new ERPException(string.Format(Messages.Type_0_notsupportedinthiscontext, rfcType.ToString())); //} //internal static string ScalarToXmlValue(object value, RfcDataType rfcType) //{ // switch (rfcType) // { // case RfcDataType.CHAR: // case RfcDataType.NUM: // case RfcDataType.STRING: // return value.ToString(); // case RfcDataType.DATE: // { // string str = value.ToString(); // if (str.Length == 8) // { // return str.Insert(6, "-").Insert(4, "-"); // } // return str; // } // case RfcDataType.BCD: // case RfcDataType.INT4: // case RfcDataType.INT2: // case RfcDataType.INT1: // return Convert.ToString(value, numberFormatInfo); // case RfcDataType.TIME: // { // string str2 = value.ToString(); // switch (str2.Length) // { // case 4: // return (str2.Insert(2, ":") + ":00"); // case 5: // return str2; // case 6: // return str2.Insert(4, ":").Insert(2, ":"); // } // return str2; // } // case RfcDataType.BYTE: // case RfcDataType.XSTRING: // return Convert.ToBase64String((byte[])value); // case RfcDataType.FLOAT: // { // double num = (double)value; // return num.ToString("R", numberFormatInfo); // } // } // throw new ERPException(string.Format(Messages.Type_0_notsupportedinthiscontext, rfcType.ToString())); //} internal static object SOAPToNET(string SOAPValue, RfcDataType Type, bool SOAPValueIsAlreadyDecoded) { if (!SOAPValueIsAlreadyDecoded) { SOAPValue = XMLStringToString(SOAPValue); } if (Type == RfcDataType.CHAR) { return SOAPValue; } if (Type == RfcDataType.DATE) { SOAPValue = SOAPValue.Trim(); if (SOAPValue.Length == 10) { return (SOAPValue.Substring(0, 4) + SOAPValue.Substring(5, 2) + SOAPValue.Substring(8, 2)); } return SOAPValue; } if (Type == RfcDataType.BCD) { NumberFormatInfo provider = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "," }; return Convert.ToDecimal(SOAPValue, provider); } if (Type == RfcDataType.FLOAT) { NumberFormatInfo info2 = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "," }; return Convert.ToDouble(SOAPValue, info2); } if (((Type == RfcDataType.INT4) || (Type == RfcDataType.INT1)) || (Type == RfcDataType.INT2)) { return Convert.ToInt32(SOAPValue); } if (Type == RfcDataType.NUM) { return SOAPValue; } if (Type == RfcDataType.TIME) { SOAPValue = SOAPValue.Trim(); if (SOAPValue.Length == 8) { return (SOAPValue.Substring(0, 2) + SOAPValue.Substring(3, 2) + SOAPValue.Substring(6, 2)); } return SOAPValue; } if (Type == RfcDataType.STRING) { return SOAPValue; } if ((Type == RfcDataType.XSTRING) || (Type == RfcDataType.BYTE)) { try { return Convert.FromBase64String(SOAPValue); } catch { return new byte[0]; } } if (Type != RfcDataType.TABLE) { //throw new ERPException(string.Format(Messages.Type_0_notsupportedinthiscontext, Type.ToString())); throw new Exception(string.Format("Type_{0}_not supported in this context", Type.ToString())); } return ""; }
public static Type GetDataType(RfcDataType rfcDataType) { switch (rfcDataType) { case RfcDataType.DATE: return(typeof(string)); case RfcDataType.CHAR: return(typeof(string)); case RfcDataType.STRING: return(typeof(string)); case RfcDataType.BCD: return(typeof(decimal)); case RfcDataType.INT2: return(typeof(int)); case RfcDataType.INT4: return(typeof(int)); case RfcDataType.FLOAT: return(typeof(double)); default: return(typeof(string)); } }