Beispiel #1
0
        public static int WriteDecimal(Span <byte> span, decimal value)
        {
            // Cast the decimal to our struct to avoid the decimal.GetBits allocations.
            DecimalData data = Unsafe.As <decimal, DecimalData>(ref value);

            // According to the documentation :-
            //  - word 0: low-order "mantissa"
            //  - word 1, word 2: medium- and high-order "mantissa"
            //  - word 3: mostly reserved; "exponent" and sign bit
            // In one way, this is broader than AMQP: the mantissa is larger.
            // In another way, smaller: the exponent ranges 0-28 inclusive.
            // We need to be careful about the range of word 0, too: we can
            // only take 31 bits worth of it, since the sign bit needs to
            // fit in there too.
            if (data.Mid != 0 || // mantissa extends into middle word
                data.Hi != 0 ||  // mantissa extends into top word
                data.Lo < 0)     // mantissa extends beyond 31 bits
            {
                return(ThrowWireFormattingException(value));
            }

            span[0] = (byte)((data.Flags >> 16) & 0xFF);
            WriteLong(span.Slice(1), (data.Flags & 0b1000_0000_0000_0000_0000_0000_0000_0000) | (data.Lo & 0b0111_1111_1111_1111_1111_1111_1111_1111));
            return(5);
        }
Beispiel #2
0
        public static double roundValue(double LocalAmount, RoundingContextEnum B1Context)
        {
            double dbSCAmount = 0;

            CompanyService objCompanyService = null;

            try
            {
                objCompanyService = MainObject.Instance.B1Company.GetCompanyService();

                DecimalData objDecimalData = objCompanyService.GetDataInterface(CompanyServiceDataInterfaces.csdiDecimalData);
                objDecimalData.Context  = B1Context;
                objDecimalData.Currency = MainObject.Instance.B1AdminInfo.SystemCurrency;
                objDecimalData.Value    = LocalAmount;
                RoundedData objResult = objCompanyService.RoundDecimal(objDecimalData);

                dbSCAmount = objResult.Value;
            }
            catch (Exception er)
            {
                _Logger.Error("", er);
            }
            finally
            {
                if (objCompanyService != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCompanyService);
                    objCompanyService = null;
                }
            }
            return(dbSCAmount);
        }
Beispiel #3
0
        private static void CheckDecimals(List <DecimalData> decimals, TypeSet t, Action CheckContents, ref ParameterType modifiedType)
        {
            DecimalData Decimal1 = new DecimalData("decimal1", ParameterType.Parse("feea56b3-d51b-4c60-bb81-96c6e543e096"), 12, -1);
            DecimalData Decimal2 = new DecimalData("decimal2", ParameterType.Parse("1275ba4a-ff58-492c-ae6f-9e915eefb796"), 15, -1);
            DecimalData Decimal3 = new DecimalData("decimal3", ParameterType.Parse("729e3aa4-ce76-4dbd-95b8-549dbdec035a"), -123, -1231);

            var a = Decimal1;

            t.AddDecimal(a);
            decimals.Add(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            a = Decimal2;
            t.AddDecimal(a);
            decimals.Add(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            a = Decimal1;
            t.Remove(a.TypeId);
            decimals.Remove(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            a = Decimal3;
            t.AddDecimal(a);
            decimals.Add(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            DecimalData Decimal2Replacement = new DecimalData("decimal 2 replacement", ParameterType.Parse("1275ba4a-ff58-492c-ae6f-9e915eefb796"), 345, -345);

            t.ModifyDecimal(Decimal2Replacement);
            decimals[decimals.IndexOf(Decimal2)] = Decimal2Replacement;
            Assert.That(modifiedType, Is.EqualTo(Decimal2Replacement.TypeId));
            modifiedType = null;
            CheckContents();

            DecimalData Decimal3Replacement = new DecimalData("Decimal3Replaced", ParameterType.Parse("729e3aa4-ce76-4dbd-95b8-549dbdec035a"), -123, -1231);

            t.RenameType(Decimal3.TypeId, Decimal3Replacement.Name);
            decimals[decimals.IndexOf(Decimal3)] = Decimal3Replacement;
            Assert.That(modifiedType, Is.EqualTo(Decimal3Replacement.TypeId));
            modifiedType = null;
            CheckContents();
        }
Beispiel #4
0
        public static decimal ReadDecimal(ReadOnlySpan <byte> span)
        {
            byte scale = span[0];

            if (scale > 28)
            {
                ThrowInvalidDecimalScale(scale);
            }

            uint unsignedMantissa = NetworkOrderDeserializer.ReadUInt32(span.Slice(1));
            var  data             = new DecimalData(((uint)(scale << 16)) | unsignedMantissa & 0x80000000, 0, unsignedMantissa & 0x7FFFFFFF, 0);

            return(Unsafe.As <DecimalData, decimal>(ref data));
        }
Beispiel #5
0
        public static double getSCValue(double LocalAmount, DateTime date, out string Message, RoundingContextEnum B1Context)
        {
            double dbSCAmount = 0;

            SAPbobsCOM.SBObob    objBob            = null;
            SAPbobsCOM.Recordset objRS             = null;
            CompanyService       objCompanyService = null;

            Message = "";
            try
            {
                objBob = MainObject.Instance.B1Company.GetBusinessObject(BoObjectTypes.BoBridge);
                objRS  = objBob.GetCurrencyRate(MainObject.Instance.B1AdminInfo.SystemCurrency, date);
                double dbRate = objRS.Fields.Item(0).Value;

                objCompanyService = MainObject.Instance.B1Company.GetCompanyService();

                DecimalData objDecimalData = objCompanyService.GetDataInterface(CompanyServiceDataInterfaces.csdiDecimalData);
                objDecimalData.Context  = B1Context;
                objDecimalData.Currency = MainObject.Instance.B1AdminInfo.SystemCurrency;
                objDecimalData.Value    = LocalAmount / dbRate;
                RoundedData objResult = objCompanyService.RoundDecimal(objDecimalData);

                dbSCAmount = objResult.Value;
            }
            catch (Exception er)
            {
                _Logger.Error("", er);
                Message = er.Message;
            }
            finally
            {
                if (objCompanyService != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCompanyService);
                    objCompanyService = null;
                }
                if (objRS != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objRS);
                    objRS = null;
                }
                if (objBob != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objBob);
                    objBob = null;
                }
            }
            return(dbSCAmount);
        }
Beispiel #6
0
        /// <summary>
        /// Populate a domain's various type data from xml
        /// </summary>
        /// <param name="domain">The domain to fill</param>
        /// <param name="root">The xml root node</param>
        private static void ReadTypes(DomainData domain, XElement root)
        {
            foreach (var a in root.Elements("DynamicEnumeration"))
            {
                DynamicEnumerationData typeData = new DynamicEnumerationData(a.Attribute("name").Value, Guid.Parse(a.Attribute("guid").Value));
                domain.DynamicEnumerations.Add(typeData);
            }
            foreach (var a in root.Elements("Enumeration"))
            {
                var name   = a.Attribute("name").Value;
                var guid   = Guid.Parse(a.Attribute("guid").Value);
                var values = a.Elements("Value").Select(value => new EnumerationData.Element(value.Attribute("name").Value, Guid.Parse(value.Attribute("guid").Value)));

                EnumerationData typeData;

                if (a.Element("Default") != null)
                {
                    if (a.Element("Default").Attributes("guid").Any())
                    {
                        var def = Guid.Parse(a.Element("Default").Attribute("guid").Value);
                        typeData = new EnumerationData(name, guid, values, def);
                    }
                    else if (a.Element("Default").Attributes("name").Any())
                    {
                        var def = a.Element("Default").Attribute("name").Value;
                        typeData = new EnumerationData(name, guid, values, def);
                    }
                    else
                    {
                        throw new Exception("Enumeration declared with a default node but no recognised default value");
                    }
                }
                else
                {
                    typeData = new EnumerationData(name, guid, values);
                }

                domain.Enumerations.Add(typeData);
            }
            foreach (var a in root.Elements("Decimal"))
            {
                var aName = a.Attribute("name").Value;
                var guid  = Guid.Parse(a.Attribute("guid").Value);
                var aMax  = a.Attributes("max").Select <XAttribute, decimal?>(b => decimal.Parse(b.Value)).SingleOrDefault();
                var aMin  = a.Attributes("min").Select <XAttribute, decimal?>(b => decimal.Parse(b.Value)).SingleOrDefault();
                var aDef  = a.Attributes("default").Select <XAttribute, decimal?>(b => decimal.Parse(b.Value)).SingleOrDefault();

                DecimalData typeData = new DecimalData(aName, guid, aMax, aMin, aDef);

                domain.Decimals.Add(typeData);
            }
            foreach (var a in root.Elements("Integer"))
            {
                var aName = a.Attribute("name").Value;
                var guid  = Guid.Parse(a.Attribute("guid").Value);
                var aMax  = a.Attributes("max").Select <XAttribute, int?>(b => int.Parse(b.Value)).SingleOrDefault();
                var aMin  = a.Attributes("min").Select <XAttribute, int?>(b => int.Parse(b.Value)).SingleOrDefault();
                var aDef  = a.Attributes("default").Select <XAttribute, int?>(b => int.Parse(b.Value)).SingleOrDefault();

                IntegerData typeData = new IntegerData(aName, guid, aMax, aMin, aDef);

                domain.Integers.Add(typeData);
            }
        }
 public Object serializeAnswerData(DecimalData data)
 {
     return(((Double)data.Value).ToString());
 }