2011-08-22 16 views
1

我有一個使用SAP的ActiveX SAPFunctionsDelphi SAP SAPFunctions DELIMITER忽然忽略?

var 
TmpSAPFunctions: TSAPFunctions; 
... 
begin 
... 
TmpSAPFunctions.RemoveAll; 
Funct:=TmpSAPFunctions.Add('RFC_READ_TABLE'); 
Funct.Exports('QUERY_TABLE').Value:='JEST'; 
Funct.Exports('DELIMITER').Value:=','; 

然後我在2010年德爾福重新編譯應用程序中的舊Delphi應用程序,但一個奇怪的事情正在發生。我不再獲取數據逗號分隔CSV,而是數據似乎是FWV(固定寬度值)

我剛剛更新應用程序的其他部分,所以我不是那麼熟悉SAP編程,但它是我從搜索網絡的理解,CSV模式(使能分隔符)應該默認?

我不明白當目標/主機系統上的ActiveX是否相同時,從D6到2010的更改會有什麼不同。

+0

可能是一個Unicode問題 - 貴TSAPFunctions包裝器包含字符串字段?如果是的話,你是否嘗試在你的包裝中用AnsiString替換字符串? –

+0

我也想到了這一點,但由於數據被返回,只是沒有在CSV /分隔符模式下,我拒絕了這個想法。 TSapFunctions通過嚮導「導入組件」,「ActiveX」安裝到Delphi中。這會創建一個名爲 的單位SAPFunctionsOCX_TLB,它將WideString用於所有字符串。 – Tom

+0

好的,當我選擇「,」它似乎使用的分隔符是「4」。如果我使用「;」使用的分隔符是「5」,回車變成「1」。花了一些時間才明白這一點,因爲我不習慣看SAP輸出,而且大部分返回的數據都是數字。 – Tom

回答

2

,我認爲你是對的在你的答案中的錯誤。單個字符「字符串」被解釋爲Char,例如, 'A'被存儲爲#65。這存儲在變體中。一個變體是一個變體記錄,所以如果該變體被查詢爲一個字符串,它將返回「65」,並且SAP例程會選擇該變體的第一個字符。

所以,你可以這樣做:

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

Funct.Exports('DELIMITER').Value:=','#0; // makes ',' a string. 
+0

它工作作爲字符串鑄造,所以我認爲這是最乾淨的解決方案。謝謝! :) – Tom

2

你好我建議你得到SAPx從GSsoft更新版本完全支持Unicode,您需要重新生成基於羯羊你的AP的wrapperclass啓用Unicode或不

從GSsoft下載鏈接here

此致

+0

所有當前的代碼都基於使用SAP ActiveX的東西。如果可能,寧願繼續使用該解決方案:) – Tom

+0

+1到SAPx。我們成功爲即將開展的項目進行測試。 – oodesigner

+0

現在,activeX方式被SAP認爲已經過時,對它的支持不再更新。 – Sigurdur

1

使用字符串作爲分隔符是這樣的: Funct.Exports( 'DELIMITER')值:= '12345'; SAP發動機拾取第一字符作爲分隔符,這裏 '1'

當使用單char值作爲定界符(像預想的那樣)會發生以下情況: 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

+0

什麼類型是價值?它可能是一個變種?如果您將','作爲值傳遞,則不會將其解釋爲字符串,而會將其解釋爲Char。我想這可能會在這裏發揮作用。 –