Basis-Services

Service SaveBo - Business Objekt speichern

Hinweis
Hinweis
Eine vollständige Beschreibung der BIZ-Services finden Sie hier: BIZ-Services Übersicht

Port: Biz

Beschreibung

Dieser Service erstellt und/oder mutiert die Attribute von Businessobjekt(en) eines BO-Typs. Für die Ausführung des Service kann ein Startpunkt, eine Suchanweisung, ein zu berücksichtigender Index, die Verarbeitungsart, die Ausführungsart, ein Filter und Rückgabe-Attribute angegeben werden. Ab dem Argument 11 können die Wertzuweisungen erfasst werden mit denen das BO-Attribut erstellt oder mutiert werden soll.

Argumente

Nr.
Key
Name
Beschreibung
1
Bo
Businessobjekt
Startparameter 'Businessobjekt' des Service 'SaveBo'.
2
StartKeys
Startpunkt
Startparameter 'Startpunkt' des Service 'SaveBo'. Die einzelnen Indexsegmente werden durch Kommas voneinander getrennt.
3
SearchOperationCd
Suchanweisung
Startparameter 'Suchanweisung' des Service 'SaveBo'. Meistens wird hier die Suchanweisungen 'e'=gleich verwendet.
4
BoIndex
BO-Index
Startparameter 'BO-Index' des Service 'SaveBo'. Defaultindex ist der Objekt-ID-Index.
5
SaveBoProcessingCd
Verarbeitungsart
Startparameter 'Verarbeitungsart' des Service 'SaveBo'. Folgende Varianten sind gebräuchlich: 1=nur mutieren, 2=nur erstellen, 3=mutieren wenn vorhanden, sonst erstellen.
6
FixedSegsOfBoIndex
Fixierte Indexsegmente
Startparameter 'Fixierte Indexsegmente' des Service 'SaveBo'. Anzahl der beim Startpunkt (StartKeys) fixierten Indexsegmente.
7
SaveBoModeCd
Ausführungsart
Der Service kann u.a. im Test-Modus ausgeführt werden. Mit einem Testlauf können Sie sehen, welche Businessobjekte mutiert/erstellt würden. Da alle Überprüfungen wie beim scharfen Durchgang vorgenommen werden, ist es auch möglich, Fehler schon im voraus zu bereinigen. Bei serienmässigem Mutieren (Filter!) empfehlen wir Ihnen sehr, vorher einen Testlauf durchzuführen.
8
WithReport
Protokoll
Startparameter 'Protokoll' des Service 'SaveBo'. Hier kann angegeben werden, ob der Speichervorgang protokolliert werden soll oder nicht.
9
Filter
Filter
Startparameter 'Filter' des Service 'SaveBo'. Selektionsfunktion in Form von einem logischen Ausdruck, z.B. 'Addr.CountrySc = 'CH' and (Addr.LangNo = 3 or Addr.LangNo = 5)'.
10
ResultObject
Rückgabe-Objekt
Startparameter 'Rückgabe-Objekt' des Service 'SaveBo'. Definiert, welche Attribute im Rückgabe-Objekt enthalten sein müssen. Defaultmässig werden BoId, BoNumber und BoName sowie bei eingeschaltetem Protokoll (WithReport) SaveBoStateCd und SaveBoInfo zurückgegeben.
11
SetValAttr
Wertzuweisungsargumente
Diese Felder sind für die Wertzuweisung gedacht. Pro Argument kann eine Zuweisung definiert werden. Die Syntax für eine Adresse zu mutieren lautet beispielsweise 'LastName='Smith'', 'FirstName='John'', 'Keyword=FirstName + ' ' + LastName'.

Rückgabewerte

Nr.
Key
Name
Beschreibung
1
SaveBoStateCd
Verarbeitungsstatus
Rückgabewert 'Verarbeitungsstatus' des Service 'SaveBo'. Pro Speichervorgang wird im Verarbeitungsstatus festgehalten, ob das BO mutiert bzw. erstellt werden konnte(0), ob ein Fehler aufgetreten ist(1) oder ob das BO erstellt aber nicht mutiert werden konnte(2). Der Verarbeitungsstatus ist nur bei eingeschaltetem Protokoll (WithReport) sichtbar.
2
SaveBoInfo
Anmerkung zum Speichervorgang
Rückgabewert 'Anmerkung zum Speichervorgang' des Service 'SaveBo'. Wenn beim Speichern eines Businessobjekts ein Problem auftritt, wird hier die Fehlerursache(n) aufgeführt. Dieses Feld ist nur bei eingeschaltetem Protokoll (WithReport) sichtbar.

Message Keys

Nr.
Key
Name
Beschreibung
1
Message
SaveBo.Ek.Message
SaveBo.Ek.Message

Zusatzinformationen

Hinweis
Hinweis
Einer Wertzuweisung sollte immer ein @ vorangestellt werden. Dadurch wird die gesamte nachfolgende Eingabe als String interpretiert.
Das ist vor allem dann notwendig, wenn man tatsächlich Gänsefüsschen schreiben will.
Beispiel: Cust.Remark=@Kunde ist "unentschlossen".

Suchanweisung

e = gleich
eif = gleich, wenn gefunden
n = nächste
ne = nächste ab hier (wird auch für Redo und List verwendet)
npe = nächste, auffüllen
nep = nächste ab hier, auffüllen
p = vorangehende
pe = vorangehende ab hier
pne = vorangehende, auffüllen
pen = vorangehende ab hier, auffüllen
f = erste
l = letzte

Filter

Filter in Form eines logischen Ausdrucks.
Beispiel: SalDoc.Nr=15544 and SalDoc.Nr=244585 (SalDocItem.ArtNo='A15.00' or SalDocItem.ArtNo='B177.65')
Logische Operatoren:
and = UND
or = ODER
= vergleich
<> ungleich, nicht
> grösser
>= grösser gleich
< kleiner
<= kleiner gleich

#NoScript

Über dieses optionale Argument können Sie die automatische F-Script-Verarbeitung beeinflussen.
Das Argument betrifft folgende BOs:
  • BO Addr mit ADRSAVE.FF
  • BO Art mit ARTSAVE.FF
  • BO AsstDocItem mit SERZSAVE.FF
  • BO SalDocItem mit VERPSAVE.FF
  • BO PurDocItem mit EINPSAVE.FF
  • BO ObjItem mit OBJSAVE.FF
  • BO ObjStructNode mit OBJSAVE.FF
  • BO SalDoc mit F-Script nach dem Erstellen bzw. nach dem Mutieren.
  • BO PurDoc mit F-Script nach dem Erstellen bzw. nach dem Mutieren.
  • BO AsstDoc mit F-Script nach dem Erstellen bzw. nach dem Mutieren.
Bei einem SaveBo-Request auf eines der obigen BOs, können Sie das Argument #NoScript als letztes Argument anhängen. Das zum jeweiligen BO gehörende F-Script, wird dann nicht ausgeführt. Damit lassen sich u.a. Endlos-Loops vermeiden.

Sprachabhängige Attribute

Ist ein Attribut mehrsprachig, so kann dessen Inhalt unter Angabe der Sprache <Attributname>@@<Sprachnummer> gezielt gespeichert werden.
Beispiel: ArtDimVariant.Name@@1

Rückgabewerte

Attribut
Beschreibung
SaveBoStateCd
Verarbeitungsstatus:
0 = OK
1 = Error (BO wurde nicht gespeichert)
2 = CreatedOnly (BO wurde erstellt, aber nicht gespeichert)
Achtung: Dieses Attribut kann nur abgefragt werden, wenn das Argument <Protokoll>=1 (true) gesetzt ist.
SaveBoInfo
Anmerkung zum Speichervorgang
Achtung: Dieses Attribut kann nur abgefragt werden, wenn das Argument <Protokoll>=1 (true) gesetzt ist.
Achtung
Achtung
Beachten Sie unbedingt, dass für das Prüfen eines Speichervorgangs nicht nur der Status (Ausführungsstatus) des Service, sondern insbesondere der SaveBoStatCd abgefragt werden muss. Das Prüfen des Status, welcher bei erfolgreicher Ausführung eines Service OK zeigt, genügt nicht.
Beispiel: Es soll eine neue Adresse gespeichert werden. Im Studio ist eingestellt, dass die Adressnummer automatisch vom System vergeben wird. Wird nun versucht eine Adresse mit Vorgabe einer Adressnummer zu speichern, so zeigt der Status des SaveBo zwar OK, der SaveBoStatCd aber korrekt 1 (Error).
In seltenen Konstellationen kann es vorkommen, dass der Service fehlerhaft ausgeführt wurde, der SaveBoStateCd aber 0 (ok) zeigt. Falls Sie sowohl die Ausführung des Service als auch den SaveBoStateCd prüfen wollen, empfehlen wir folgendes Vorgehen:
1. Prüfen ob der Service korrekt ausgeführt wurde. (ok, mKey und mText) Falls dies der Fall ist, muss zusätzlich der SaveBoStateCd geprüft werden.
2. Prüfen des SaveBoStateCd und der SaveBoInfo.
Beispiel einer solchen Prüfung mit Ausgabe von ok, mKey, mText, SaveBoStateCd und SaveBoInfo:
«X(msgText=)»
...
...
...
# Prüfungen nach Ausführen des Service:
#
# Status ok (0/1)
«X(Status=Status: «XRES(resArtMisC3:ok)» «(character("13"))\E»«(character("10"))\E»)»
# 
# Falls Status ERR (0) werden mKey und mText ausgegeben.
«nzXRES(resArtMisC3:ok)=0»«X(MsgKey=MsgKey: «XRES(resArtMisC3:mKey)» «(character("13"))\E»«(character("10"))\E»)»
«nzXRES(resArtMisC3:ok)=0»«X(MsgText=MsgText: «XRES(resArtMisC3:mText)» «(character("13"))\E»«(character("10"))\E»)»
#
# Falls Status OK (1) werden SaveBoStateCd und SaveBoInfo ausgegeben und gegebenenfalls anschliessend geprüft.
nzXRES(resArtMisC3:ok)=1»«X(SaveBoStateCd=SaveBoStateCd: «XRES(resArtMisC3:SaveBoStateCd)» «(character("13"))\E»«(character("10"))\E»)»
nzXRES(resArtMisC3:ok)=1»«X(SaveBoInfo=SaveBoInfo: «XRES(resArtMisC3:SaveBoInfo)» «(character("13"))\E»«(character("10"))\E»)»
#
# Zusammenstellen der Informationen für die Ausgabe.
«X(msgText+Status)»
«X(msgText+MsgKey)»
«X(msgText+MsgText)»
«X(msgText+SaveBoStateCd)»
«X(msgText+SaveBoInfo)»
# 
# Ausgeben der Informationen.
«SYS(MSG CRIT «X(msgText)»)»
# 
# Nachfolgend muss nun u.U. noch anderweitig auf die eventuellen Fehler reagiert werden.
...
...
...

Beispiel 1

Verkaufsposition: SetKopf-Position erstellen:
«XSER(setSalDocItem:SaveBo)»
«XSER(setSalDocItem:addArg=SalDocItem)»
«XSER(setSalDocItem:addArg=)»
«XSER(setSalDocItem:addArg=e)»
«XSER(setSalDocItem:addArg=)»
«XSER(setSalDocItem:addArg=2)»
«XSER(setSalDocItem:addArg=)»
«XSER(setSalDocItem:addArg=0)»
«XSER(setSalDocItem:addArg=1)»
«XSER(setSalDocItem:addArg=)»
«XSER(setSalDocItem:addArg=SalDocItem.ItemNo,SalDocItem.InternalNo)»
«XSER(setSalDocItem:addArg=SalDocItem.SalDocInternalNo=@«AUF-DOKINR»)»
«XSER(setSalDocItem:addArg=SalDocItem.ArtNo=@ZZVDDHEAD1)»
«XSER(setSalDocItem:addArg=SalDocItem.Quantity=@1)»
«XSER(setSalDocItem:addArg=SalDocItem.Free5=@«TODAY\D10»)»
«XSER(setSalDocItem:addArg=SalDocItem.Free6=@«MEA(1007)»)»
«XSER(setSalDocItem:addArg=SalDocItem.Free7=@«MEA(1005)»)»
«XSER(setSalDocItem:addArg=SalDocItem.Free8=@«MEA(1004)»)»
«nXSER(setSalDocItem:execute>setSalDocItemRes)\A»

# Prüfen des Status
«nzXRES(setSalDocItemRes:ok)=0»*> Fehler: «XRES(setSalDocItemRes:mText)»

# Prüfen des SaveBoStateCd
«z~XRES(setSalDocItemRes:SaveBoStateCd)=0\N»*> Fehler: «XRES(setSalDocItemRes:SaveBoInfo)»

# SetKopf Nummer und SetKopf Interne Nummer speichern
«X(SetKopfNr=«XRES(setSalDocItemRes:SalDocItem.ItemNo)»)»
«X(SetKopfInr=«XRES(setSalDocItemRes:SalDocItem.InternalNo)»)»

Beispiel 2

Verkaufsposition: SetZeilen-Position erstellen:
/Save-Setzeilen
«nNO(2)»
# Eine neue Setzeile anlegen
«XSER(setSalDocItemSet:SaveBo)»
«XSER(setSalDocItemSet:addArg=SalDocItem)»
«XSER(setSalDocItemSet:addArg=)»
«XSER(setSalDocItemSet:addArg=e)»
«XSER(setSalDocItemSet:addArg=)»
«XSER(setSalDocItemSet:addArg=2)»
«XSER(setSalDocItemSet:addArg=)»
«XSER(setSalDocItemSet:addArg=0)»
«XSER(setSalDocItemSet:addArg=1)»
«XSER(setSalDocItemSet:addArg=)»
«XSER(setSalDocItemSet:addArg=)»
«XSER(setSalDocItemSet:addArg=SalDocItem.SalDocInternalNo=@«MEA(1006)»)» # Interne Dokumentnummer
«XSER(setSalDocItemSet:addArg=SalDocItem.InternalNo=«X(SetKopfInr)»)»    # Interne Nummer des Setkopfes
«XSER(setSalDocItemSet:addArg=SalDocItem.ItemNo=«X(SetKopfNr)»)»         # Zeilennummer des Setkopfes
«XSER(setSalDocItemSet:addArg=SalDocItem.SetItemNo=«NO(2,0)»)»           # Zeilennummer des Setkopfes
«XSER(setSalDocItemSet:addArg=SalDocItem.ArtNo=@«MEA(1001)»)»            # Artikelnummer für Setzeile
«XSER(setSalDocItemSet:addArg=SalDocItem.Quantity=@«MEA(1003)»)»         # Menge für Setzeile
«XSER(setSalDocItemSet:addArg=SalDocItem.PosText=@«MEA(1002)»)»          # Positionstext der Setzeile
#
«nXSER(setSalDocItemSet:execute>setSalDocItemSetRes)\A»

# Prüfen des Status
«nzXRES(setSalDocItemSetRes:ok)=0»*> Fehler: «XRES(setSalDocItemSetRes:mText)»

# Prüfen des SaveBoStateCd
«z~XRES(setSalDocItemSetRes:SaveBoStateCd)=0\N»*> Fehler: «XRES(setSalDocItemSetRes:SaveBoInfo)»
/

Beispiel 3

Verkaufsposition mutieren:
# Mutieren des ZA-Wert 1
«XSER(setSalDoc:SaveBo)»
«XSER(setSalDoc:addArg=SalDoc)»
«XSER(setSalDoc:addArg=«AUF-DOKINR»)»
«XSER(setSalDoc:addArg=e)»
«XSER(setSalDoc:addArg=7)»
«XSER(setSalDoc:addArg=1)»
«XSER(setSalDoc:addArg=1)»
«XSER(setSalDoc:addArg=0)»
«XSER(setSalDoc:addArg=1)»
«XSER(setSalDoc:addArg=)»
«XSER(setSalDoc:addArg=)»
«XSER(setSalDoc:addArg=SalDoc.DocCharge1Value=@10)»
«XSER(setSalDoc:addArg=SalDoc.DocCharge1=@9.30)»
#
«nXSER(setSalDoc:execute>setSalDocRes)\A»

# Prüfen des Status
«nzXRES(setSalDocRes:ok)=0»*> Fehler: «XRES(setSalDocRes:mText)»

# Prüfen des SaveBoStateCd
«z~XRES(setSalDocRes:SaveBoStateCd)=0\N»*> Fehler: «XRES(setSalDocRes:SaveBoInfo)»