Artikel hinzufügen/bearbeiten

Andreas Eugster

Hallo zusammen

habe ein Problem:

Kennt jemand den genauen Befehl wie ich die Artikelstammdaten updaten bez. neue Artikel erfassen kann?

Folgenden Code habe ich:


SAPbobsCOM.Items OITM = (SAPbobsCOM.Items)comp.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oItems);

Doch wenn ich irgendetwas abfüllen möchte, entsteht ein Error, bei dem es heisst, Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Weis jemand, was ich da falsch mache?

Besten dank & Gruss

Andreas

Marco Schweighauser

Bei welchem Objekt kommt der Fehler, resp. welches Objekt ist NULL ?


Gruss

Marco

Andreas Eugster

Problem hat sich erledigt, die Source war null und nicht das Items - Object.

Andreas Eugster

so habe noch eine Frage. Wie ihr evt gemerkt habt, bin ich dabei eine Schnittstelle zu erstellen, bei denen Artikel hinzugefügt bez. geupdatet werden. Ich habe jetzt das ganze Addon erstellt. Doch habe ich ein kleines Problem. Für den Import von ca. 110 Artikeln benötige ich rund 1.5 Minuten. Wenn ich 1'000 Artikel einlese rund 45 Minuten. Dies ist natürlich nicht vertretbar. Diese lange Dauer habe ich auf die Objekte zurückgeführt (SAPbouCOM.Itms in meinem Fall). Gibt es eine andere möglichkeit den Import zu vollziehen? Andere Objekte die effizienter sind? Ich habe früher schon mal ein solches Addon erstellt, jedoch alles mit SQL - Updates. Doch dies war sehr mühsam zum programmieren. Denn bei den Objekten wäre ja der Test auf die Richtigkeit der Daten bereits vorhanden. Warum soll ich also das Rad neu erfinden?

Hoffe jedmand hat mir einen guten Tipp oder eine Anregung.

Gruss
Andreas

Marco Schweighauser

Hallo Andreas,

ja das DI ist sehr langsam. Leider gibt es keine Möglichkeit dies zu beschleunigen.

Schau mal im Taskmanager ob eventuell der Speicher immer wie mehr zunimmt. In diesem Fall würde ich das Objekt nochmals neu allozieren und eventuell GC.Collect aufrufen um den benötigten Speicher zu minimieren.


Gruss

Marco

Andreas Eugster

Hallo Marco

Das mache ich bereits...

Weisst du, ob die DI in naher Zukunft überarbeitet wird? So musst ich mein Programm wieder umschreiben und das ganze mit SQL schreiben... Denn für ca. 1000 Artikel 45 Minuten zu haben ist kein Zustand, weder für den Kunden noch für uns Entwickler...

Oder kannst du mir etwas anderes empfehlen?

Gruss

Andreas

Marco Schweighauser

Hmm, könntest du mal einen Code Ausschnitt posten eventuell ist sonst noch etwas falsch.

Andreas Eugster

Besten Dank für deinen Einsatz. Unten findest du den Code.
Ich lese die Daten aus einem XML-File:

string strCo = pos.SelectSingleNode("Artikel-Nr").InnerText;
if (OITM.GetByKey(strCo))
{
try
{
OITM.ItemCode = strCo;
OITM.ItemName = pos.SelectSingleNode("ArtBez1_de").InnerText;
OITM.BarCode = pos.SelectSingleNode("EAN").InnerText;
OITM.PriceList.SetCurrentLine(2);
OITM.PriceList.Price = Convert.ToDouble(pos.SelectSingleNode("BruttoPreis").InnerText);
OITM.PriceList.SetCurrentLine(5);
OITM.PriceList.Price = Convert.ToDouble(pos.SelectSingleNode("NettoPreis").InnerText);
OITM.Update();
if (OITM.Update() == 0)
{
strLog += "Der Artikel " + pos.SelectSingleNode("Artikel-Nr").InnerText + " wurde erfolgreich angepasst. Zeit: " + DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + sw.NewLine;
}
else
{
string strFehler = comp.GetLastErrorDescription();
strLog += "Beim Artikel " + pos.SelectSingleNode("Artikel-Nr").InnerText + " trat beim Anpassen ein Fehler auf: " + strFehler + " Zeit: " + DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + sw.NewLine;
}
}
catch (Exception e2)
{
string strFehler = comp.GetLastErrorDescription();
strLog += "Beim Artikel " + pos.SelectSingleNode("Artikel-Nr").InnerText + " trat beim Anpassen ein Fehler auf: " + strFehler + " Zeit: " + DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + sw.NewLine;
}
}
else
{
try
{
OITM.ItemCode = strCo;
OITM.ItemName = pos.SelectSingleNode("ArtBez1_de").InnerText;
OITM.BarCode = pos.SelectSingleNode("EAN").InnerText;
OITM.PriceList.SetCurrentLine(3);
OITM.PriceList.Price = Convert.ToDouble(pos.SelectSingleNode("BruttoPreis").InnerText);
OITM.PriceList.SetCurrentLine(4);
OITM.PriceList.Price = Convert.ToDouble(pos.SelectSingleNode("NettoPreis").InnerText);
if (OITM.Add() == 0)
{
strLog += "Der Artikel " + pos.SelectSingleNode("Artikel-Nr").InnerText + " wurde erfolgreich hinzugefügt. Zeit: " + DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + sw.NewLine;
}
else
{
string strFehler = comp.GetLastErrorDescription();
strLog += "Beim Artikel " + pos.SelectSingleNode("Artikel-Nr").InnerText + " trat beim Hinzugefügen ein Fehler auf: " + strFehler + " Zeit: " + DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + sw.NewLine;
}
}
catch (Exception e2)
{
string strFehler = comp.GetLastErrorDescription();
strLog += "Beim Artikel " + pos.SelectSingleNode("Artikel-Nr").InnerText + " trat beim Hinzugefügen ein Fehler auf: " + strFehler + " Zeit: " + DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + sw.NewLine;
}
}



EDIT: Das mit dem Preis, habe ich noch nicht genau herausgefunden wie das läuft. Muss ich da als int-wert einfach die Nummer der Preisliste übergeben?

Andreas Eugster

Nachtrag: Ich habe jetzt die Updateregel in SQL gelöst und benötige nur noch ca. 1.5 min für 6'000 Artikel :)
Doch wenn es Artikel hat, welche neu hinzugefügt werden müssen, habe ich immer noch relativ lange....


Hoffe du findest noch etwas heraus.

Gruss

Andreas

Marco Schweighauser

Hallo Andreas,

sehe keinen Fehler im Code welche die Ausführung verlängern würde. Dauert es auch bei einer anderen DB so lange ?



Gruss

Marco

Andreas Eugster

Hallo Marco

Ja auch bei einer anderen DB ist dies der Fall.

Gruss

Andreas
0

Comments

0 comments

Please sign in to leave a comment.

Didn't find what you were looking for?

New post