Delphi SAP函数分隔符突然被忽略?

Delphi SAP函数分隔符突然被忽略?,delphi,function,sap,delimiter,Delphi,Function,Sap,Delimiter,我有一个使用SAP ActiveX函数的旧Delphi应用程序 var TmpSAPFunctions: TSAPFunctions; ... begin ... TmpSAPFunctions.RemoveAll; Funct:=TmpSAPFunctions.Add('RFC_READ_TABLE'); Funct.Exports('QUERY_TABLE').Value:='JEST'; Funct.Exports('DELIMITER').Value:=','; 然后我在Delphi2

我有一个使用SAP ActiveX函数的旧Delphi应用程序

var
TmpSAPFunctions: TSAPFunctions;
...
begin
...
TmpSAPFunctions.RemoveAll;
Funct:=TmpSAPFunctions.Add('RFC_READ_TABLE');
Funct.Exports('QUERY_TABLE').Value:='JEST';
Funct.Exports('DELIMITER').Value:=',';
然后我在Delphi2010中重新编译了这个应用程序,但是发生了一件奇怪的事情。我不再获得逗号分隔的CSV数据,而是数据似乎是FWV(固定宽度值)

我只是在更新应用程序的其他部分,所以我对SAP编程不是很熟悉,但我从搜索网络中了解到CSV模式(允许使用分隔符)应该是默认模式


我不明白当目标/主机系统上的ActiveX相同时,从D6到2010的更改会有什么不同

您好,我建议您从GSsoft获得一个完全支持Unicode的SAPx更新版本,您需要根据ap是否启用Unicode重新生成wrapperclass

GS软件的下载链接是


致以最诚挚的问候

您好,我建议您从GSsoft获得一个完全支持Unicode的SAPx更新版本,您需要根据ap是否启用Unicode重新生成wrapperclass

GS软件的下载链接是


最好使用字符串作为分隔符,如下所示: 函数导出('分隔符')。值:='12345'; SAP引擎选择第一个字符作为分隔符,此处为“1”

使用单字符值作为分隔符(假设)时,会发生以下情况: CR(Ascii 13)变为“1”,(Ascii 44)变为“4”:(Ascii 58)变为“5”;(Ascii 59)变为“5”X(Ascii 88)变为“8”Z(90)变为“9”

因此,我们可以得出结论,Delphi2010/SAP ActiveX/Delphi变体代码首先将“;”转换为ascii数值,然后再转换为“59”。然后SAP引擎选择第一个字符“5”


不确定这是否是Delphi变体代码或SAP ActiveX中的错误,使用字符串作为分隔符,如下所示: 函数导出('分隔符')。值:='12345'; SAP引擎选择第一个字符作为分隔符,此处为“1”

使用单字符值作为分隔符(假设)时,会发生以下情况: CR(Ascii 13)变为“1”,(Ascii 44)变为“4”:(Ascii 58)变为“5”;(Ascii 59)变为“5”X(Ascii 88)变为“8”Z(90)变为“9”

因此,我们可以得出结论,Delphi2010/SAP ActiveX/Delphi变体代码首先将“;”转换为ascii数值,然后再转换为“59”。然后SAP引擎选择第一个字符“5”


不确定这是否是Delphi变体代码或SAP ActiveX中的错误,我认为您的回答是正确的。单个字符“string”被解释为Char,例如,“A”被存储为#65。这将存储在变量中。变量是一个变量记录,因此如果查询变量以获取字符串,它将返回“65”,SAP例程将选择该字符串的第一个字符

所以你可以做:

Funct.Exports('DELIMITER').Value:=string(','); 


我认为你的回答是对的。单个字符“string”被解释为Char,例如,“A”被存储为#65。这将存储在变量中。变量是一个变量记录,因此如果查询变量以获取字符串,它将返回“65”,SAP例程将选择该字符串的第一个字符

所以你可以做:

Funct.Exports('DELIMITER').Value:=string(','); 


可能是Unicode问题-TSAPFunctions包装是否包含字符串字段?如果是,您是否尝试在包装器中用AnsiString替换字符串?我也想到了这一点,但由于返回的数据不是CSV/分隔符模式,所以我拒绝了这种想法。TSapFunctions通过向导“导入组件”、“ActiveX”安装到Delphi中。这将创建一个名为SAPFunctionsOCX_TLB的单元,该单元对所有字符串使用宽字符串。如果我使用“;”则使用的分隔符为“5”,回车符变为“1”。我花了一些时间才意识到这一点,因为我不习惯查看SAP输出,返回的大部分数据是数字。CR(Ascii 13)变为“1”,(Ascii 44)变为“4”:(Ascii 58)变为“5”;(Ascii 59)变为“5”X(Ascii 88)变为“8”Z(90)变为“9”参见下面我自己的答案。这是一个非常古怪的问题,只暴露在单个角色身上。不确定是Unicode还是某个变体/ActiveX问题。可能是Unicode问题-TSAPFunctions包装是否包含字符串字段?如果是,您是否尝试在包装器中用AnsiString替换字符串?我也想到了这一点,但由于返回的数据不是CSV/分隔符模式,所以我拒绝了这种想法。TSapFunctions通过向导“导入组件”、“ActiveX”安装到Delphi中。这将创建一个名为SAPFunctionsOCX_TLB的单元,该单元对所有字符串使用宽字符串。如果我使用“;”则使用的分隔符为“5”,回车符变为“1”。我花了一些时间才意识到这一点,因为我不习惯查看SAP输出,返回的大部分数据是数字。CR(Ascii 13)变为“1”,(Ascii 44)变为“4”:(Ascii 58)变为“5”;(Ascii 59)变为“5”X(Ascii 88)变为“8”Z(90)变为“9”参见下面我自己的答案。这是一个非常古怪的问题,只暴露在单个角色身上。不确定是Unicode还是某个变体/ActiveX问题。当前所有代码都基于使用SAP ActiveX的内容。如果可能,我宁愿继续使用该解决方案:)+1到SAPx。我们在即将到来的项目中成功地测试了它。activeX方式现在被SAP视为过时,我相信对它的支持不再更新。所有当前代码都基于使用SAP activeX的东西。如果可能,我宁愿继续使用该解决方案:)+1到SAPx。我们在即将到来的项目中成功地测试了它。activeX方式现在被SAP视为过时,我相信对它的支持也不再更新。什么类型的值?它可能是一种变体吗?如果将“,”作为值传递,则不会将其解释为字符串,而是将其解释为字符。我想这可能在这里起作用。什么是价值?它可能是一种变体吗?如果将“,”作为值传递,则不会将其解释为字符串,而是将其解释为字符。我猜