Performance C# Code
Rafael Stalder
Hallo Zusammen.Ich entwickle gerade ein kleines AddOn für SAP Business One.
Leider ist die Performance oder Geschwindigkeit nicht gerade beeindruckend.
Deshalb dachte ich, ich frage mal bei der Coresystems oder anderen Entwicklern nach, ob es beim SAP-SDK Dinge zu beachten gibt, welche den Code verlangsamen und ob es Tricks gibt, den eigenen Code schneller zu gestallten.
Gruss Rafael
Manuel Marhold
Hi.Abfragen auf SQL-Ebene per Data.SqlClient.SqlDataAdapter etc. ausführen, nicht per SAP-Recordset-Object.
Bei Änderungen an der Oberdfläche bzw. ändern von Werten in Textboxen etc. form freezen (wenn möglich, geht leider nicht immer (bzw. geht schon, aber dann bekommste einen Fehler beim füllen der Werte))
Rafael Stalder
Hallo Manueldanke für die Tipps.
Ich benutze auf der SQL Ebene immer den SqlDataReader zum auslesen meiner Select-Statements. Ist das ebenfalls eine schnell Variante oder denkst du es gibt schnellere?
Die Formen freeze ich ebenfalls. Wusste jedoch nicht, dass das auch positive Auswirkungen auf die Performance hat.
Mein grösstes Problem ist momentan beim einlesen meiner Datensätze in meine Form. Ich führe den ChooseFromList Event aus. In diesem Event lade ich die Werte via SqlDataReader in meine Form.
Leider braucht das Ganze fast 5 Sekunden. Bin der Meinung es könnte schneller gehen.
Gruss Rafael
Manuel Marhold
Hi Rafael,der SqlDataReader passt schon. Du öffnest einen DataAdapter und führst führst dann die SelectAnweisung aus und lädst da in der Reader, richtig?
Wo kommen die Werte her? stehen die in einer Tabelle?
An welche DatenSource hast du die Felder gedunden? Wenn die ganzen Werte in einer Tabelle stehen: hole dir die Tabelle, binde alle Felder an die Tabelle und das entsprechende Feld und lade dann den Datensatz anhand des keys.
Wenn es einzelne UserDataSources sind, da kann man glaube ich nicht viel machen.. :(
Rafael Stalder
Hallo Manuelja genau. So mache ich das momentan.
Die Werte stammen aus mehreren Tabellen (etwa so wie bei der Rechnung OINV+INV) nur dass es halt eigene Tabellen sind. (Keine UDO's sondern lediglich Benutzerdefinierte Tabellen).
Nun, auf der Form habe ich einigen Feldern DataSources hinterlegt (Datum, Mengen, Preis). Aber nicht alle haben solche Datasources.
Wie meinst du das mit "Hole dir die Tabelle". Kann man die ganze Tabelle in ein DataSet laden? Wenn ja, hast du ein Codebeispiel?
Gruss Rafael
Manuel Marhold
Hi Rafael,Wenn du die Daten per Query ziehen kannst, kannst du auch eine DataTable dem Formular hinterlegen und diese per Query füllen.. das geht schneller.
Du kannst im Formular DataSources hinterlegen.
DBDataSource = Datenbanktabellen komplett
DataTable = Tabelle im Speicher, die du per Query oder manuell füllen musst
UserDataSource = eine Feld
Beispiele gibt es in der Hilfe vom SAP SDK (aber das gilt dann nur für das SAP SDK) und sonst glaube ich auch hier: http://www.coresystems.ch/forum.html?&L=&tx_mmforum_pi1[action]=list_post&tx_mmforum_pi1[tid]=2628
Edit: du solltest jedes Feld an eine DataSource binden.. bessere Performance + eineige Funktionen gehen nur, wenn das Feld an eine DataSource gebunden ist..
Rafael Stalder
Hallo Manuelok. ich werde mal versuchen ob es schon was bringt wenn ich bei jedem Feld meiner Form eine DataSource hinterlege. Könnte schon etwas bringen denke ich (vorallem beim ein- und auslesen der Values).
Ich werde mich dann wieder melden, wenn ich das Ganze implementiert habe.
Danke & Gruss
Rafael
Rafael Stalder
Hallo Zusammenhabe einige Recherchen zu C#-Programmierung im SAP angestellt. Hier einige Punkte mit welcher man die Performance sicherlich teilweise verbessern kann:
1. Lieber wenig große wie viel kleine Assemblys.
2. Propertys sind zeitraubender als öffentliche Attribute. Bei einfachen switches eher öffentliche Attribute verwenden (z.B: public bool Testattribut).
3. for anstatt foreach
4. Sorgfälltiger Gebrauch von Try-/Catch-Blöcken
5. Datasources verwenden bei eigenen Formen (schnelleres Einlesen der Daten)
Hoffe das Hilft vielleicht dem einen oder anderen weiter.
Gruss Rafael
0
Please sign in to leave a comment.
Comments
0 comments