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 oehrle
Thema: Fanuc-Steuerung Daten auslesen
Am im Forum: Rund um die Programmierung

Hallo Abt, aber prinzipiell möglich bei Fanuc?

Thema: Fanuc-Steuerung Daten auslesen
Am im Forum: Rund um die Programmierung

Hallo. In unserer Firma haben wir einige Maschinen mit Fanuc-Steuerungen.
Nun würde ich gerne Informationen aus der UI-Oberfläche abgreifen (Laufzeiten von Werkzeugen mit ihren Einzeloperationen).
Hat jemand damit Erfahrung? Ich meine es gibt ja viele Möglichkeiten.
Man kann zu dem Hersteller der Maschine gehen und nach einer Schnittstelle fragen (kostet viel Geld und Zeit) oder etwas über OPC bauen lassen (braucht man wieder den Maschinenhersteller, kostet wieder Geld und Zeit ...).

Und deshalb bin ich auf die Idee gekommen ob man nicht mit Fanuc direkt die Daten irgendwie mit einem Tool das man selber programmiert und auf dem Steuerungs-PC installiert die Daten auslesen kann. Hat jemand Erfahrung mit Fanuc, oder hat schon jemand von Euch so etwas gemacht?

Bin mal gespannt ob ich da Rückantwort bekomme.

Thema: Formatierung unterschiedlich bei Word 2016 / Word 2010
Am im Forum: Office-Technologien

Wenn ich das Dokument zuerst speichere und dann wieder zum Drucken öffne funktioniert es.
Komisch, aber ich nehme das mal so hin.

Thema: Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten
Am im Forum: Office-Technologien

Hallo, ihr lacht euch bestimmt kaputt wenn ich euch erzähle an was die Auswertung gescheitert hat...

>> Meistens sitzt das Problem vor dem Computer <<

Ich habe immer den Namen vom Shape ausgewertet (shape.Name == "Vc" als Beispiel), weil in dem Excel auch die Bezeichnung "Vc" als Label dran steht. Das ist aber der AlternativeText .

Also, bei der Abfrage weiss man entweder ganau die Namen der Controls, oder man frägt über .AlternativText die Zustände ab.


Also, aufpassen nicht das mal ein anderer in die Falle tappt.

Thema: Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten
Am im Forum: Office-Technologien

Wie es aussieht, sind das ActiveX-CheckBoxen. Wenn ich auf die "Properties" bei markiertem Control gehe, bekommt man auch das AuswahlGrid. Bei einem Form-Control bekommt man nur das Excel-Fenster angezeigt, siehe Bild:

Thema: Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten
Am im Forum: Office-Technologien

Hallo, hier noch vervollständigter Code zur besseren Lesbarkeit (war heute etwas hektisch).

Also, ich versteh das nicht, warum ich die CheckBoxen nicht auswerten kann.
Da gibt es noch eine verlinkte Zelle in der das Ergebnis steht um diese abzufragen.
Mein Ziel wäre aber das direkte Control auszuwerten. Habe das wie in einigen Beispielen im Netz demonstriert wird. Es kommt aber immer die Exception oder Meldung, wie weiter oben gezeigt

==> Keine Definition für "Value" !!!

Versteh ich nicht.
Kann es ein Problem der Versoin der Office.Interop (Excel) sein, oder x86/x64 Problem?





            WorkSheet WrkSheet = (Worksheet)WrkBook.Worksheets.get_Item("Eingabedokument");

            //// Methoden aus Beispiel im Netz, aber eigentlich identische Vorgehensweise (ohne Erfolg)
            var checkBox1 = GetCheckboxValue(WrkSheet, "Werkstoff");
            var checkBox2 = GetCheckboxValue(WrkSheet, "Maschine");
            var checkBox3 = GetCheckboxValue(WrkSheet, "Vc");
            var checkBox4 = GetCheckboxValue(WrkSheet, "Dc");

          
            OLEObjects oleObjekte = WrkSheet.OLEObjects();

            foreach(OLEObject obj in oleObjekte)
            {
                //// Forms.CheckBox "Vc" erfassen
                if(obj.Name == "Vc")
                {
                    var dd = WrkSheet.Shapes.Item("Vc").OLEFormat.Object.Value;
                    var test = obj.LinkedCell.ToString();
                }
                //// Forms.CheckBox "Werkstoff" erfassen
                else if (obj.Name == "Werkstoff")
                {
                  
                }
                //// Forms.CheckBox "Maschine" erfassen
                else if (obj.Name == "Maschine")
                {

                }
            }

            //// Test direkte Abfrage, auch ohne Erfolg(OleObject)
            var ddd = WrkSheet.Shapes.Item("Vc").OLEFormat.Object.Value;

            //// Test direkte Abfrage, auch ohne Erfolg(Controls)
            var eee = WrkSheet.Shapes.Item("Vc").ControlFormat.Value;
        }

        /* ========================================================================================================================================================================*/

        public static bool GetCheckboxValue(Excel.Worksheet worksheet, string checkBoxName)
        {

            var response = false;
            //// A checkbox is considered a shape by Excel and accessed using that object model
            Excel.Shapes shapes = worksheet.Shapes;
            foreach (Excel.Shape shape in shapes)
                if (shape.Name == checkBoxName) // Only give me the value for the checkbox I’m looking for
                    response = DetermineIfCheckboxIsChecked(shape.ControlFormat.Value); // Value returned is a double (not a bool)
                    ////response = DetermineIfCheckboxIsChecked(shape.OLEFormat.Object.Value); // Value returned is a double (not a bool)
            return response;
        }

        /* ========================================================================================================================================================================*/

        public static bool DetermineIfCheckboxIsChecked(double value)
        {

            var response = false;
            if (value > 0) // Checkbox is checked == 1.0
                response = true;
            else // Checkbox is not checked == -4713.0
                response = false;
            return response;
        }

        /* ========================================================================================================================================================================*/

Thema: Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten
Am im Forum: Office-Technologien

Ja, das ist es. Hänge nachher den Code noch vollständig rein.

Thema: Gelöst - Kann aus Excel Datei (mit Makro) die CheckBoxen nicht auswerten
Am im Forum: Office-Technologien

Hallo, versuche schon über einen halben Tag aus einem Exceldokument die Zustände der CheckBoxen auszulesen.
Ich habe eine Excel.xlsm-Datei die ich automatisch auswerten soll.

Ich habe das zum einen mit den OleObjekten versucht (Fehler: ".Value" nicht bekannt):


 foreach(OLEObject obj in oleObjekte)
            {
                if(obj.Name == "Vc")
                {
                    var dd = WrkSheet.Shapes.Item("Vc").OLEFormat.Object.Value;
                    var test = obj.LinkedCell.ToString();
                }
                else if(obj.Name == "Werkstoff")
                {
                  
                }
                else if(obj.Name == "Maschine")
                {

                }

            }

Probier ich das ganze mit den Shapes wie so oft propagiert, dann funktioniert es auch nicht:



// A checkbox is considered a shape by Excel and accessed using that object model
            Excel.Shapes shapes = worksheet.Shapes;
            foreach (Excel.Shape shape in shapes)
                if (shape.Name == checkBoxName) // Only give me the value for the checkbox I’m looking for
                    response = DetermineIfCheckboxIsChecked(shape.ControlFormat.Value); // Value returned is a double (not a bool)
                    //response = DetermineIfCheckboxIsChecked(shape.OLEFormat.Object.Value); // Value returned is a double (not a bool)


Hat jemand eine Idee?

Thema: Bei Tabellenerstellung in C# beginnt Tabellenname immer mit "guest.tabellenname"
Am im Forum: Datentechnologien

Problem gelöst. Aber ich denke es ist ein Problem von MS.
Die Zuweisung für den Sql-User (nicht Windowsauthenifizierung) mit der
"Default Database" ist das Problem. Da mußte diese aktuelle Datenbank zugewiesen werden. Hatte das auch in einem Forum gelesen.

Habe das dann mal auf meinem lokalen SQL-Express 2014 getestet, da war dann auch das gleiche Problem.

Ich weiss jetzt nur nicht wie das ist, wenn ich weitere DB's habe, in der dieser User dynamische Änderungen durchführt. Laut dem Forumsbericht sollte dann ein neue User angelegt werden, das habe ich aber nicht getestet, vielleicht ist der letzte Satz auch Quatsch.

Thema: Bei Tabellenerstellung in C# beginnt Tabellenname immer mit "guest.tabellenname"
Am im Forum: Datentechnologien

Hallo Palin, sorry ich hatte bis letzte Woche Urlaub.
Nun kann ich da wieder einsteigen, oder eher gesagt ich muss. Unser Admin der die ganzen Server wartet und sich damit auch auskennt ist noch längere Zeit ausser Gefecht.

Ich habe mal den SQlExpress mit MMO 2017 auf meinem Rechner istalliert.
Da habe ich genau das gleiche Problem.


Hier mal die Einsellungen, kannst du dazu was sagen was falsch sein kann?

Thema: Netzlauferk - IP-Adresse abfragen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Danke für die schnelle Info.

Thema: Netzlauferk - IP-Adresse abfragen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo, ich sollte von Netzlaufwerken die eingebunden sind die IP-Adresse abfragen können.

Gibt es da ein Möglichkeit für C# ?

Das was ich hier gefunden habe war nicht hilfreich (mit ping).

Thema: Bei Tabellenerstellung in C# beginnt Tabellenname immer mit "guest.tabellenname"
Am im Forum: Datentechnologien

Hallo, guest hat ein rotes Kreuz als Icon, und in den Schemas hat er eigentlich nur public.
Der user den ich verwende habe ich mit dem Passwort angelegt.
In meiner Datenbank habe ich ihm reader /writer und dbo gegeben.
Ich weiss nun wirklich nicht wo diese Einstellung schief gegangen sein kann.

Thema: Bei Tabellenerstellung in C# beginnt Tabellenname immer mit "guest.tabellenname"
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: <sqlespress 2014>

Hallo, habe folgendes Problem und weiss nícht genau wie ich das einstellen soll.

Ich schreibe gerade eine Applikation mit der ich Daten in eine Datenbank schreibe. Ich erstelle in C# die Datentabelle und nutze dazu SMO.
Nun habe ich das Problem, dass bei der Tabelle immer "guest." vorangeschreiben wird, anstatt wir gewohnt "dbo.".

Zur Datenbank: Diese ist lokal auf meinem SQL-Server.
Ich habe einen User angelegt (Sqlseitiger User), der das Schema "dbo" hat und sqlreader / sqlwriter / dbo Berechtigung hat.

Noch eine andere Sache, was mich verwirrt: Melde ich mit dem Server Managment an, als dieser DB-User, und lege eine Tabelle manuell an, dann passt das ganze. Es wird dann "dbo." vorangestellt.

Hat jemand eine Idee woran das liegen kann.

Thema: Formatierung unterschiedlich bei Word 2016 / Word 2010
Am im Forum: Office-Technologien

Also, damit die User zuerst mal vorübergehend mit Office 2016 (Word) arbeiten können, speichere ich das Dokument zuerst mal ab und öffne es dann wieder für "Druck". Das geht dann mal soweit.
Ich habe dann halt die Daten noch in Dateiform.
Prinzipiell würde ich das fersteuern über Office nicht mehr machen, denn das ist wahnsinnig langsam.
Natürlich gibt es auch Vorteile, ganz klar (Formatvorlage verwenden, durchlaufen von Tabellen, nachträgliches editieren).
Falls jemand noch eine Idee hat, einfach mal posten.

Thema: Formatierung unterschiedlich bei Word 2016 / Word 2010
Am im Forum: Office-Technologien

Hallo, das gespeicherte Dokument sieht einwandfrei aus, wenn ich das gespeicherte Dokument drucken lasse.

Es muss also nun irgend etwas schiefgehen, wenn es zuvor nicht gespeichert wird.

Thema: Formatierung unterschiedlich bei Word 2016 / Word 2010
Am im Forum: Office-Technologien

Hallo, nach längerem probieren haeb ich festgestellt, dass es nur passiert wenn das befüllte Word-Dokument sofort ausgedruckt.

Es gibt zwei Modis für die Applikation.
- User die Dokumente erstellen lassen, aber das Dokumetn dann sofort ausgedruckt wird (bei denen passiert der Fehler)

- User, bei denen das Ddokument nur abgespeichert wird (da passt die Formatierung)



Das ganze passiert so nur bei Office 2016.

Hier mal Info, wie ich das Dokument öffne und dann sofort drucke:


 //// Word im Hintergrund öffnen
            WordApp=new Microsoft.Office.Interop.Word.Application();
            WordApp.Visible=false;

            WordDoc=WordApp.Documents.Open(NameValCol["WORD_MasterMessprotokoll"], ReadOnly: true, Visible: true);


 //// Drucker zuweisen
                    WordApp.ActivePrinter = DruckerFestlegungMessprotokoll;
                    WordDoc.Activate();

                    WordDoc.PrintOut(ref myTrue, ref myFalse, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
                    //WordDoc.PrintOut(oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

                    //// Wieder Standarddrucker zuweisen
                    WordApp.ActivePrinter = StandardruckerFestlegung;


Wenn normal gespeichert, dann passt das Format:


 //// Speichern
                WordDoc.SaveAs(NameValCol["DMI_Ablageverzeichnis"] + verzeichnisName);

Hat jemand eine Idee, warum das passiert?

Thema: Formatierung unterschiedlich bei Word 2016 / Word 2010
Am im Forum: Office-Technologien

Hallo,das Thema ist immer noch aktuell, habe seither nichts mehr daran gemacht.
Also der Kompatibilitätsmodus kann nicht sein. der ist an meinen beiden Rechnern auch abgestellt, aber trotzdem geht die Fornmatierung nicht verloren.

Ich habe keine Idee wie ich den Fehler eingrenzen kann.
Kann das an einer DLL von MS liegen? Ist doc eigenartig.

Thema: Formatierung unterschiedlich bei Word 2016 / Word 2010
Am im Forum: Office-Technologien

Hallo, habe ein Problem bei dem ich noch nicht genau weiss wo ich suchen soll.
Ich erkläre mal. Ich habe vor 4 Jahren ein C# eine Applikation in Verbindung mit Word 2010 erstellt. Dabei wird ein Dokument dynamisch erstellt. Als Vorlage habe ich ein DOC-File erstellt, das ich dann mit notwendigen Zeilen und Spalten erweitere, ja nachdem wie groß die Datenmenge ist welche in das Dokument müssen. Das Dokument ist eigentlich als Tabelle erstellt, die Spaltenbreiten sind mit Maßen definiert.
Irgendwann im sommer habe ich bei uns in der Firma das neue Office 2016 bekommen. Alles ohen Probleme, die Applikation hat weiterhin bei mir einwandfrei funktioniert. Die Applikation wird aber auch noch von anderen Kollegen verwendet, die bis vor kurzem noch Office 2010 hatten. Bis dahin ohne Probleme. Nun wurde bei denen letzte Woche das Office 2016 installiert. Die Appliaktion funktioniert zwar, aber die Formatierung vom Word-Doc ist kaputt. Die Spaltenbreiten sind total undefiniert.
und da nun meine Frage. Warum funktioniert es bei mir, bei den Kollegen aber nicht?
Hat jemand eine Idee? Wie gesagt, ich verwende noch das DOC-Format. Evtl. hat jemand einen Tipp für mich.

Thema: Config.Exe aus definiertem Verzeichnis starten und diese Werte verwe
Am im Forum: Rund um die Programmierung

Ok, danke für die Info. Eine tolle Sache habe ich noch gefunden. Man kann ja auch einen Link auf eine Datei erstellen.
Weil das jetzt auf die "Schnelle" sehr flott ging, habe ich das gemacht, damit die Leute vorerst mit meiner Appliaktion weiterarbeiten können.


Referenz für "Windows Script Host Object Model" hinzufügen,

"using IWshRuntimeLibrary;"
einfügen.


 IwsRntLib.WshShell shell = new IwsRntLib.WshShell();
                
                //// Pfad wo die Verknüpfung abgelegt werden soll
                string path = linkablageverzeichnis + "\\linkName.lnk";
                IwsRntLib.IWshShortcut link = (IwsRntLib.IWshShortcut)shell.CreateShortcut(path);
                
                //// Ziel vom Link (die Datei, die dann verlinkt werden soll). Hier die "xxxx.Config.Exe" abrufen mit "OpenExeConfiguration", dann diesen Pfad übergeben.
                string pfadLink = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;
                link.TargetPath = pfadLink;
                link.WorkingDirectory = pfadLink;
                link.Description = "Verlinkte Config.Exe-Datei";
                //link.IconLocation = ;

                link.Save();

Somit kann man die Cofig.Exe in einem Userbereich in einem gewissen Verzeichnis das evtl. den Namen der Appliaktion per Link ablegen.
Das andere werde ich bei Gelegenheit noch testen.

Thema: Config.Exe aus definiertem Verzeichnis starten und diese Werte verwe
Am im Forum: Rund um die Programmierung

Hallo gfoidl, muss da etwas bestimmtes beachtet werden? Eigentlich ist das so, das ich gerne Applikationsrelevate Daten die Userunabhängig sind das speichern würde. Eigentlich wäre es auch toll, wenn diese daten nach einem "ClickOnce"-Update noch gültig wären.

Also, wenn ich da so eine extra Konfigurationsdatei erstelle, dann wäre das gut wenn man diese so wie die Config.exe behandeln könnte. Allerdings arbeite ich immer nur mit einer "NameValueCollection", dann müßte ich mehr als eine verwenden, weil ich dann mehr als eine Konfigurtionsdateien habe.
Ich glaube da gibt es noch eine weitere Möglichkeit. Man kann in der confi.exe einen Verweis auf eine weitere Konfigurationsdatei erstellen, die über den anegebenen Pfad also auch "userdefiniert" abelegt ist. Muss ich mal abprüfen.

Thema: Config.Exe aus definiertem Verzeichnis starten und diese Werte verwe
Am im Forum: Rund um die Programmierung

Hallo, ich habe eine WPF-Anwendung (FW4.0), bei der verbiege ich bei Appliaktionsstart den Pfad der Konfigurationsdatei xxx.config.exe.

Das passiert so:


 string ExeDatei = Path.GetFileName(Assembly.GetEntryAssembly().GetName().CodeBase);

            programmePfad += ExeDatei.Remove(ExeDatei.Length - 4) + @"\";
            programmePfad += ExeDatei + ".config";
            AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", programmePfad);

In meiner neuen Applikation funktioniert das nicht mehr. Wenn ich Einträge in das xxx.config.exe zurückschreibe, das funktioniert. Aber beim Programmstart werden die Einträge aus der config.exe aus dem Installationsort von "ClickOnce" abgerufen. Ist doch komisch. Aber beide Applikationen werden mit "ClickOnce" installiert, aktualisiert.
Hat jemand eine Idee an was das lieen könnte?

Thema: Erfahrungen gesucht: Maschinendaten an übergeordnetes System per OPC UA übergeben
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo Abt, danke für die Infos, vor allem:

Bei OPC-UA ist nur festgelegt wie die Daten übertragen werden, aber nicht der Inhalt oder das Format.

==> Das heißt, die mit dem übergeordneten System muss schon ausgemacht sein, wo die Daten stehen (Reihenfolge), wie sie typisiert sind??
Kann mir jemand sagen wie eigentlich so ein Protokoll aussieht (nur mal grob). Hatte mal mit Microcontroller Daten über die DCI-Schnittstelle (MicroChip). Da gab es ein Frame, in dem in nachfolgenden Bytes die Daten übertragen werden konnten. Der Begin vom Frame war zum Beispiel immer 0x19, darauf mußte man achten, dann die Bytes auswerten.


Bei mir ist das Problem, ich muss die Daten (Zustände der Maschine) in das übergeordnete System kriegen. Dazu müssen die Daten ja verpackt werden. Da ich aber noch keinerlei Erfahrung habe, denke ich, ein Simulator wäre nicht schlecht. Der könnte auf meinem Rechner laufen, und ich könnte die Applikation entwickeln, schauen ob die Daten am Simulator korrekt ankommen.

Jetzt habe ich noch gesehen, das bei OPC UA.NET! eine gute Beschreibung (ich denke die ist gut) und auch Demo / Simulator dabei ist.


MartinH: Die Module von Softing sind schon genau auf die spezielle Steuerung zugeschnitten, so wie ich das sehe. Kommen dann nur Daten die vom Hersteller definiert sind, oder können noch weitere zusätzliche Daten abgefragt oder übergeben werden?

Thema: Erfahrungen gesucht: Maschinendaten an übergeordnetes System per OPC UA übergeben
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo, hier mal eine Anfrage zu einem Problem von mir. Ich muss von einer Steuerung Daten in ein übergeordnetes System bringen. Auf den Steuerungen läuft eine Appliaktion die in C# geschrieben ist, von mir. Nun könnte ich die Informationen an das übergeordnete System per OPC-UA Protokoll bringen. Hat jemand schon mal sowas gemacht?? Ich habe schon freie OPC-Bibliotheken gesehen. Aber in diesem Fall wäre ich ja der OPC-Server. Gibt es OPC-Simulatoren, oder hat jemand damit schon Erfahrung (taugen die was, siehe Firma Matrikon OPCSimulator)?
Wenn man einen Simulator hätte, dann wäre das ja auch schon einfacher zu entwickeln. Bin schon gespannt was geschrieben wird.

Thema: Parallele Datenverarbeitung ohne "lock"
Am im Forum: Rund um die Programmierung

Hallo, ich habe hin und wieder große Datenmengen die evtl. mit Zusatzdaten zusammengefügt werden müssen. Bei der parallelen Verarbeitung ist da oft auch das Problem, dass die Daten wegen DataRace gegeneinander mit "lock" gesichert werden muss. Das kann aber auch manchmal bremsen.

Ich hatte nun gerade einen einfachen Fall, den ich nun mit einer anderen Sichtweise lösen wollte. Leider bekomme ich eine Exception, bei der parallelen Verarbeitung der Task's.

Hier mal meine Idee (mal ganz egal ob das auch noch anders lösbar ist, die Frage ist wie bekomme ich die Exception weg, da weiss ich nicht weiter).

Ich lese zwei Datentabellen ein: Tabelle "Quelldaten", Tabelle "Infodaten".

Die "Quelldaten" müssen mit den "Infodaten" abgeglichen werden. In einer normalen Schleife dauert das sehr lange. Nun die Idee die Quelldaten Prozessorkernabhängig aufzuteilen und je einen Task erstellen, dann die Tasks parallel starten.

Soweit funktioniert das auch schon, aber bei

 Task.WaitAll(lstTsk.ToArray(), new TimeSpan(0,0,30));


Eventuell kann mir jemand einen Tipp geben.




bekomme ich eine Exception.

Hie rmal der Code:


			//// INFO: 23.02.2017: Hier die Testroutine für parallele Ausführung testen
            // ############################################ TEST ###################################################################

            //// Daten vom SQL-Server einlesen
            DataTable tblPersonenDaten = GetDataSql("Personendaten");
            DataTable tblPersonenZusatzdaten = GetDataSql("PersonenZusatzdaten"); 

			//// List<> erstellen, wo die Datensatzaufteilung Prozessorkernanzahlig aufgeteilt wird 
            List <DataTable> lstTblPersonendaten = new List<DataTable>();
            int anzProzkerne = Environment.ProcessorCount;
            for (int i = 0; i < anzProzkerne; i++)
                lstTblPersonendaten.Add(tblPersonendaten.Clone());

			//// Die Tabellendatensätze dann aufsplitten
            int zaehler = anzProzkerne;
            for (int m = 0; m < tblPersonendaten.Rows.Count; m++)
            {
                if (zaehler == anzProzkerne)
                    zaehler = 0;
                lstTblPersonendaten[zaehler].Rows.Add(lstTblPersonendaten[zaehler].NewRow().ItemArray = tblPersonendaten.Rows[m].ItemArray);
                zaehler++;
            }

            
			//// Nun die parallelen Tasks erstellen und die Daten übergeben
            //// Da die Daten vereinzelt sind, muss kein "lock" verwendet werden, so die Idee
            List<Task> lstTsk = new List<Task>();
            for (int n = 0; n < anzProzkerne; n++)
            {
                lstTsk.Add(Task.Factory.StartNew(() => DatensaetzeAbgleichen(lstTblPersonendaten[n], tblPersonenZusatzdaten.Copy())));
            }
            try
            {
				//// Aufruf der parallelen Abarbeitung (das ist die Zeile 1942 in meinem Code)
				Task.WaitAll(lstTsk.ToArray(), new TimeSpan(0,0,30));
            }
            catch (Exception ex)
            {
                Allgemein.ExceptionMeldungAusgeben(ex, "Fehler bei TPL", "Fehler");
            }

            
            // #####################################################################################################################
			
			
			
			
			
			
			
 /* ========================================================================================================================================================================*/

        /// <summary>
        /// Gleicht die Daten der Tabelle "tblSource" mit den von Tabelle "tblInfos" ab.
        /// </summary>
        /// <param name="tblSource">Quelldaten die mit den Infos befüllt werden.</param>
        /// <param name="tblInfos">Tabelle mit den Info-Daten, welche in die entsprechenden Quelldatensatzspalten eingefügt werden.</param>

        private void DatensaetzeAbgleichen(DataTable tblSource, DataTable tblInfos)
        {
            try
            {
				foreach (DataRow rowSource in tblSource.Rows)
                {
                    DataRow rowScheibenInfo = tblInfos.AsEnumerable().Where(x => x["SapArtikel"] != DBNull.Value && x["SapArtikel"].ToString().Trim() == rowSource["SapArtikel"].ToString().Trim() || x["Systemcode"] != DBNull.Value && x["Systemcode"].ToString().Trim() == rowSource["Zeichnungsnummer"].ToString().Trim()).FirstOrDefault();

                    if(rowScheibenInfo != null)
                    {
                        rowSource["ScheibenInfo"] = rowScheibenInfo["ScheibenInfo"];
                        rowSource["SwInfo"] = rowScheibenInfo["SwInfo"];
                        rowSource["ZusatzInfo"] = rowScheibenInfo["ZusatzInfo"];
                    }
                }
            }
            catch (Exception ex)
            {
                Allgemein.ExceptionMeldungAusgeben(ex, "Fehler in DatensatzAbgleichen() ", "Fehler:");
            }
        }

/* ========================================================================================================================================================================*/




InnerException:
{"Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"}

Bin im Moment etwas ratlos.

Thema: WpfControl (userControl) in WinForm verwenden (Eventanmeldung per Lambda-Expression)
Am im Forum: GUI: WPF und XAML

Ne, wird nicht angesprungen. Hatte ich schon getestet.

Thema: WpfControl (userControl) in WinForm verwenden (Eventanmeldung per Lambda-Expression)
Am im Forum: GUI: WPF und XAML

Hallo, ich habe das folgende Problem:

In einer bestehenden WinForm-Anwendung binde ich ein Projekt das mit WPF erstellt ist ein.
Es handelt sich um ein Tool um Daten zu filtern. Nun funktioniert das auch, die Eingabe reagiert auch (was zuerst ein Problem war).

Nun bin ich es gewohn dass ich in WPF im Code manchmal die Events mit direkt mit Lambda-Expression ausstaffiere (geht schnell und übersichtlich). Das wollte ich jetzt mit dem WpfControl in der WinForm-Appliaktion machen. Leider werden nicht alle Eventhandler angesprungen. Habe schon eine ganze Zeit im Netz gesucht, leider aber nichts brauchbares gefunden.
Hat jemand einen Tipp wie ich das machen kann (oder geht das gar nicht) ?

Hier mal mein Code:



  FilterWindow wnd = new FilterWindow(tblMaterialRohkoerper, 1);
            ElementHost.EnableModelessKeyboardInterop(wnd);
            wnd.stp_Zusatzeingaben.Visibility = Visibility.Visible;
            WindowInteropHelper helper = new WindowInteropHelper(wnd);
            helper.Owner = this.Handle;

            string pwzMaterial = "";

  //// Eventhandling, dieser funktioniert !!
  wnd.btn_Datenuebernahme.Click += (sender, args) =>
            {
                tbx_SapMaterial.Text = wnd.tbx_Zusatzeingabe.Text.Trim();
                tbx_PwzMaterial.Text = pwzMaterial;
                wnd.Close();
            };


//// Eventhandling, das niicht funktioniert. Hängt das mit dem unbekannten "DataGrid" für WinForm zusammen ??
wnd.dgFilterdaten.MouseDoubleClick += (sender, args) =>
            {
                if(sender is DataGrid)
                {
                    System.Windows.Controls.DataGrid dgDaten = (System.Windows.Controls.DataGrid) sender;
                    if (wnd.stp_Zusatzeingaben.Visibility == Visibility.Visible)
                    {
                        var xx = dgDaten.Columns.AsEnumerable().Where(x => x.Header.ToString() == "SapMaterial").FirstOrDefault();
                        if (xx != null)
                        {
                            string materialRohkoerper = ((DataRowView)(dgDaten.CurrentItem))["SapMaterial"].ToString();
                            wnd.tbx_Zusatzeingabe.Text = materialRohkoerper;
                            tbx_SapMaterial.Text = materialRohkoerper;

                            //// Z-Artikelcode auslesen
                            if(((DataRowView) (dgDaten.CurrentItem))["ARTCODE"] != DBNull.Value && ((DataRowView) (dgDaten.CurrentItem))["ARTCODE"].ToString().Trim() != "")
                            {
                                zMaterial = ((DataRowView) (dgDaten.CurrentItem))["ARTCODE"].ToString().Trim();
                                tbx_zMaterial.Text = zMaterial;
                            }
                        }

                    }
                }
            };





            wnd.Show();


Thema: Datenbank als XML auf Rechner mit Produktionsdatenbank aktuell halten
Am im Forum: Datentechnologien

Hi T-Virus, danke dir.

Habe gerade mal die DB vom Produktionsserver auf meinen SqlExpress auf mein Rechner übertragen lassen. Das ging sehr schnell, und ich denke MS nutzt da auch das BulkCopy. Von meinem rechner aus habe ich dann eine Sicherung erstellen lassen, das sind 335 MB. Dann gezippt, da waren es nur noch 37 MB.

Ich würde das gerne mit SQLite machen, und die Daten vom Sqlserver mit BulkCopy holen. Würde das mal zuerst bei mir zuhause ausprobieren, wie schnell das geht und ob das praktikabel ist.
Hast du noch Info zu SQLite (Website mit Beispielcode oder mit den Methoden und Hinweisen)?

Wahnsinn: Habe gerade mal den Abgleich nur über ID und Dateiname gemacht. Das geht sehr schnell, noch parallelisieren, dann ist es n och schneller.
Und: Habe auch mal die XML-Datei mit 1,5 GB gezippt, die hat dann gerade mal noch 42 MB. ist doch Wahnsinn, oder. da müssen wohl große Luftblasen drin sein ;-)

Thema: Datenbank als XML auf Rechner mit Produktionsdatenbank aktuell halten
Am im Forum: Datentechnologien

Hallo T-Virus. SQLite-DB-Files habe ich schon mal eingelesen (von einem Maschinenhersteller, der verwaltet seine Programme in SQLite).
Ich habe jetzt aber keine ahnung, ob SQLite sehr schnell ist, aber das kannst du mir bestimmt aus deiner Erfahrung sagen.

Zum Arbeistspeicher: Das wäre denke ich nicht das Problem, die Jungs bei uns haben in der Regel alle 16 GB RAM, was aber nicht heißen soll das ich darauf keine Rücksicht nehme (muss ja nicht verschwenderisch sein).

Ich denke das Problem ist die gezippte DB-Datei von externen Rechnern zu kopieren, das wird auch einiges an Zeit brauchen. Oder denkst du das sich das Datenvolumen durch die gezippte SQLite-Datei drastisch reduziert ?? Was sagt deine Erfahrung dazu?

Was mich dann noch stört, ist das erstellen der Zip-Datei. Das soll alles möglichst automatisiert ablaufen, oder gibt es da etwas am SQL-Server, das er das zykklisch selber macht?

Wäre es möglich mit SqlBulkCopy vom SqlServer direkt in die SQLite zu kopieren ?? Evtl. wäre das auch ein brauchbarer Ansatz.
Die SQLite-Struktur der Tabellen könnte ich bestimmt automatisiert im Code erstellen lassen, falls sich die Struktur der DB-Tabellen auf dem Server ändert (was vorkommen kann).

Dann noch Stichwort Webservice. Noch nie gemacht, nur davon gehört. Ist das schwer, läuft das über ASP (ich mach vorwiegend WPF).


@Sir Rufo:
Die Idee mit den ID's klingt gut, da man die relativ schnell über die Datenverbindung (die langsam ist) abfragen kann.
Aber ich denke das der interne Abgleich auf dem externen Rechner deswegen trotzdem nicht schneller geht (muss ich noch ausprobieren).

Thema: Datenbank als XML auf Rechner mit Produktionsdatenbank aktuell halten
Am im Forum: Datentechnologien

Hallo, danke für euren Beiträge. MMMhh, es ist so, das die DB 28 Tabellen hat. Tabelle 0 ist die Kopftabelle, mit den Kopfangaben zu Werkzeugen. Alle weiteren Tabellen sind Operationen, mit denen das Werkzeug hergestellt wird. Also es gibt somit 27 verschiedene Operationen, mit denen ein Werkzeug hergestellt werden kann. Diese Kopftabelle hat als Schlüssel den Dateinamen zu den anderen Tabellen. Wenn ich also wissen will, mit welchen Operationen Werkzeug X aus der Kopftabelle erstellt wurde, frage ich die Kopftabelle nach dem Dateinamen ab und frage alle weiteren 27 Tabellen ab.
Die Kopftabelle hat so an die 25 Felder, alle weiteren Tabellen jeweils 97 Felder. Ich denke alles in allem sind es bestimmt schon mehr als 1 Mio. Datensätze, über alle Tabellen (in XML 1,4 GByte).
Naja, und die Verbindung bei uns im ländlichen Raum ... DSL gibt es, aber auch nicht überall so schnell (kleine Dörfer ...).
Das nächste ist, da in der Firma einige Programmierer mit dem System arbeiten, wird beim Starten die komplette DB in ein DataSet geholt, damit der Traffic im Firmennetz nicht so groß ist. Das funktioniert auch gut, die Anwendung läuft sehr schnell. Zu Beginn hatte ich die Abfragen immer direkt über den SQL-Server laufen, das war aber wesentlich langsamer. Jetzt habe ich das Problem, das diese Anwendung auch bei einem User extern laufen soll (von zuhause). Wenn er die komplette DB nachhause schaufeln soll, dann geht das mal locker 30 Minuten ( ich weiss nicht genau, aber vielleicht eine 2Mbit-Verbindung).

Dann mal zu dem Zeitstempel. Den habe ich natürlich. Ich habe auch kein Problem die neuen Datensätze zu erfassen, die hinzugekommen sind. Das geht rasend schnell.
Das Problem ist, gelöschte Datensätze aus dem Produktionssystem zu erkennen. Da habe ich das Problem, das möglichst schnell durchlaufen zu lassen.

Wenn ich 80000 Datensätze aus der XML-Sicherung gegen die aktuell abgerufenen Daten aus der Kopftabelle der Produktionsdatenbank 1:1 mit dem Dateinamen überprüfen muss, ob dieser Datensatz noch existieren darf, dann dauert das ewig.

Hatte probiert das mit LinQ über GroupJoin, funzt aber nicht, das ich sofort nur die offenen Datensätze hätte.

Das einfachste wäre natürlich, ich könnte die Daten direkt vom Produktionsserver in das DataSet des externen Rechners laden. Aber T-Virus, wie geht das parallel? Gleichzeitig mehrere SqlDataAdapter oder Reader verwenden und Anfrage absetzen, und dann die verschiedenen Tabellen in das DataSet importieren?

Was denkt ihr?


Da gibt es ja noch das BulkCopy. Schön wäre das, wenn man damit direkt vom Sqlserver in ADO.Net-Tabellen laden könnte. Aber das geht wohl so nicht, oder in irgend einer anderen Form auf den entfernten Rechner kopieren ohne auf dem den SQL-Server installieren zu müssen. Oder gibt es dazu noch eine weitere Option?