2013-04-14 70 views
0

平面文件的內容:如何使用PowerBuilder讀取和解析X12數據元素?

ST*850*12500001| 
BEG*00*NE*71249364**20130103| 
CUR*SE*SGD| 
REF*BT*SGL169816-7191416| 
P01*0000000001*4*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ| 
P01*0000000002*10*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ| 
P01*0000000003*100*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ| 

first lines of file

問:

如果誰能夠分享如何動態地分析每個元素的想法。每個數據的長度會隨時間變化,例如:12500001,731304265511和SURT1000XLIQ。問題是我如何獲得星號(*)和管道(|)之間的數據。感謝幫助....

+1

只是爲了通知你:x12文件大部分/總是被ISA頭和一個預告片「包圍」。我不認爲你在這裏展示的是你實際收到的。 – eppye

+2

不僅如此,ISA段還幫助您識別段終止符,子元素分隔符和元素分隔符。你可以從你的樣本中找出它,但是你也缺少發件人/收件人的信息。 – Andrew

+0

嗨,我已經有發佈這個850之前的完整文檔和示例文件。我剛剛發佈瞭解析開始的地方。 – Alex

回答

1

您的平面文件看起來像一個EDI文件,但不是EDIFACT。

有一些從EDI到XML的轉換器(無論是開源還是商業),也許你可以嘗試使用這樣的工具來將生成的xml文件讀入DataWindow或數據存儲?

由於我不知道實際的文件格式,我不能更精確。 EDI的

示例 - > XML轉換器:

編輯:我剛剛登陸PowerBuilder開發人員日記上的一篇古老的帖子,論述了相同的主題:「Converting X12 EDI to XML」,它提供了更多的想法。

+1

爲什麼將其轉換爲XML?爲什麼不直接將其轉儲到數據庫中?還是一個CSV?或平面文件?每個人似乎都想翻譯成XML,但我不明白。很多時候,這只是一個額外的步驟,除非您的ERP或中間件系統需要它(例如將EDI轉換爲SAP的IDOC)。 – Andrew

+0

@Andrew:我建議將其轉換,因爲OP只是談論一個文件,而沒有告訴他是否產生了它,或者如果它是按原樣給出的。另外,雖然xml不能是金錘子,但使用它作爲數據透視表格可以增加在PB(datawindow,datastore,pbdom)之後處理它的方式。我懷疑Powerbuilder已經存在處理EDI文件的事情。當然,另一種選擇是根據規格製作他自己的解析器。 – Seki

+0

夥計們,我只想分享我所做的。我開發了一個PB函數,它將根據技術設計分析數據,然後在解析過程之後將其轉儲到表中,這很困難,因爲很多要解析的元素和解析應該動態地執行,因爲字符長度每個元素都不是恆定的。感謝你的想法和想法。 – Alex

0

這是X12文件,850採購訂單。正如eppye在評論中暗示的那樣,您需要準確找出您獲得的文件的標準。爲了讓你開始有850 here的版本。 「MEMA 4010 850草案」將幫助您瞭解格式。 「GCommerce 4010 850V1.4.doc」是數據字典,用於告訴您每個元素中的含義。但請理解,除非您銷售汽車零部件,否則這可能不是您正在使用的文件的確切規格。向你發送文件的人應該提供給你。

我會爲每個細分市場和循環創建一個用戶對象,一個用來表示採購訂單本身。採購訂單UO需要變量,這些變量是分段和循環的數據類型。不要包含循環內部的段,將它們放在循環的UO中。段的UO將具有變量,這些變量是段中數據元素的標準數據類型,如字符串,整數,日期等。請參閱數據字典以獲取數據類型。

請注意,如果段重複,保存段的變量是一個數組。循環的變量將是數組。

處理分段的對象將有一個方法,例如, of_importLine以星號分隔線並存儲值。

處理循環的對象將有一個方法,例如,它讀取行(段)直到它讀取循環的最後一段。對於每個段,它將爲該段類型創建UO,將其分配給實例變量,或者如果段可以重複,則將其分配給下一個數組槽,然後調用新對象的of_importLine

處理採購訂單的對象與循環的對象相似,只是當它看到循環的第一個段時,它爲該類型的循環創建UO,將它分配給循環的下一個數組槽,並調用新對象的of_readLoop。請注意,儘管您的採購訂單對象正在循環內讀取,它將創建一個新對象來讀取並存儲每個循環的重複。

您的讀取循環的對象應該記錄一個錯誤,並在找到所需的段丟失或不屬於循環的段時停止。錯誤應該包括行號和內容。我無法詳細說明如何驗證採購訂單本身,因爲許多細分在規格中是可選的,但它們在您的應用程序中可能不是可選的。對於每個段和循環,對象都有一個變量,它需要項目出現的順序和最小和最大出現次數。然後PO對象可以檢查段和循環。

這會將文檔中的數據轉化爲代表文檔各部分的對象,以便您可以使用這些數據。

+0

看起來像一個普通的x12 850訂單給我。你能否詳細說明爲什麼這是MEMA 850採購訂單? – eppye

+0

你可能是對的。我會編輯我的答案。 –

+0

謝謝。但像等等仍然存在。機會很大,它遵循另一個指南(來自另一個買家)的850。可能會導致誤解?當然是 – eppye

0

如果你使用的是普通的PowerBuilder,基本的做法是做一堆Pos()和Mid()的;沒有什麼是自動的。但是,在你的標籤中你提到了PFC;你可以隨時在弦業務的of_ParseToArray帶()函數,你讀過的文件之後,類似的信息(以下是未經測試,達到讀者發現錯誤):

long ll_Line, ll_LineCount, ll_Element, ll_ElementCount 
string ls_Lines[], ls_Elements[] 
n_cst_String lnv_String 

ll_LineCount = lnv_String.of_ParseToArray (ls_FileContents, "|", ls_Lines) 
FOR ll_Line = 1 TO ll_LineCount 
    ll_ElementCount = lnv_String.of_ParseToArray (ls_Lines[ll_Line], "*", ls_Elements) 
    // process the line with the elements separated out... 
NEXT 

祝你好運,

特里

+0

嗨特里,我想我們有同樣的方法。謝謝。 – Alex

0

下面是我所得到的方法。

ls_tranidcode = of_trimdata(is_Message, 4, '*') 
ids_edihdr.SetItem(ll_hdrins,'TRANSETIDCODE',ls_tranidcode) 

Function: 
of_trimdata() 

Return Type : String 
Argument Type : 
String arg_msg 
Integer pos1 
String s_dlm 

Long ll_pos2 
String ls_ret 

arg_msg = mid(arg_msg, pos1)    
ll_pos2 = POS(arg_msg,s_dlm) 
ls_ret = Mid(arg_msg, 1, ll_pos2 - 1) 
arg_msg = Mid(arg_msg, ll_pos2 + 1) 

RETURN ls_ret