对于使用 SAPB1 和 HanaDB 的客户,我们执行相同的查询来提取数据(使用 ADO.NET 接口)。有些有自己的区域系统,似乎可以根据其区域设置等控制数字格式。
执行时例如说:
SELECT RDR1."Quantity" FROM RDR1
我假设该值的实际数据库存储是相同的,它只是查询引擎根据设置应用默认系统格式,使最终结果以一种或另一种方式格式化。
现在,使用强力方法,可以对每列进行此类更改:
REPLACE(CAST(ROUND(RDR1."Quantity",2) AS DECIMAL(10,2)), ',', '.') AS "Quantity”
给我“2.00”
但是,我们有很多这样的列,我们希望使代码在所有情况下都可用,而不是在不同区域拥有相同查询的多个实例 - 似乎应该有一种方法来告诉查询引擎将值返回为如果它在美国并忽略默认的系统区域设置和货币设置。
问题: 是否可以进行高级设置更改,而不是按列格式化/转换 - 使用 Hana SQL 查询代码(如会话变量或其他东西)或在我们建立 ADO.NET 连接时的连接设置HanaDB 会让这些值像在美国一样显示出来吗?
我还没有找到任何,但也许在文档中不太容易找到如何处理它。
不,没有 HANA 设置可以定义应用程序(在您的情况下为 SAP Business One)如何将数据呈现到用户屏幕。
对于 SAP B1,您可以在此处找到用于设置这些用户设置的文档。 这些设置包括“千位分隔符”、“分隔符”、“小数位”等。
但在 HANA DB 级别上,没有全局设置。
此外,提到的
REPLACE
解决方法会将输入数字数据转换为字符串,丢失所有数字语义(排序、数学运算)并增加这些值的内存需求。
如果可能的话,最好避免这种技术。
如果你想改变程序输出的小数点分隔符,只需告诉.NET。 一个选项是设置当前线程的文化,如以下代码片段所示:
using System;
using System.Globalization;
class Program
{
static void Main(string[] args)
{
decimal d = 2021.1002m;
Console.WriteLine("Current Culture is {0}.", System.Threading.Thread.CurrentThread.CurrentCulture.Name);
Console.WriteLine("d = {0}.", d);
System.Threading.Thread.CurrentThread.CurrentCulture =
new CultureInfo("en-US");
Console.WriteLine("Current Culture now is {0}.", System.Threading.Thread.CurrentThread.CurrentCulture.Name);
Console.WriteLine("And d = {0}.", d);
}
}
对我来说,输出是:
Current Culture is es-ES.
d = 2021,1002.
Current Culture now is en-US.
And d = 2021.1002.
你在获取字符串值时做了一些非常错误的事情。
RDR1.Quantity
属于 DECIMAL
类型,通过 ADO.NET 执行的直接查询(例如您的查询)将返回 HanaDecimal
类型的值。这是一个很大的麻烦,因为大多数时候你需要原生的System.Decimal
。我们的 SQL 包装器使用以下方法自动对标量值和 DataTable
执行转换:
static void AdoFilterType( ref object value )
{ if( value.GetType().Name == "HanaDecimal" )
{ value = Convert.ToDecimal( value ); }
}
我建议您也这样做。 幸运的是,
Sap.Data.Hana
不会与其他常见类型发生干涉。