2016-04-22 2 views
1

Wenn ich einen Salesorder mit Multi DocumentDetails in PHP zu erstellen, hier ist mein CodeAcumatica API erstellen Salesorder mit Multi DocumentDetails Reihe

$SO301000Submit->commands = array 
     (
      $acumatica->prepareValue("SO", $SO301000GetSchema->OrderSummary->OrderType), 
      $SO301000GetSchema->Actions->Insert, 
      $acumatica->prepareValue("ACTIVESTAF", $SO301000GetSchema->OrderSummary->Customer), 

      $SO301000GetSchema->DocumentDetails->ServiceCommands->NewRow, 
      $acumatica->prepareValue("HQ", $SO301000GetSchema->DocumentDetails->Branch), 
      $acumatica->prepareValue("AALEGO500", $SO301000GetSchema->DocumentDetails->InventoryID), 
      $acumatica->prepareValue("WHOLESALE", $SO301000GetSchema->DocumentDetails->Warehouse, true), 

      $SO301000GetSchema->DocumentDetails->ServiceCommands->NewRow, 
      $acumatica->prepareValue("VA", $SO301000GetSchema->DocumentDetails->Branch), 
      $acumatica->prepareValue("AAPOWERAID", $SO301000GetSchema->DocumentDetails->InventoryID), 
      $acumatica->prepareValue("RETAIL", $SO301000GetSchema->DocumentDetails->Warehouse, true), 


      $SO301000GetSchema->Actions->Save, 
      $SO301000GetSchema->OrderSummary->OrderNbr 
     ); 
     $result = $acumatica->client->SO301000Submit($SO301000Submit); 

Es wird der Fehler

System.Web.Services zurückzukehren. Protocols.SoapException: Der Server konnte die Anforderung nicht verarbeiten. ---> System.NullReferenceException: Objektreferenz wurde nicht auf eine Instanz eines Objekts gesetzt. bei PX.Api.SyImportContext.ParseCommand (SyCommand cmd) bei PX.Api.SyExportContext.ParseCommand (SYMappingField Feld) bei System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Collections.Generic.List 1..ctor (IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 Quelle) bei PX. Api.SyExportContext..ctor (SYMapping Mapping, IEnumerable 1 fields, String[] providerFields, Dictionary 2 viewFilters, Boolean BreakOnError, Start Int32, zählen Int32, Wörterbuch 2 selectorViews, String rowFilterField) at PX.Api.ScreenUtils.Submit(String screenId, Command[] commands, SchemaMode schemaMode, PXGraph& graph, String& redirectContainerView, String& redirectScreen, Boolean mobile, Dictionary 2 viewFilters) bei PX.Api.Services.ScreenService.Submit (String id, IEnumerable 1 commands, SchemaMode schemaMode, Boolean mobile, PXGraph& forceGraph, String& redirectContainerView, String& redirectScreen, Dictionary 2 viewFilters) bei PX.Api.Services.ScreenService.Submit (String-ID, IEnumerable`1-Befehle, SchemaMode schemaMode) bei PX.Api.Soap.Screen.ScreenGate.Submit (Command [] -Befehle) --- E nd der inneren Ausnahmestapelüberwachung ---

Aber wenn ich reduzieren Code mit einzelnen DocumentDetails wie folgt:

$SO301000Submit->commands = array 
     (
      $acumatica->prepareValue("SO", $SO301000GetSchema->OrderSummary->OrderType), 
      $SO301000GetSchema->Actions->Insert, 
      $acumatica->prepareValue("ACTIVESTAF", $SO301000GetSchema->OrderSummary->Customer), 

      $SO301000GetSchema->DocumentDetails->ServiceCommands->NewRow, 
      $acumatica->prepareValue("HQ", $SO301000GetSchema->DocumentDetails->Branch), 
      $acumatica->prepareValue("AALEGO500", $SO301000GetSchema->DocumentDetails->InventoryID), 
      $acumatica->prepareValue("WHOLESALE", $SO301000GetSchema->DocumentDetails->Warehouse, true), 

      $SO301000GetSchema->Actions->Save, 
      $SO301000GetSchema->OrderSummary->OrderNbr 
     ); 
     $result = $acumatica->client->SO301000Submit($SO301000Submit); 

Dann ist alles in Ordnung, ein Salesorder erstellt wird.

Hier Funktion prepareValue:

public function prepareValue($value, $command, $needcommit = false, $ignore = false) 
{ 
    $value_command = new ObjectDocument\Value(); 
    $value_command->Value = $value; 
    $value_command->LinkedCommand = $command; 
    if($needcommit) $value_command->Commit = true; 

    $soapvar = new \SoapVar($value_command, SOAP_ENC_OBJECT, "Value", "http://www.acumatica.com/generic/"); 
    return $soapvar; 
} 

Ich weiß nicht, warum? Bitte helfen Sie mir, diesen Fall zu erklären.

+0

Wir haben versucht, den gleichen Satz von Befehlen hier mit einer C# Konsolenanwendung, und es funktionierte. Ich vermute, dass die SOAP-Nachricht, die von PHP gesendet wird, etwas anders ist, was unseren Server zum Absturz bringt. – Gabriel

+0

Kannst du dir auch die generierte SOAP-Nachricht ansehen und sie hier einfügen? Es wird uns erlauben, zu sehen, was fehlt und was mit unserer Botschaft zu tun hat. – Gabriel

+0

Haben Sie eine Lösung gefunden? – Gabriel

Antwort

1

Wie @ Gabriel erwähnt, SOAP-Nachricht, die von PHP gesendet wird, ist etwas anders. Problem ist, dass die XML erstellt für die Anfrage von PHP die ID in XML eingeführt und dann, wo immer es den gleichen Knoten findet, übergibt es einfach die ID als Referenz.

Beispiel (unter SOAP-Nachricht wird unter Verwendung von Fiedler erfaßt): -

enter image description here

dies zu überwinden, schafft sie zwei verschiedene Elemente mit der gleichen Struktur. Sie können verwenden clone

Erstellen Sie neue Funktion PrepareValueExt wie unten und verwenden Sie es für Linien.

public function PrepareValueExt($value, $command, $needcommit=false, $ignore=false) 
{ 
    $value_command = new Value(); 
    $value_command->Value = $value; 
    $value_command->LinkedCommand = clone $command; 
    //$value_command->IgnoreError = $ignore; 
    if($needcommit) $value_command->Commit = true; 

    return($value_command); 
} 

und Änderungs-Code für NewRow auch:

array_push($command, clone $schema->DocumentDetails->ServiceCommands->NewRow); 
+0

GREAT, Vielen Dank. Ich komme gerade von einem anderen Projekt zurück, entschuldige mich für die späte Antwort. Ich teste deinen Code und es läuft richtig. Danke nochmal. –

+0

@Indulgence, ich bin froh, dass es gelöst ist. Bitte akzeptiere es als Antwort :) – DChhapgar

Verwandte Themen