Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von GarlandGreene
Thema: SAP Verbindung mit SAPFEWSELib
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

ist zwar unwahrscheinlich, aber ist das ein frisch installierter SAP GUI 7.50? Dann könnte einmal neustarten ausreichen. Das Ding hat nach der Installation ein paar Grafikfehler, die nach dem Neustart aber weg sind.

Thema: Zwei unterschiedliche IP-Bereiche Zugriff ermöglich
Am im Forum: Netzwerktechnologien

wenn die IT einem verbietet, die IP zu ändern, wird sie einem aus demselben Grund (versehentlich doppelt vergebene Adressen im internen Netz) auch verbieten, eine IP-Adresse per Kommandozeile zu vergeben.

Wenn die IP-Range, die man zusätzlich braucht, sich nie ändert, kann man die IT einfach bitten, einem ein Routing in diesen Adressbereich einzurichten. Dann klemmt man einfach den Controller ans interne Netz an und richtet ihn ein. Routing können auch schon Switche mit Management, dafür braucht man keinen expliziten Router. Am besten am Default-Gateway einrichten, dann muss man an den Clients gar nichts mehr machen.

Thema: Konfigurationsdatei auf Netzlaufwerk
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Problem 1 (Editor) ist ne Bequemlichkeitssache, mit nem guten Xml-Editor ist das evtl. auch nicht unbedingt nötig. Eine UI für bestimmte XML-Dateien zu bauen, die die Datei öffnet, einen Dialog für ein paar Werte in der Datei anzeigt und dann die Änderungen darin speichert, ist nicht zu kompliziert umzusetzen. Man muss halt entweder was generisches bauen, was beliebige XML-Dateien editieren kann (= man baut sich einen Xml-Editor) oder man geht individuell auf spezifische Xml-Dateien ein, wie auch immer man die identifiziert.

Problem 2 ist eigentlich Softwareverteilung. Ob da jetzt die Software neu installiert werden soll oder nicht, eigentlich ist eine Änderung in der app.config gleich einem neuen Versionsstand der Software. Es gibt günstige oder auch kostenlose Softwareverteilungs-Lösungen, die einem das Problem abnehmen können. PDQ und WPKG setzen wir selber intern ein, um Software auszurollen. WPKG ist da sehr flexibel, PDQ sehr bequem. Alternativ könnte man ein Powershell-Skript schreiben, das alle Rechner in der Domäne (ohne Domäne wirds bei 30 Rechnern im Netzwerk etwas mühsam) auf eine installierte Anwendung abprüft und die Konfigurationsdatei austauscht, wenn sie sich unterscheidet. Wenn man das etwas feiner steuerbar machen möchte, hängt man alle zu prüfenden Rechner in eine AD-Gruppe und verarbeitet im Skript nur deren Mitglieder. Damit sind die Entwickler-Rechner auch aussen vor, denn die wollen sowas meist nicht automatisieren. Dann ändert man die zentral abgelegte app.config und das auf irgendeinem Server per Batch ausgeführte Skript erledigt alle 30 Minuten den Rest.

Thema: .net Core: Umstieg von Windows zu Linux
Am im Forum: Smalltalk

Linux selbst ist, wenn man Support haben möchte, sicher nicht groß günstiger als Windows. Ein SLES mit unlimited VM kostet nicht groß weniger als ein Windows Datacenter. Dafür hat man bei SLES gleich den Support für Postgres mit dabei. Und wenn man sich mal die Lizenzproblematik Oracle in virtuellen Umgebungen anschaut, will man von dem Setup eigentlich nur noch weg.

Administration unter Linux ist für Windows-Admins sicher nicht ganz ohne, aber es gibt für Unternehmen eigentlich keinen Grund, nicht zweigleisig zu fahren. Bei uns laufen die SAP-Systeme auf SLES, ein paar Webanwendungen ebenfalls, der Rest läuft mit Windows.

Thema: Datenaustausch zwischen zwei Computern und zwei Anwendungen
Am im Forum: Rund um die Programmierung

sowas würde ich mit WebAPI-Schnittstellen (selfhosted in deiner Anwendung) realisieren. Das lässt sich recht einfach in beiden Anwendungen isoliert testen (für GET reicht ein Browser, für POST kann man sowas wie Fiddler verwenden).

Thema: Edifact IDOC SAP Format in C# Parsen
Am im Forum: Rund um die Programmierung

SAP Idocs sind Textdateien mit fester Länge und verschiedenen Satzarten. Zum Einlesen musst du die Satzarten kennen und wissen, welche Satzart welche Felder hat, wie lang diese sind und in welcher Reihenfolge die in der Zeile stehen. Im SAP-System kannst du die Idoc-Dokumentation u.a. über die Transaktion WE60 erhalten. In jedem Fall solltest du die Doku von deinem Auftraggeber erhalten.

EDIFACT ist auch ein Textformat, allerdings anders aufgebaut. Auch EDIFACT kennt Nachrichtenarten, Segmentarten und Semente, die Felder werden aber durch konfigurierbare Trennzeichen (üblicherweise "+" für Segmente und ":" für Felder innerhalb der Segmente) getrennt. Segmentarten werden durch das '-Zeichen getrennt. Eine ganz praktische Übersicht über die Nachrichtenarten und die dazugehörigen Inhalte gibts u.a. hier: http://www.stylusstudio.com/edifact/frames.htm . Die Standards werden von der UN (UNECE) festgelegt und können auch auf den Seiten der UNECE heruntergeladen werden (allerdings nicht sondern bequem).

Die Idocs wirst du Zeile für Zeile einlesen müssen. Ob du zuerst das ganze Idoc einliest und auswertest oder Satz für Satz direkt EDIFACT-Daten erzeugst, ist dir überlassen. Da man aber häufiger auch Daten über mehrere Datensätze (wie z.B. alle Rechnungspositionen mit einem bestimmten Steuersatz) in ein EDIFACT-Segment übergeben muss, macht es mehr Sinn, zuerst das gnaze Idoc einzulesen und in ein internes Format zu konvertieren, auf das du einfacher zugreifen kannst.

Thema: Deserialisieren: RAM wird voll
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

wobei es zwischen einem expliziten Dispose() und der Nutzung des FileStreams in einem using-Block eigentlich ja keinen Unterschied geben dürfte. using() ruft ja auch nur Dispose bei Verlassen des Blocks auf. Insofern hätte die ursprüngliche Lösung auch kein memoryleak erzeugen dürfen. Oder andersherum, das einzelne using() hätte ein evtl. vorhandenes Leak nicht beseitigen dürfen.

Thema: Deserialisieren: RAM wird voll
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

versuch doch mal, dein Programm solang laufen zu lassen, bis kein Speicher mehr übrig ist. Wenn du das schaffst, kannst du dich über nicht funktionierende Garbage Collection beschweren. Aber der GC räumt nicht immer gleich dann auf, wenn man es gerne hätte sondern oft erst dann, wenn er muss. Und von Hand aufrufen muss man ihn normalerweise auch nicht.

Thema: Festellen, ob sich eine Methode geändert hat
Am im Forum: Rund um die Programmierung

wenn man Methoden vollständig von Unit-Tests abdecken will, ändert man doch als erstes den Test und sorgt dann dafür, dass die Methode den Test wieder erfolgreich absolviert (TDD).

Thema: Mandantenfähigkeit und Zentrale Tabellen
Am im Forum: Rund um die Programmierung

Mandantenfähigkeit kann man auch anders umsetzen. Eine technisch sehr einfache Variante, die z. B. die SAP in ihrem ERP-System nutzt, ist die Speicherung aller Datensätze mit einer Mandantennummer. Mandantenunabhängige Tabellen haben das Feld nicht, alle anderen Tabellen schon. Zugriffe auf mandantenabhängige Tabellen dürfen dann natürlich nur inklusive der Mandantennummer erfolgen. Damit das auch eingehalten wird, sollte man alle Zugriffe auf die Datenbank dann über ein Repository ausführen, das die Zugriffe entsprechend vornimmt.

Thema: Design: Wie Objekte (aus der Datenbank) füllen? (Load-Methoden, DB-Basisklasse, System.Data, ...)
Am im Forum: Datentechnologien

in fast allen etwas größeren Projekten kommt für sowas ein Objektrelationaler Mapper (Entity Framework, NHibernate) zum Einsatz. Für den Transport zwischen Webservice und Webservice-Client werden üblicherweise Datentransferobjekte eingesetzt, so dass eine Änderung in der Datenbankstruktur nicht zwangsläufig eine Änderung in der Webservice-API bedeutet.

Thema: Fluent NHibernate: Problem mit One-To-Many Mapping
Am im Forum: Datentechnologien

deine Klassenbezeichnungen sind etwas durcheinander. Du hast eine Klasse "Mitarbeiter", im Mapping verwendest du aber eine Klasse "Staffer". Und auch der Konstruktor in der Klasse "Mitarbeiter" deutet darauf hin, dass diese Klasse eigentlich "Staffer" heissen sollte. Wenn das tatsächlich so im Quellcode steht, würde ich erstmal das aufräumen. Ansonsten bitte den geposteten Quellcode korrigieren.

Thema: Einfache Datenbank für parallele Zugriffe
Am im Forum: Datentechnologien

auch wenn mir dabei das Frühstück hochkommt, fällt mir zu dem Thema am ehesten eine Access-Datenbank ein.

Thema: Zweite RS232 Schnittstelle
Am im Forum: Rund um die Programmierung

ein Fehler ganz oben: im DataReceived-Event von sPort1 verwendest du denselben Eventhandler (sPort_DataReceived statt sPort1_DataReceived) wie für sPort. So soll das vermutlich aussehen:


sPort1.DataReceived += new SerialDataReceivedEventHandler
(sPort1_DataReceived);

Thema: MVC3 und IoC/DI in Multilayer
Am im Forum: Web-Technologien

am einfachsten kann man in solchen Fällen im Businesslayer eine eigene Initialisierung implementieren. Die muss dann nur bei der Initialisierung des Containers berücksichtigt werden. Du könntest z. B. ein eigenes Interface erstellen, das nur eine Init()-Methode mit dem erzeugten Container als Parameter entgegennimmt. Dann registrierst du die Implementierung(en, könnten ja mehrere sein) bei der Container-Initialisierung, lässt dir sofort eine Liste alle Implementierungen auflösen und rufst die Init()-Methode jeder Implementierung auf. Damit hat dein WebGUI-Projekt keinen direkten Verweis auf das DataAccess-Layer und kann trotzdem darin enthaltene Komponenten auflösen.

Wenn du jetzt auch im DataAccess-Layer eigene Interfaces und Komponenten hast, die du auch im Businesslayer nicht sehen kannst, kannst du dasselbe Spielchen auch mit dem DataAccess-Layer machen, indem du in der Initialisierung im Businesslayer auf dieselbe Art und Weise konstruierst.

Thema: Qualitätssicherung: Wie konnte ein offensichtlicher Fehler in JellyBean 4.2 übersehen werden?
Am im Forum: Smalltalk

der konkrete Fehler bei Android 4.2 war doch ein reines UI-Problem, bei dem ein Control falsch angesteuert wurde. Zuerst wurden Min- und Maxwerte gesetzt, danach wurde die Werteliste zugeordnet. Dabei wurde übersehen, dass das Zuordnen einer Werteliste die Min- und Maxwerte anscheinend auf den Index der Werteliste zurücksetzt.

Thema: [Gelöst] SAP RFC Commit nach BAPI aufruf
Am im Forum: Rund um die Programmierung

Soweit ich weiss, geht das nicht, jeder Aufruf erfolgt in seinem eigenen Kontext. Man kann sich aber damit behelfen, einen SAP-Baustein zu bauen, der dieselben Eingangsparameter wie der eigentliche Funktionsaufruf hat und der am Ende den Commit-Baustein aufruft.

Thema: Versionierung in Anwendungseinstellungen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

die Einstellungen werden in Konfigurationsdateien entweder pro User oder pro Anwendung (systemseitig also global) auf dem lokalen System abgelegt. Die ändern sich natürlich nicht, wenn du eine neue Version deiner Anwendung verteilst, sonst würden sich alle anwenderseitigen Einstellungen bei jedem Update ändern. Ich kann nur vermuten, dass du bei der Installation über dein Setup die Anwendungseinstellungen überschreibst und damit die neue Version hinterlegst, was beim manuellen Kopieren der Anwendung nicht passiert.

Fragt sich, warum du die Version der Anwendung, die ja abhängig von der Assembly ist, in eine Konfigurationsdatei legst? Warum rufst du nicht einfach direkt die aktuelle Version der Assembly ab?

Thema: An den Rückgabewert der Methode aus der Oberklasse kommen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

warum überschreibst du setSize überhaupt, wenn die Implementierung sich nicht ändern soll?

abgesehen davon ginge das zum Beispiel so:


abstract class MyClass
{
   private int testWert = 2;

   public virtual float setSize()
        {
            float test = 7.5f;
            return test;
        }
}

class MyChild : MyClass
{
        public override float setSize()
        {
            float baseTest = base.setSize();
            return baseTest;
        }
}

Thema: ASP.NET MVC Controller: Methode bevor View aufgerufen wird
Am im Forum: Web-Technologien

was meinst du eigentlich mit "Variable zurücksetzen"? Eine "Variable" ist normalerweise ja was methodenlokales, was in dem Zusammenhang keinen Sinn machen würde.

Thema: Verhindern, dass sich Benutzer-Settings nach rebuild ändern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

es gibt eine Upgrade()-Funktion in den Settings.

ich erledige das so:


                if (Properties.Settings.Default.CallSettingsUpgrade)
                {
                    Properties.Settings.Default.Upgrade();
                    Properties.Settings.Default.CallSettingsUpgrade = false;
                }

CallSettingsUpgrade ist dabei ein Setting vom Typ Bool mit Standardwert "true". Daher ist das Setting nach einem Upgrade der Anwendung erstmal "true" und wird nach Upgrade der Settings auf "false" zurückgesetzt.

Thema: Garbage Collector auf Performance optimieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

blöde Frage: warum ist es schlimm, wenn die Verarbeitung hin und wieder länger dauert? Muss eine Rückmeldung innerhalb der 150 ms irgendwohin erfolgen oder ist die Anwendung einfach nur nicht darauf ausgelegt, einen zweiten Aufgabensatz zu beginnen, wenn der erste noch nicht abgeschlossen ist?

Thema: Virtualisierung des Arbeitsplatzes
Am im Forum: Smalltalk

mein eigentlicher Rechner ist nicht virtualisiert, weil ich zusätzlich noch virtuelle Maschinen in VMWare Workstation-Umgebungen neben meiner eigentlichen Installation nutze. Rechenleistung ist gar nicht so das Problem bei Virtualisierung, ich finde eher die Bedienung etwas träge. Und ich weiss nicht, wie weit die Citrix-Technik mittlerweile ist, aber vor einigen Jahren konnte man Videos (z. B. Ausschnitte der Entwicklerkonferenzen von MS) noch nicht über RDP oder Citrix schauen, ohne dass das heftig geruckelt hat.

vDesktops haben natürlich nette Vorteile. Regelmäßige Backups in der Nacht, Nebenbei-Betrieb mehrerer Maschinen für verschiedene Zwecke usw.

Thema: Warum FaultContract in WCF benutzen?
Am im Forum: Netzwerktechnologien

der FaultContract ist einfach Teil der Service-Schnittstelle. Man spezifiziert damit nicht nur das Format der Anfragen und Antworten, sondern auch das Format eventueller Ausnahmen, die im Dienst auftreten. Der Client muss diese ja auch verarbeiten können. Ein Entwickler kann aber, wenn er den Dienst nicht selber entwickelt hat, nicht vorhersehen, welche Ausnahmen er denn erwarten kann, also muss auch hier eine definierte Schnittstelle her, die zumindest den Informationsaustausch zwischen Dienst und Client standardisiert. Zudem ist der FaultContract eine gute Möglichkeit, Fehler im Dienst nicht nach aussen weiterzuleiten. Das ist auch ein potentieller Angriffspunkt.

Thema: Projektstruktur: Abhängige Projekte als Assembly (DLL) oder als Solution einbinden?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Kann man machen, macht im Zweifelsfall aber Ärger. Ändert sich eine Bibliothek, muss ggf. jedes Projekt, das sie benutzt, angepackt werden. Besser ist es, Hilfsbibliotheken wie fremde Bibliotheken zu behandeln und mit Versionsnummern "auszuliefern" und dann diese in Projekten zu benutzen. Wenn es um möglichst einfaches Aktualisieren der Bibliotheken geht, würde ich ein lokales nuget-Repository auf einem Fileserver ablegen, in VS einbinden und dann darüber Updates beziehen, wenn sich an einer der Bibliotheken was ändert. So kann man updaten, wenn man will - und wenn man aus welchen Gründen grad nicht will, kann man das auch lassen. Mit dem Einbinden der Solution bin ich gezwungen, die aktuellste Version zu benutzen.

Thema: WCF, Server macht Pause?!
Am im Forum: Netzwerktechnologien

ich würd mal das Tracing in der web.config des WCF-Dienstes aktivieren und schauen, wo genau das Ding pausiert.

Thema: WCF-Service, ORMapper und Datenabruf am Client
Am im Forum: Netzwerktechnologien

ich machs mir normalerweise etwas einfacher und baue die Transfermodels analog zu den Datenmodels auf, nur dass die Relationen größtenteils weggelassen werden. Da muss man AutoMapper dann nur noch anweisen, aus X bitte Y zu machen, wenn alle Eigenschaften gleich benannt und typisiert sind.

Thema: WCF-Service, ORMapper und Datenabruf am Client
Am im Forum: Netzwerktechnologien

man sollte möglichst vermeiden, sein Datenmodell direkt per Webservice an Clients weiterzureichen. Zum einen sind Änderungen im Datenmodell dann auch immer gleich Änderungen am Service-Kontrakt, zum anderen sind die durch einen ORM relativ leicht zu managenden Relationen zwischen Objekten ein ziemliches Problem bei der Serialisierung. Von daher sollte man immer Datentransfer-Klassen (im Prinzip so, wie du es im Beispiel schon machst) erzeugen, die dann für diesen einen Zweck optimiert sind.

Zur Erzeugung der eigentlichen Objekte würde ich übrigens sowas wie AutoMapper empfehlen. Das Ding baut dir mit Hilfe einer simplen Konfiguration aus Klasse X eine Klasse Y. Aus deiner Datenklasse "User" kannst du im Idealfall mit nur einer Zeile deinen "EnterpriseUser" machen.

Thema: Active Directory simulieren
Am im Forum: Netzwerktechnologien

Zitat von xrc7581
Danke für die Antwort,


Mir ist irgendein AD-Lite im Kopf, das hatte ich vor einigen Jahren mal irgendwo gelesen...



Ich denke, ich schmeiß mal meine VM an, damit ich das auf ein echtes AD testen kann.

du meinst AD LDS (Leightweight Directory Services). Das entspricht mehr oder weniger einem LDAP-Server. AD an sich kann ein bisschen mehr, unter Umständen ist der Unterschied für dich aber gar nicht so relevant.

Thema: Active Directory simulieren
Am im Forum: Netzwerktechnologien

AD-Anfragen sind LDAP-Anfragen relativ ähnlich. Ob die Anfragen vollständig kompatibel sind, weiss ich allerdings nicht. Für einen echten Integrationstest würde ich vermutlich eher einen richtigen Active Directory-Server aufsetzen und mit dem testen.