Korrekte Anschriften verfügbar?
Jörn Maas
Hallo,es gibt ja die Möglichkeit die Anschrift anhand des internen Adressenformates zu definieren wie die Anschrift für einen BP formatiert werden soll. Diese Formatierung wird ja bei der Anlage eines Marketingbeleges im Adress bzw. Adress2 Feld gespeichert.
Wenn ich jetzt aber abhängig von der gewählten Sprache eine bestimmte Adresse im Layout benutzen möchte, dann weiß ich momentan keine Möglichkeit dies Adresse "von Hand" zusammenzubasteln (Beispiel Streckengeschäft wo Rechnungsadresse != Lieferadresse). Gibt es hierfür eine Funktion auf die ich zugreifen kann oder eine andere Art das Problem anzugehen?
Viele Grüße
Jörn
Jörn Maas
Hi,ich habe eine Lösung gefunden, die allerdings komplett ausprogrammiert werden mußte. Daher wäre es schön zu erfahren, wenn die SAP diese Funktionalität doch irgendwann bereitstellt. Die folgenden Funktionen im obersten Doc Knoten unter CommonScript hinzufügen.
Ein Aufruf geschieht dann z.B. mit
advancedText.SetText = _getFormattedAddress("12345", 1, True)
Die Zeilenlängenbegrenzung $L[xxx] habe ich zwar angedeutet, aber nicht ausprogrammiert, da dies nicht benötigt wurde. Der geneigte Leser kann dies aber leicht zusätzlich einbauen ;)
Vielleicht hilft dies ja jemandem.
Viele Grüße
Jörn
' Input:
' sBase = The String which possibly contains additional content in brackets
' Return:
' If the String contains no brackets an empty string, otherwise the content
Function _getContent(sBase As String)
Dim Index = InStr(sBase, "[")
If Index = 0 Then
_getContent = ""
Exit Function
End If
_getContent = Mid(sBase, Index+1, Len(sBase) - Index - 1)
End Function
' Input:
' sOCRDCardCode = OCRD.CardCode (Number of BP)
' sOADFCode = OADF.Code (Number of Adress Format)
' = CRD1.Country => OCRY.Code and OCRY.AddrFormat => OADF.Code
' bUseForeign = If true use the OCRD.CardFName for comparison,
' otherwise use OCRD.CardName
' Return:
' Based on the code in OADF it will generate the address
' as defined in the table OADF which can be adjusted using
' Administration -> Setup -> Business Partners -> Address Formats
Function _getFormattedAddress(sOCRDCardCode As String, sOADFCode As Integer, bUseForeign As Boolean) As String
Dim sToParse, sToken As String
Dim sBP, sToReturn, sDummy, sDummy2, sText As String
Dim i,j As Integer
Dim bAnotherToken As Boolean
If bUseForeign Then
sBP = LD.QueryData("select CardFName from OCRD where CardCode = '" & sOCRDCardCode & "'")
Else
sBP = LD.QueryData("select CardName from OCRD where CardCode = '" & sOCRDCardCode & "'")
End If
If sBP = "" Then
_getFormattedAddress = "No BP?..."
Exit Function
End If
' The parameters are always $ + 1 character + optional [...]
' So the parser reads all following characters until
' a) next $
' c) end of string
sToParse = LD.QueryData("select Format from OADF where Code = " & sOADFCode)
If sToParse = "" Then
_getFormattedAddress = "No Adressdefinition?..."
Exit Function
End If
bAnotherToken = True
Do While bAnotherToken
' Since FreeText is not specially marked, some
' tricks are necessary.
sDummy2 = sToParse
i = InStr(2, sDummy2, "]")
bAnotherToken = False
If i > 0 Then
sDummy2 = Left(sToParse, i)
bAnotherToken = True
End If
i = InStr(2, sDummy2, "$")
If i > 0 Then
sDummy2 = Left(sDummy2, i-1)
bAnotherToken = True
End If
i = Len(sDummy2)
' FreeText between two $x Example: $1FreeText$2
If (InStr(2, sDummy2, "]") = 0 And i > 2)
sDummy2 = Left(sDummy2, 2)
i = 2
End If
'MsgBox("i4=[" & i & "] sDummy2=["& sDummy2 &"]")
If Not bAnotherToken Then
i = Len(sToParse)
End If
sToken = Left(sToParse, i)
If bAnotherToken Then
sToParse = Mid(sToParse, i+1)
Else
sToParse = ""
End If
'MsgBox("sDummy2=["& sDummy2 &"] sToken=["& sToken &"] Left=["& sToParse &"] i=["& i &"]")
If Left(sToken, 2) = "$L" Then
'Now the stringsize should be limited by Number(sDummy)...?
'Since it is not needed for us, skipped here...
ElseIf Left(sToken, 2) = "$N" Then 'New Line
sText = "
"
ElseIf Left(sToken, 2) = "$1" Then 'Street
sText = LD.QueryData("select street from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$2" Then 'City
sText = LD.QueryData("select city from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$3" Then 'Zip Code
sText = LD.QueryData("select ZipCode from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$4" Then 'County
sText = LD.QueryData("select county from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$5" Then 'State
' Normal is rather stupid since it is a number!
sText = LD.QueryData("select state from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$6" Then 'Country
' Description or normal
sText = LD.QueryData("select country from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$7" Then 'Block
sText = LD.QueryData("select block from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$8" Then 'Building/Floor/Room
sText = LD.QueryData("select building from CRD1 where Address = N'"+sBP+"' and CardCode='" + sOCRDCardCode + "'")
ElseIf Left(sToken, 2) = "$9" Then 'AdressType
sText = sBP
Else 'FreeText
sText = sToken
End If
sDummy = _getContent(sToken)
If Len(sDummy) > 0 And Len(sText) > 0 Then
' Additional Content
' A small trick since the description is always
' at the end and so a backwards parse will still
' use the correct formatting
'MsgBox("Now checking the contents of sDummy ["& sDummy &"]...")
For j = Len(sDummy) To 1 Step -1
sDummy2 = Mid(sDummy, j, 1)
If sDummy2 = "P" Then ' Capitalize
sText = Left(UCase(sText), 1) + Right(LCase(sText), Len(sText)-1)
Else If sDummy2 = "U" Then
sText = UCase(sText)
Else If sDummy2 = "O" Then
sText = LCase(sText)
Else If sDummy2 = "D" Then
If Left(sToken, 2) = "$5" Then 'State
sText = LD.QueryData("select oc.name from OCST oc, CRD1 cr where cr.Address = N'"+sBP+"' and cr.CardCode='" + sOCRDCardCode + "' and cr.state = oc.code")
ElseIf Left(sToken, 2) = "$6" Then 'Country
sText = LD.QueryData("select oc.name from OCRY oc, CRD1 cr where cr.Address = N'"+sBP+"' and cr.CardCode='" + sOCRDCardCode + "' and cr.country = oc.code")
End If
End If
Next
End If
'MsgBox("Text to add: ["& sText &"]")
sToReturn = sToReturn + sText
Loop
_getFormattedAddress = sToReturn
End Function
Philipp Knecht
Hi JörnVielen Dank für diesen Parser äääh Adress - Hol - Code ;)
Gruss
Jörn Maas
Hi Phillip,kein Problem.
Vielleicht ist noch erwähnenswert, daß die Namen des BP (Basis und Fremdsprache = OCRD.CardName und OCRD.CardFName) gleich dem Eintrag des Adressnamens (CRD1.Address) sein müssen. Da die SAP hier keine "echte" Referenz hat (die Einträge in der CRD1 können theoretisch ja irgendwie lauten).
Normalerweise existieren hier daher nur 2 echte Referenzen (die als Standard definierten unter OCRD.ShipToDef und OCRD.BillToDef).
Leider hat die SAP hier nicht bis zu Ende gedacht, da keine logische Verknüpfung zwischen Basis- und Fremdsprache und den Adressen besteht. Vielleicht kommt das ja noch irgendwann...
Gruß
Jörn
0
Please sign in to leave a comment.
Comments
0 comments