[gelöst] Angebot per Web-Service erzeugen

1. März 2015 19:40

Hallo,

für die Erstellung von Angeboten durch Übernahme aus einem Fremdprogramm, möchte ich einen WebService mit oData erstellen. Beim Speichern der Angebotspositionen erhalte ich jedesmal eine Exception und das Programm stürzt ab.

Folgendes habe ich versucht:

SalesQuoteSalesLines lines = new SalesQuoteSalesLines();
lines.Document_No = "1006";
lines.Document_Type = "Quote";
//lines.No = "1001";
//lines.Type = "Item";
//lines.Quantity = 1;
nav.AddToSalesQuoteSalesLines(lines);
nav.SaveChanges();

Das Angebot konnte ich zuvor erfolgreich anlegen. Sobald ich eine der 3 kommentierten Zeile aktiviere, tritt die Exception auf. Mit den kommentierten Feldern läuft das Programm durch.

Fehlen hier weitere notwendige Felder oder mache ich generell etwas falsch?

Vielen Dank, Dirk
Zuletzt geändert von dpoe2014 am 2. März 2015 15:39, insgesamt 1-mal geändert.

Re: Angebot per Web-Service erzeugen

2. März 2015 09:34

Servus Dirk,

ich weiß zwar nicht ob es die Lösung ist, aber der Primärschlüssel der Sales Line besteht aus Belegart, Belegnr. und Belegzeilennummer, die Belegzeilennummer fehlt in deiner Zuweisung. Kannst ja testhalber mal in 10000er Schritten hochzählen und zuweisen.
Dann würde ich persönlich die Art (Type) vor der Artikelnummer übergeben, wenn du einen Beleg von Hand erfasst "sagst" du auch erst um was für eine Art es sich handelt (Artikel, Sachkonto, Ressource)

Viel Erfolg,
Matthias

Re: Angebot per Web-Service erzeugen

2. März 2015 12:00

Hallo Matthias,

danke, ich habe das mal geändert. Funktioniert leider noch nicht. Zumindestens habe ich jetzt mal einen Hinweis gefunden:

<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code /><m:message xml:lang="en-US">Document No. must have a value in Sales Line: Document Type=Quote, Document No.=, Line No.=0. It cannot be zero or empty.</m:message></m:error>

Das verwirrt mich jetzt etwas, da ich doch die Document No. bereits gefüllt habe.

Der Code sieht momentan so aus:

SalesQuoteSalesLines lines = new SalesQuoteSalesLines();

lines.No = "10010";
lines.Type = "Item";
lines.Line_No = 10000;
lines.Document_No = "10006";
lines.Document_Type = "Quote";

nav.AddToSalesQuoteSalesLines(lines);

nav.SaveChanges();

Hab dies auch in unterschiedlicher Reihenfolge durchgespielt, ebenfalls ohne Erfolg.

Gruß, Dirk

Re: Angebot per Web-Service erzeugen

2. März 2015 12:09

Hallo,

ich bin jetzt nicht gerade der Wbservices- Spezi aber NAV arbeitet in den Pages im Standard eigentlich immer so:

1. Datensatz.INIT;
2. Primärschlüssel setzen
3. Datensatz.INSERT(true);
4. weitere Felder setzen
5. Datensatz.Modify(true);

Evtl. umgeht das deine Fehlermeldung, da die Sales Line bereits existiert, wenn du weitere Felder füllst, die u.U. eine Referenz auf eine existierende Sales Line benötigen (Textbausteine,...)

Gerade die Textbausteine können auch dazu führen, dass du die Zeilennummer jedes mal neu vor dem INSERT ermitteln musst.

Gruß Fiddi

Re: Angebot per Web-Service erzeugen

2. März 2015 13:39

Folgendes läuft ohne Fehler durch, speichert allerdings auch nicht die Position:

SalesQuote quote = new SalesQuote();
quote.Sell_to_Customer_No = "13111";

nav.AddToSalesQuote(quote);
nav.SaveChanges();

SalesQuoteSalesLines lines = new SalesQuoteSalesLines();

lines.Document_Type = "Quote";
lines.Document_No = quote.No;
lines.Line_No = 10000;
lines.No = "10010";
lines.Type = "Item";
lines.Quantity = 1;
lines.Unit_Price = 1;

quote.SalesQuoteSalesLines.Add(lines);
nav.SaveChanges();

Im Debugger enthält das quote-Objekt nach .Add(lines) die zugewiesenen Werte.

Irgendwie alles sehr merkwürdig.....

Dirk

Re: Angebot per Web-Service erzeugen

2. März 2015 15:36

Folgendes funktioniert unter Verwendung der Seifenschnittstelle:

SalesQuote_PortClient client = new SalesQuote_PortClient();

SalesQuote quote = new SalesQuote();
quote.Sell_to_Customer_No = "13111";
client.Create(ref quote);

// Anzahl der Artikelpositionen erzeugen
quote.SalesLines = new Sales_Quote_Line[1];
quote.SalesLines[0] = new Sales_Quote_Line();
client.Update(ref quote);

Sales_Quote_Line line = quote.SalesLines[0];
line.Type = ServiceReference1.Type.Item;
line.No = "10010";
line.Quantity = 10;

client.Update(ref quote);

Angebot + Position angelegt.....

Für mich damit erstmal gelöst, wenn auch nicht befriedigend....