HILFE bei FIFO PROGRAMM



  • @xzerox: Geht es nur um das Einlesen von Dateien (wie der "Produktion.csv") - und keine direkte Kommunikation zu externen Systemen? Dann wäre sicherlich eine Skriptsprache wie Python hierfür auch nutzbar.

    Aber so etwas nennt sich "Anforderungsmanagement", d.h. zuerst einmal die Anforderungen bestimmen, bevor man konkrete Lösungen (bzw. Programmiersprachen) aussucht.

    PS: Für C# kannst du dir mal das "open book" Visual C# 2012 anschauen, ob dir die Sprache gefällt.
    Als PDF habe ich noch Einführung in das Programmieren mit C# 6 gefunden (C# 6 entspricht Visual Studio 2015).



  • @xzerox sagte in HILFE bei FIFO PROGRAMM:

    Ist eher anders rum ich will mehr Programmieren lernen und "nebenbei" den Ergebnis erreichen 🙂

    OK. In dem Fall kommt es darauf an was du lernen willst. C# und Python sind sicher für den Einstieg einfacher. Ich mag halt Visual Studio als IDE und C# als Sprache, und hab ne Abneigung gegen dynamisch typisierte Sprache (wie Python). Von daher empfehle ich C# gerne Leuten die mit Programmieren anfangen wollen und sich nicht unnötig viel Arbeit machen wollen.



  • Hi Zusammen,

    Nach euer Ratschläge habe ich jetzt damit angefangen C# zu lernen, muss sagen das es viel schneller und einfacher läuft als bei C++.

    Habe auch noch gute Lernseite gefunden wo vieles erklärt wird (Netzwerk Einbindungen, Grafische Darstellungen, WPF usw.). Daher werde ich in der nächsten Zeit mich damit befassen und versuchen den gewünschten Programm zu codieren.

    Werde dann wenn nötig wieder auf euer Hilfe und Ratschläge zugreifen und euch nochmal stören.

    Nochmals Danke für euer Hilfe und Ratschläge 🙂



  • namespace Simulation
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("************************************");
                Console.WriteLine();
                Console.WriteLine("Material: " + sMaterial());
                Console.WriteLine();
                Console.WriteLine("Bestand: " + sBestand());
                Console.WriteLine();
                Console.WriteLine("Produktion: " + sProduktion());
    
                Console.ReadKey();
            }
    
            private static string sMaterial()
            {
                Console.WriteLine("Bitte Material Eingeben: ");
                return Console.ReadLine();
            }
    
            private static string sBestand()
            {
                Console.WriteLine("Bitte aktuellen Produktions Bestand Eingeben: ");
                return Console.ReadLine();
            }
    
            private static string sProduktion(int sBestand)
            {
                
    
                if (sBestand > 0)
                {
                    do
                    {
                        Console.WriteLine(sBestand);
                        sBestand--;
                    }
                    while (sBestand < 0);
                }
                else
                {
                    Console.WriteLine("Der Wert ist nicht zulässig");
                }
    
                return true;
            }
        }
    }
    

    ich schreib jetzt einen Simulationsprogramm für den Produktionverlauf wegen Test zwecke das der Hauptprogramm funktioniert oder nicht.

    Bekomme aber bei dem Code 2 Fehler meldungen mit denen Ich nicht weiter komme

    Fehler CS7036 Es wurde kein Argument angegeben, das dem formalen Parameter "sBestand" von "Program.sProduktion(int)" entspricht. Simulation 22 Aktiv

    Fehler CS0029 Der Typ "bool" kann nicht implizit in "string" konvertiert werden. 57 Aktiv

    kann da jemand ein Hinweis geben ??



  • Also hab den Code bischen geändert und habe mein Ergebnis erreicht. Außer einen Punkt ich will nämlich den sBestand selber bestimmen und dann soll Produktion mit dem Wert was ich eingebe weiterarbeiten. Das will irgendwie nicht funktionieren

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Dynamic;
    using System.Globalization;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    using System.IO;
    
    namespace Simulation
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Thread oProduktion = new Thread(new ThreadStart(Produktion));
    
    
                Console.WriteLine("**PRODUKTIONS SIMULATION**");
                Console.WriteLine();
                Console.WriteLine("Material: " + sMaterial());
                Console.WriteLine();
                Console.WriteLine("Bestand: " + sBestand());
                Console.WriteLine();
                Console.WriteLine("Produktions Simulations:");
                oProduktion.Start();
    
                Console.ReadKey();
            }
    
            private static string sMaterial()
            {
                Console.WriteLine("Bitte Material Eingeben: ");
                return Console.ReadLine();
            }
    
            private static string sBestand()
            {
                Console.WriteLine("Bitte Aktuelle Produktions Bestand Eingeben: ");
                return Console.ReadLine();
            }
    
            private static void Produktion()
            {
                int i = 0;
                for ( i = 72; i > 0; i--)
                {
                    Console.WriteLine(i);
                    Thread.Sleep(10000);
                }
            }
        }
    }
    

    wie kriege ich jetzt hin das beim Produktion der i wert sich mit dem eingegebenen Wert vergleicht und dem entsprechend die Produktion startet ??



  • Warum benennst du die Funktionen sBestand und sMaterial so komisch? Wofür steht das s und warum benutzt du es? Und oThread?

    An welcher Stelle wird in deinem Programm denn ein Wert eingegeben, mit dem du i vergleichen möchtest? Und überhaupt, was soll das Programm überhaupt tun?



  • @DocShoe Ohne mich da jetzt so näher auszukennen, ist das glaube ich die Ungarische Notation ... s müsste für statisch stehen und o für object oder so ^^
    Finde ich oft relativ überflüssig.



  • @DocShoe sagte in HILFE bei FIFO PROGRAMM:

    Warum benennst du die Funktionen sBestand und sMaterial so komisch? Wofür steht das s und warum benutzt du es? Und oThread?

    An welcher Stelle wird in deinem Programm denn ein Wert eingegeben, mit dem du i vergleichen möchtest? Und überhaupt, was soll das Programm überhaupt tun?

    Das hat schon seinen Sinn, ist für mich damit ich es übersichtlicher habe (persönliche Stil) aber das hat doch keinen Einfluss auf den Code. Wie ich eine Funktion oder variable benenne muss nur aufpassen das ich den im Verlauf der Code richtig nutze oder.

    Am Anfang des Programms wird gefragt wie viel Bestand im Produktion ist, wo man dann in der Zeile 27 bzw. 44 den Wert eingibt.
    Und diese Wert will ich in der Produktion Funktion einbinden also in Zeile 50 soll z.B.
    if(;sBestand>0;sBestand--)
    habs auch so versucht wie in dem Beispiel bekomme aber den Fehler das ich mit sBestand(weil es eine Methode ist) keine Operator wie <,>,=,+ oder - verbinden kann.

    und das will ich gern umsetzen wenn es einen Möglichkeit gibt. Habe zwar im Internet einen Funktion gefunden (Atoi) aber verstehe es nicht ganz.



  • @xzerox
    Mag ja sein, dass das für dich persönlich Sinn ergibt, aber du solltest dir auch immer die Frage stellen, ob das andere auch so sehen. Vermutlich wird dieses Miniprojekt nie jemand anderes außer dir anfassen, da ist es völlig schnuppe, wie du deine Variablen und Funktionen nennst. Aber du gewöhnst dir damit einen ungewöhnlichen Stil an, und wenn du irgendwann mal in einem Team arbeitest wirst du mit dem keine Freunde finden. Willst du dann zwei Stile pflegen? Einen privaten für dich und einen für´s Team? Dann solltest du dir lieber sofort einen allgemein akzeptierten Stil angewöhnen, und die Ungarische Notation hat da keinen guten Ruf, das war in den 1990ern mal schick. Und ich sehe da auch keine Konsistenz, warum heißt eine Funktion sBestand (Zeile 24) und ein Funktionsparameter (Zeile 30) auch?
    Hier eine Seite mit C# Coding Standards, zum Lesen.

    Jetzt zu deinem Code:
    Du hast lose zusammengewürfelte Funktionen, die in keinem Zusammenhang zueinander stehen. Du solltest dir erst einmal Gedanken darüber machen, welche Daten du brauchst und wie du sie organisieren möchtest. Ich habe keine Ahnung, wie umfangreich euer Lager ist. Hunderte verschiedene Artikeln? Tausende? Zehntausende? Kann man das komplett im Speicher halten oder ist da ein db Backend sinnvoll? Gibt´s bereits eine db und du liest den Bestand nur aus?

    • Du solltest die richtigen Datentypen benutzen, warum wird der Bestand (also ein Menge von irgendwas) als String eingelesen?
    • Du liest zwei Variablen ein, gibst deren Wert aus und beendest dann das Programm. Abgesehen vom Programmende speicherst du die eingegebenen Werte nirgendwo, woher soll der Thread dann die Informationen bekommen, ob der die Produktion starten soll?

    Formulier´ deine Vorstellungen mal aus und beschreib´ konkret, was wann passieren soll. Mit so aussagen wie Am Anfang des Programms wird gefragt wie viel Bestand im Produktion ist, wo man dann in der Zeile 27 bzw. 44 den Wert eingibt. Und diese Wert will ich in der Produktion Funktion einbinden. kann man nix anfangen. Ich zumindest nicht.



  • @DocShoe
    Nochmals danke für die Hinweise das mit Stil und der gegebene Link hat viel geholfen, wahrscheinlich sind in den Codes immer noch einige Stil Fehler drin aber wie gesagt bin Anfänger und solche Sachen brauchen Zeit damit ich es mir gewöhne.

    Zu dem Code:
    Hab jetzt deinen Ratschlag verfolgt und mir einen Schema aufgebaut wie der Programm ungefähr (weil mit jede neu Erkennung kommen immer neue Ideen drauf) aussehen soll. Ich weiß dass man es vielleicht viel anders Codieren kann. Aber mit selbst Beigebrachtes in 3 Wochen bin ich aktuell nur so weit 🙂

    Hab jetzt den Kompletten Programm auf 4 Bereiche aufgeteilt:

    1. Main Programm

    using System;
    using System.Globalization;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
           
            [STAThread]
            static void Main(string[] args)
            {
    
                Excellesen Excellesen = new Excellesen();
                Excellesen.Read();
                Simulation Simulation = new Simulation();
                Simulation.Ausführen();
    
                return;
     }
        }
    }
    
    

    Hier wird die einzelne abhängige Threads gestartet. (Nur eine frage gibt es eine Möglichkeit das bei einem neue Thread auch neue Fenster geöffnet wird?) Hier fehlen noch 2 Threads die ich noch einfügen will.

    1. eine Abfrage Funktion die die Werte aus Excellesen mit Simulation vergleicht und je nach Vorgabe dann auf dem Screen ausliest
    2. Grafische Oberfläche (das dauert 🙂 )

    2. Excellesen (Diese Thread ist nur für die Präsentation der Programm an die Management gedacht, später wird diese Thread mit einem Datenbank Server ersetzt)

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Office.Interop.Excel;
    using System.Reflection;
    using System.Linq.Expressions;
    using System.Threading;
    
    namespace Test
    {
    
        public class Excellesen
        {
            [STAThread]
            public static void Main(string[] args)
            {
                Thread Excellesen = new Thread(new ThreadStart(Read));
    
                Excellesen.Start();
            }
    
                public static void Read()
                {
                    Application app = new Application();
                    Workbook book = null;
                    Worksheet sheet = null;
                    Range range = null;
    
                    try
                    {
                        DateTime startTime = DateTime.Now;
    
                        app.Visible = false;
                        app.ScreenUpdating = false;
                        app.DisplayAlerts = false;
    
                        string exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
    
                        book = app.Workbooks.Open(exePath + @"\Produktion.xlsx", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                        sheet = (Worksheet)book.Worksheets[1];
                        range = sheet.get_Range("A1", Missing.Value);
                        range = range.get_End(XlDirection.xlToRight);
                        range = range.get_End(XlDirection.xlDown);
    
                        string downAddress = range.get_Address(false, false, XlReferenceStyle.xlA1, Type.Missing, Type.Missing);
                        range = sheet.get_Range("A1", downAddress);
                        object[,] values = (object[,])range.Value2;
    
                        Console.WriteLine("Col Count: " + values.GetLength(1).ToString());
                        Console.WriteLine("Row Count: " + values.GetLength(0).ToString());
    
                        Console.Write("\t");
                        for (int j = 1; j <= values.GetLength(1); j++)
                        {
                            Console.Write("{0}\t", j);
                        }
                        Console.WriteLine();
                        for (int i = 1; i <= values.GetLength(0); i++)
                        {
                            Console.Write("{0}\t", i);
                            for (int j = 1; j <= values.GetLength(1); j++)
                            {
                                Console.Write("{0}\t", values[i, j]);
                            }
                            Console.WriteLine();
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                    finally
                    {
                        range = null;
                        sheet = null;
                        if (book != null)
                            book.Close(false, Missing.Value, Missing.Value);
                        book = null;
                        if (app != null)
                            app.Quit();
                        app = null;
                    }
                }
    
            }
        }
    

    Hier soll eine dauerhafte Verbindung zu Excel Datei bestehen die dann bei Änderungen sich anpasst daher wäre es sinnvoll hier einen While Funktion einzubauen? oder würde es zu viel Arbeitsspeicher wegnehmen und zum Programmsturtz führen??
    Der Thread soll komplett im Hintergrund laufen (aktuelle Code tut es teilweise) der Soll keine Werte anzeigen sondern die werte Speichern damit beim Abfrage Funktion (der noch in Main Programm kommt) die werte nach Spalten auslesbar sind.

    3. Simulation (Das gleiche wie bei Excellesen Thread, hat diese Thread nur einen Wert für die Präsentation es wird später über Netzwerkverbindung zu Produktion oder SAP verbunden werden)

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Security.Cryptography.X509Certificates;
    
    namespace Test
    {
        public class Simulation
        {
            [STAThread]
            public static void Main(string[] args)
            {
                Thread Simulation = new Thread(new ThreadStart(Ausführen));
    
                Simulation.Start();
            }
    
            public static void Ausführen()
            {
                Thread Produktion = new Thread(new ThreadStart(Test));  
    
                Console.WriteLine("**Simulation**");
                Console.WriteLine();
                string Material;
                Console.Write("Bitte Material für Simulation Eingeben: " );
                Material = Console.ReadLine();
                Console.WriteLine();
                Produktion.Start();
    
    
                /*string Material()
                {
                    Console.Write("Bitte für Simulation Materialnummer Eingeben: ");
                    return Console.ReadLine();
                }*/
    
                string Bestand()
                {
                    Console.Write("Bitte für Simulation Bestand Eingeben: ");
                    return Console.ReadLine();       
                }
    
            
    
            void Test()
            {
                    Console.WriteLine("******  Produktion startet  ******");
                    
                    int i;
                    Int32.TryParse(Bestand(), out i);
    
                    for (; i > 0;)
                    {
                        Console.Write("Produktion Bestand ");
                        Console.Write(i);
                        do
                        {
                            Console.WriteLine("Neue Bestand " + --i);
                            Thread.Sleep(5000);
                        }
                        while (i > 0);
                        
                    }
    
                    Console.ReadKey();
            }
    
            }
        }
    }
    

    Habe es jetzt hinbekommen das er den Bestandswert was ich für Präsentation eingebe in den While Funktion mitnimmt. (Zeile 55)
    Wäre es hier sinnvoll den i wert was im Zeile 63 ausgibt in einen String zu speichern. Damit der Abfrage Thread von Main Programm die Werte von Excellesen Thread und Simulations Thread(i Wert) dauerhaft vergleichen kann und bei einem Bestimmte Vorgabe dann eine Meldung gibt.

    Meine Aktuelle Codierung sieht so aus, wie gesagt natürlich hättet ihr Profis das eventuell anders codiert aber mit meiner Aktuellen Wissensstand war das beste was ich codieren konnte 🙂


Log in to reply