Laden...
F
Fabian710 myCSharp.de - Member
Student Gütersloh Dabei seit 08.03.2013 42 Beiträge
Benutzerbeschreibung

Forenbeiträge von Fabian710 Ingesamt 42 Beiträge

11.06.2014 - 11:52 Uhr

Hallo,
ich möchte mit meiner C# Anwendung Änderungen an Datensätze zurück nach SAP geben. Der vorhandene Funktionsbaustein sieht wie folgt aus:

CALL FUNCTION 'BAPI_QUALIPROF_CHANGE'
  EXPORTING
    plvar          = '01'
    otype          = 'P'      "Person
    sobid          = '3082906'  " Employee no#
  IMPORTING
    return         = return1
  TABLES
    profile_add    = itab_24
    profile_delete = itab_del
    change_profile = itab_chan.

Mein bisheriger Programmcode sieht so aus:


 config = new RFCDestinationConfigurations();
            string SAPConn = "H21";
            string SAPDest = "Server=xxxxxx SYSTEMNUMBER=xxxx CLIENT=110 USER=xxxxxxxxx LANGUAGE=DE PASSWORD=xxxxxxxx3";
            config.AddOrEditDestination(SAPConn, SAPDest + " POOLSIZE=2");
            string address = config.GetAddress(SAPConn);

            RfcDestination SAPDesti = RfcDestinationManager.GetDestination(SAPConn);
            RfcRepository SAPRepo = SAPDesti.Repository;
            IRfcFunction SAPFunct = SAPRepo.CreateFunction("BAPI_QUALIPROF_CHANGE");
           
            string answer1 = SAPFunct.GetValue("return").ToString();
            SAPFunct.SetValue("plvar", "01");
            SAPFunct.SetValue("otype", "P");
            SAPFunct.SetValue("sobid", "3071298");
            SAPFunct.Invoke(SAPDesti);


            IRfcTable change = SAPFunct.GetTable("Profile_Add");
            IRfcStructure testi = change.Metadata.LineType.CreateStructure();

            testi.SetValue("OBJ_ID", "50001157");
            DateTime begin = new DateTime(2014, 06, 11);
            testi.SetValue("BEGDA", begin);
            DateTime end = new DateTime(2015, 06, 11);
            testi.SetValue("ENDDA", end);
            testi.SetValue("RATING", "0001");

            //RfcSessionManager.BeginContext(SAPDesti);
            SAPFunct.Invoke(SAPDesti);
            string answer = SAPFunct.GetValue("Return").ToString();
            //RfcSessionManager.EndContext(SAPDesti);

Problem an der ganzen Sache ist, dass ich:

  1. nicht weiß, ob ich die Tabellen (entweder profile_add oder change_profile) richtig anspreche und richtig fülle.
  2. Das ganze läuft ohne Exception durch, in SAP ist aber nix angekommen.

Wo kann mein Fehler liegen, was muss ich verbessern?

Danke für eure Hilfe!

14.05.2014 - 10:26 Uhr

Fehlermeldung:
------ Neues Erstellen übersprungen: Projekt: CoilClient20.13, Konfiguration: Release x86 ------
Für diese Projektmappenkonfiguration wurde kein zu erstellendes Projekt ausgewählt.
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 0, 1 übersprungen ==========

14.05.2014 - 10:02 Uhr

Ich schaue im bin\debug bzw bin\release Verzeichnis.
In der Infolleiste vom Studio ändert sich gar nix, wenn ich den Erstellen-Vorgang starte. Also auch keine Fehlermeldung 😕
Wenn ich im Explorer meinen Projektordner kopiere und neu öffne, dann funktioniert das ganze....

Ok, falscher Alarm, er führt da das Erstellen zwar durch, allerdings wird die Programmversion im Release Ordner nicht auf den neusten Stand gebracht

14.05.2014 - 09:25 Uhr

Hallo zusammen,

ich habe in Problem bei meinem aktuellen Projekt.
Nutze Visual Studio 2010.
Wenn ich die Projektmappe neu erstellen lasse passiert...nix.
Wenn ich Änderungen auf der Oberfläche machen und dann Debugge...sind diese Änderungen nicht dabei. Woran kann das liegen? Wie bekomme ich es hin, dass die Projektmappe neu erstellt wird und alle Änderungen übernommen werden?

Danke für eure Hilfe!

08.05.2014 - 14:30 Uhr

Hallo zusammen,
ich habe ein Problem mit dem SerialPort-Scanner und der Verarbeitung der Daten. Wenn eine bestimmte Form geöffnet ist. Auf dieser muss der Mitarbeiter er eine Materialnummer durch einscannen bestätigen.
Auf meiner Hauptform habe ich den Scanner initialisiert und sage was er wann zu tun hat. (Auszug!)


            if (H.fbIsActive)
            {
                return;
            }
            else if (H.leCheckIsActive)
            {
                H.IsLagereinheit(data1, out ist);
                H.IsLagereinheit(H.lenr, out soll);
                
                if (soll == ist)
                {
                    using (LECheck l = new LECheck())
                    {
                        l.Erfolgreich();
                    }
                }
                else
                {
                    //LECheck.Fehlerhaft(); //alte Lösung. 
                }
            }
            else
            {

Das ist die Methode, auf der Form:

public void Erfolgreich()
        {
            if (InvokeRequired)
            {
                Invoke(new MethodInvoker(Erfolgreich));
                return;
            }
            //if (this.InvokeRequired)
            //{
            //    this.Invoke((MethodInvoker)delegate()
            //    {

            //        this.BackColor = Color.Green;
            //        this.info.Text = "Scan erfolgreich! Buchung wird fortgesetzt!";
            //        this.Update();

            //        System.Threading.Thread.Sleep(2000);
            //        H.correctCoil = true;
            //        H.leCheckIsActive = false;
            //        H.fbIsActive = true;
            //        Application.RemoveMessageFilter(this);
            //        this.Hide();
            //    });
            //}
            //else
            //{
                this.BackColor = Color.Green;
                this.info.Text = "Scan erfolgreich! Buchung wird fortgesetzt!";
                this.Update();
                System.Threading.Thread.Sleep(2000);
                H.correctCoil = true;
                H.leCheckIsActive = false;
                Application.RemoveMessageFilter(this); 
                this.Hide();
            //}
        }

Im DebuggModus sehe ich, dass er sie auch vernünftig durchläuft. Allerdings sehe ich keine Veränderung der Hintergrundfarbe und auch das Schließen erfolgt nicht.
Hat er die richtige Nummer bestätigt wird ein Buchvorgang ausgelöst. Dieser findet auch statt...Wo kann mein Fehler sein?

01.04.2014 - 10:51 Uhr

Also in der Tabelle Catalogue sind 181 Datensätze.
Wenn ich den Wert der MAXRECURSION mal hochstelle...sehe ich das mir weit über 10.000 Datensätze dazu angezeigt werden. Deshalb meine Vermutung, dass es sich um eine Endlosschleife handelt. Bei manchen Datensätzen muss ja ein Level Schritt zurück gemacht werden. Wird es aber leider nicht...

01.04.2014 - 09:20 Uhr

Hallo,

das sieht nach Oracle aus und das geht mit MS SQL nicht. Schau mal hier: Rekursive Abfragen mit MS SQL

Grüße

Ich hab mich da mal etwas eingelesen...und meine Anfrage sieht nun wie folgt aus:


With Hierachy(categorie_ID, description, group_ID, Level)
AS
(
	SELECT categorie_ID, group_ID, description, 0 AS Level
	FROM Catalogue x
	WHERE x.categorie_ID = 'QK 50230365'
	UNION ALL
	SELECT x.categorie_ID, x.group_ID, x.description, y.Level+1
	FROM Catalogue x
	INNER JOIN Hierachy y
	ON x.group_ID = y.categorie_ID
)

SELECT categorie_ID, group_ID, description
FROM Hierachy
WHERE Level >0

Funktioniert auch, aber...ich hab ne Endlosschleife 😦 und ich weiß nicht warum?
So wie ich das sehe, zählt er den Level Wert immer hoch, obwohl er bei manchen zurückgehen müsste, weil dieser in der Hierarchie weiter oben steht...

31.03.2014 - 14:00 Uhr

verwendetes Datenbanksystem: SQL Server Management Studio 2008

Hallo Leute,
ich versuche die Datensätze aus meiner Tabelle hierarchisch anzeigen zu lassen. Habe schon ein wenig gegoogelt (Hierarchische Datenbankanfragen) doch es klappt noch nicht so ganz. Habe es mit folgendem Code probiert:


select level ,categorie_ID, LPAD(' ',2*(LEVEL-1)) || description description, group_ID
from Catalogue
start with categorie_ID=1
connect by prior categorie_ID = group_ID;	

Doch es wird das Level, LPAD Start With nicht erkannt...
Habt ihr eine Idee wie ich es stattdessen angezeigt bekommen?

19.03.2014 - 07:32 Uhr

Danke Peter,
Deine Antwort hilft mir sehr weiter. Werde ich gleich mit anfangen!
Gruß
Fabian

18.03.2014 - 14:09 Uhr

Hallo zusammen,
ich habe eine Frage in Richtung Best Practice.
Mein Programm besteht aus mehreren Forms und somit auch Klassen in denen bestimmte Dinge verarbeitet werden, unter anderem auch Datenbankanfragen.
Jetzt möchte ich gerne wissen, welche Umsetzung am elegantesten ist.
In jeder Klasse die Methoden mit den Datenbankanfragen lassen?
Bislang habe ich nur die Methoden, die in mehreren Klassen vorkommen "outgesourct".
Oder sollte ich das generell mit allen "Datenbankmethoden" machen, sodass es eine extra Klasse gibt. in der alle Methoden rund um die Datenbankkommunikation enthalten sind.
Ich würde sie dann über:


using {Hilfsklasse h = new Hilfsklasse())
{
   mach was;
}

an den entsprechenden Stellen aufrufen.

Danke für eure Tipps!

10.03.2014 - 11:55 Uhr

Für die MaxVisibleLines habe ich mir nun eine Methode geschrieben. Das funktioniert soweit auch. Wie komme ich denn an die Scrolled Lines ran? Arbeite ich dort im Scroll Event oder bleibe ich im PaintEvent?

10.03.2014 - 11:28 Uhr

Wenn man es richtig macht (und nur das zeichnet was auch sichtbar ist)... dann ist das mehr als nur genügend schnell.

Das ist genau das, was ich hören wollte. Ich habe dazu leider überhaupt kein passenden Ansatz!

10.03.2014 - 11:17 Uhr

Kann man denn mit WPF ebenfalls auf die Graphic Komponente zugreifen? Ich fand das so recht einfach zu handhaben. DataGridView habe ich auch probiert aber Probleme bei der Zuordnung der Spalten und Zeilen Beziehungen gesehen.
Programm läuft so ab, dass aus SAP Tabellen (CSV-Format) exportiert werden und in SQL-Tabellen importiert (Direktzugriff auf SAP macht die Perfomance ganz hinüber.
Dann werden Datenbankabfragen gemacht und die Informationen (Mitarbeiter, Stellen+Qualifikation) in Objekte und dann in Listen gepackt.
Und mit der Paint Methode werden diese dann abgearbeitet und dem User auf dem Bildschirm angezeigt.

Hinzu kommt, das bei mir unter Windows 7 keine WPF Anwendung vernünftig dargestellt wird! 😮

10.03.2014 - 10:23 Uhr

Hallo zusammen,
ich habe meine Matrix komplett selbst gezeichnet. So war es relativ einfach möglich, dass anzupassen. (Siehe Anhang)
Allerdings ergibt sich das Problem, sobald eine Hohe Anzahl an Mitarbeiter (Spaltenanzahl) und daraus resultierend hohe Anzahl an Zeilen (Qualifikationen der Stellen) vorliegt.
Ein Scrollen ist fast unmöglich. Wenn man bedenkt, dass hinter jeder Stelle ca 50-60 Qualis hinterliegen und die pro Mitarbeiter dann auf der Form abgebildet werden.
Die Datenbankanfragen sind alle durchgeführt und es findet lediglich ein abgleich in Listen statt. Habt ihr Vorschläge wie ich die Laufzeit verbessern kann. Weil so ist es leider für Abteilungen wo mehr als 15 MA hinterlegt sich noch nicht ganz akzeptabel 😦

Ich hab schon gegoogelt, hier im Forum nach Lösungen gefunden aber nix, was mir wirklich weiterhilft. Am liebsten würde ich es so dynamisch gestalten, das er je nach Scrollposition die nötigen Zeilen neu zeichnet, oder aber, alles zu Beginn zeichnet, man munter scrollen kann ohne das es neu gezeichnet wird!

Danke für eure Tipps!! 😃

05.03.2014 - 11:38 Uhr

Ich habs jetzt hinbekommen. Habe die Tabelle mit Hilfe der Graphics Klasse selber gezeichnet! Funktioniert ohne Probleme!

04.03.2014 - 13:39 Uhr

position_ID ist die id der planstelle und personal_ID die personalnummer.

hab den key nochmal entfernt und neu hinzugefügt. Jetzt funktioniert alles 😃

03.03.2014 - 14:53 Uhr

Hallo witte,
nochmal mit erweiterter Darstellung:

03.03.2014 - 14:43 Uhr

Also geht das nun in meinem Fall oder nicht?
Die position_ID in MA_Quali ist FK, gehört nicht zum PK, soll/kann laut deiner Aussage NUll sein, klappt aber nicht 😦

03.03.2014 - 14:39 Uhr

Hmm, aber in der Tabelle ist Position ist es ja eindeutig. Nur kann es zusätzlich in der MA_Quali vorkommen, das dort der NULL Wert nötig ist?

03.03.2014 - 14:36 Uhr

Wie kann ich das denn einstellen, das er ein Optionaler Wert ist?
Für Jeden Datensatz in der Tabelle MA_Quali bildet sowohl die personal_ID als auch die quali_ID den zusammengesetzten PK. Es soll zusätzlich(FK) ein Verweis auf die position_ID gegeben sein, aber wie gesagt auch NULL Werte aktzeptieren. (Nicht jede vorhandene Qualifikationen ist explizit der Stelle (position) in der der MA tätig ist zugeordnet!

03.03.2014 - 14:20 Uhr

verwendetes Datenbanksystem: <SQL Server Studio Management 2008>

Hallo Leute,
ich habe folgende Datenbank, wie auf dem Bild ersichtlich.
Wenn ich einen Datensatz in MA_Quali einfüge die als position_ID einen NULL Wert enthalten kommt es zum Fehler, das die FK-Beschränkung nicht eingehalten wird.
Ist es nicht möglich einem FK einen NullWert zuzuweisen?

Es kann nämlich sein, das ein MA über Qualifikationen verfügt, die keiner Stelle zuzuordnen sind, und demnach als Wert für die position_ID den NULL Wert erhalten!

Danke für eure Hilfe!

28.02.2014 - 10:41 Uhr

Das hilft mir noch nicht so richtig weiter. 😦
Ich hab mal eine grobe Skizze gemacht, wie es am Ende aussehen soll. Mir fehlt der Ansatzpunkt wie ich die einzelnen MA auf die Spalten verteile!

Gruß

Fabian

06.02.2014 - 11:29 Uhr

Hallo zusammen,
ich habe ein neues Projekt aber mir fehlt zu Beginn der passende Ansatz. Vielleicht könnt ihr mir ja mit ein paar Stichpunkten helfen.

Zur Datenquelle:
Wird in einer SQL-Tabelle sein. Es gibt Qualifikationskategorien, die verschiedene Unterqualifikationen enthalten.

Frontend:
In C# geschriebenes Programm.
Übersicht über die Qualikategorien sowie die darunterliegenden Unterqualis. Auf der rechten Seite sollen in der passenden Zeile, der Unterkategorie, Spaltenweise die Mitarbeiter angezeigt werden, die über die Qualifikation verfügen.

Lange Rede....

Wie kann ich sowohl eine hierarchische Datenstruktur auf der linken Seite mit einer tabellarischen Darstellung auf der rechten Seite am elegantesten verknüpfen?

Vielen Dank im Voraus!!

13.12.2013 - 10:29 Uhr

Ok, ich habe je Maschine eine XML-Konfigurationsdatei die wie folgt aufgebaut ist:


<sfcclient>
  <application>
    <lagertyp>210</lagertyp> <!-- Lagertyp des Vorlagers der Anlage -->
    <lagerplatz>PVB-360</lagerplatz> <!-- Lagerplatz des Vorlagers der Anlage -->
    <lagernummer>100</lagernummer> <!-- Lagernummer -->
    <request>LE.CB?</request> <!-- Requestanweisung für den Druck -->
    <labelprt>{itl4}|{cdl3}</labelprt> <!-- Drucker für die Stapeletiketten -->
    <standardprt>itl4</standardprt> <!-- Standardrucker -->
    <arbeitsplatz>14136001</arbeitsplatz> <!-- Arbeitsplatznummer -->
    <buendel>20663</buendel> <!-- TPM des Bündels -->
    <kundennummer>199999</kundennummer> <!-- Kundennummer -->
    <multiple>0</multiple> <!-- Mehrere Aufträge gleichzeitig möglich? -->
    <nachdruck>cdl3</nachdruck> <!-- Drucker für Coil-Etiketten Nachdruck -->
    <scannerPort>COM1</scannerPort> <!-- Anschlussports des Scanners -->
    <betrieb>B1</betrieb> <!-- Um welchen Betrieb handelt es sich? -->
    <autodruck>ja</autodruck> <!-- Werden automatisch Etiketten gedruckt? -->
    <printVerzeichnis>C:\Entwicklung\CoilClient2013\CoilClient20.13\CoilClient20.13\bin\Debug\stapelfertig</printVerzeichnis> <!-- Verzeichnis in dem sich die AutoDruckDateien befinden -->
    <praefix>0x0011|0x0010|0x0043</praefix>
    <suffix>0x0011|0x0010|0x0044</suffix>
  </application>
</sfcclient>

In H.SetupVorlaeger() werden diese Attribute eingelesen:


public static void SetupVorlager()
        {
            vorlagertyp = H.ReadApplData("lagertyp");
            vorlagerplatz = H.ReadApplData("lagerplatz");
            server = H.ReadSetupData("server");
            user = H.ReadSetupData("user");
            pwd = H.ReadSetupData("pwd");
            port = int.Parse(H.ReadSetupData("svrport"));
            lagernummer = H.ReadApplData("lagernummer");
            reservierung = H.ReadApplData("checkReservation");
            labelprt = H.ReadApplData("labelprt");
            request = H.ReadApplData("request");
            arbeitsplatz = H.ReadApplData("arbeitsplatz");
            buendel = H.ReadApplData("buendel");
            kundenummer = H.ReadApplData("kundennummer");
            multiple = H.ReadApplData("multiple");
            nachdruck = H.ReadApplData("nachdruck");
            standardPrinter = H.ReadApplData("standardprt");
            scannerPort = H.ReadApplData("scannerPort");
            betrieb = H.ReadApplData("betrieb");
            autodruck = H.ReadApplData("autodruck").ToLower();
            printVerzeichnis = H.ReadApplData("printVerzeichnis");
            // Präfix einlesen
            string praefix = H.ReadApplData("praefix");
            string[] temp = praefix.Split('|');
            int i = 0;
            foreach (string s in temp)
            {
                string hex = s.Substring(2);
                int num = int.Parse(hex, NumberStyles.AllowHexSpecifier);
                d[i] = (char)num;
                i++;
            }
            // Suffix einlesen
            string suffix = H.ReadApplData("suffix");
            temp = suffix.Split('|');
            i = 0;
            foreach (string s in temp)
            {
                string hex = s.Substring(2);
                int num = int.Parse(hex, NumberStyles.AllowHexSpecifier);
                e[i] = (char)num;
                i++;
            }
        }

Die XML-Datei liegt im Programmverzeichnis und wird bei Programmstart eingelesen. Mit einer ClickOnce Verteilung sieht ja auch das Programmverzeichnis anders aus und ich weiß nicht, an welche Stelle die Datei gelegt werden muss.

13.12.2013 - 08:44 Uhr

Hallo,
ich möchte jetzt noch mal ein paar Dinge dazu erläutern, vlt klappt es ja dann mit der ClickOnce Veröffentlichung.
Bislang kam, bei jedem Programmstart nach ClickOnce kommt es zu einer Unhandled Exception. Diese wird von mir abgefangen und dem User am Bildschirm angezeigt. > Fehlermeldung:

Stack Trace:
bei System.Number.StringToNumer(String str, NumberStyles options, NumberBuffer&number, NumberFormatInfo info, Boolean parseDecimal)
bei System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
bei System.Int32.Parse(string s)
bei CoilCLient20._13.H.SetupVorlager()
bei CoilCLient20._13.H.datenLaden()
bei CoilCLient20._13.CoilClientGui..ctor()
bei CoilCLient20._13.Program.Main()

Ich vermute, dass es damit zusammenhängt, dass jede Maschine an der das Programm zum Einsatz kommt eine individuelle XML-Datei in der Konfigurationsdaten entahlten sind, besitzt. Kann/Muss ich diese irgendwo wieder hinterlegen, oder funktiniert es in diesem Fall eventuell gar nicht mit ClickOnce?

06.12.2013 - 10:38 Uhr

Da Clickonce bedeutet das die Anwendung nicht da steht wo du sie wahrscheinlich erwartest könnte da schon das Problem sein.

Und wie könnte ich das Problem geschickt lösen?

06.12.2013 - 10:17 Uhr

Wenn ich das Programm manuell verteile funktioniert es ja ohne Probleme...
Ich weiß nur nicht so richtig, wie ich die ClickOnce Verteilung angehe, und aus den Tutorials im Internet werde ich nicht ganz schlau. 😕

06.12.2013 - 09:57 Uhr

Hallo,
ich habe ein Programm geschrieben welches bei uns in der Produktion an verschiedenen Maschinen zum Einsatz kommt. Wenn ich es auf einen neuen Programmstand updaten will, muss ich dies bei jeder Maschine manuell durchführen.
Ich möchte probieren, das nun über die Clickonce Verteilung zu realisieren.
Dazu habe ich mein Programm auf dem Server veröffentlicht.
Wie muss ich nun vorgehen? Kopiere ich die Dateien von dort auf die lokalen Maschinen und führe dann die Setup.exe aus? Wenn ich im Anschluss das Programm starten will kommt es zu einer Unhandled Exception. (Jede Maschine hat eine individuelle Konfigurationsdatei im xml-Format, die bei Programmstart eingelesen wird!)

Vielen Dank für eure Ratschläge!

17.09.2013 - 11:53 Uhr

Ich fange die Eingaben mit der IMessageFilter.PreFilterMessage(ref Message m) ab.
Dort soll dann zunächst überprüft werden, ob die Nachricht mit einem festgelegten Präfix beginnt, wenn ja, dann wird sie eingelesen und wenn er den abschließenden Suffix festellt, wird beendet. Leider funktioniert es nicht 😦
Präfix und Suffix bestehen jeweils aus drei hex-Werten....


 bool IMessageFilter.PreFilterMessage(ref Message m)
        {

            if (m.Msg == 0x0100)
            {
                char code = (char)m.WParam.ToInt32();
                if (_prefixcheck == false)
                {
                    if (code == d[counter])
                    {
                        if (counter < 2)
                        {
                            _prefixcheck = false;
                            counter++;
                            return true;
                        }
                        else if (d[counter] == (char)0x03)
                        {
                            _prefixcheck = true;
                            _scan = true;
                            return true;
                        }
                        else
                        {
                            _prefixcheck = true;
                            _scan = true;
                            return true;
                        } 
                    }
                }

                else if (_scan == true)
                {
                    uint scanCode = (uint)(((int)m.LParam >> 16) & 0xFF);
                    char c = (char)(m.WParam.ToInt32());

                    if (c == e[tempCounter])
                    {
                        if (tempCounter <= 1)
                        {
                            _dataTemp += c;
                            tempCounter++;
                            return true;
                        }
                        else if (tempCounter == 2)
                        {
                            _scan = false;
                            _dataTemp = string.Empty;
                            _suffixcheck = true;
                            return true;
                        }
                        return true;
                    }
                    else if (c != e[tempCounter] && _dataTemp != string.Empty)
                    {
                        tempCounter = 0;
                        _data += _dataTemp;
                        _dataTemp = string.Empty;
                        _data += c;
                        return true;
                    }
                    else
                    {
                        _data += c;
                        return true;

                    }
                }
                else if (_suffixcheck == true)
                {
                    _scan = false;
                    _prefixcheck = false;
                    _suffixcheck = false;
                    scan = _data;
                    _data = string.Empty;
                   MessageBox.Show(scan);

                }
                }
return false;
        }

16.09.2013 - 16:57 Uhr

Ich habe lange gesucht doch nicht das passende gefunden.
Es klappt ja, dass wenn ich etwas einscanne, es in der Textbox steht.
Ich will aber, das man nicht auf der Tastatur rumklicken kann und dann alles direkt in der Textbox steht, sondern nur wenn diese ausgewählt ist.

15.09.2013 - 18:20 Uhr

Ich möchte damit unterscheiden, ob die Eingabe vom Scanner oder von der Tastatur kommt. Er soll sie "nur" besonders beachten wenn sie vom Scanner kommt (Materialnummer wird eingescannt, darauf hin soll automatisch die Suche gestartet werden) die Eingabe mit der Tastatur soll an verschiedenen Stellen weiterhin ohne Probleme möglich sein. Ich hab da aber irgendwie immer noch eine totale Denkblockade.
Wie kann ich auf den Präfix und Suffix zugreifen und wie dann auf die eigentliche Message?

Dadurch, dass sobald ich in einer Textdatei den Barcode einscanne, zeig er mir dort ja sofort die richtige Nummer an. Aber irgendwie weiß ich einfach nicht, wie ich sie abfange und dann bearbeite...Sch*** Schlauch auf dem ich stehe 😦

12.09.2013 - 12:12 Uhr

Hallo zusammen.
Ich habe ein Problem.
Habe ein USB Scanner und eine Tastatur.
Über beide sollen Eingaben erfolgen, allerdings beim Scanner andere Dinge durchgeführt werden.
Ich komme bei der Verarbeitung der imessage nicht voran. Kann mir jemand ein Tipp geben wie ich die da unterscheide?

Danke!!

05.04.2013 - 08:10 Uhr

Die Combobox wird über ein Benutzersteuerelement auf der Hauptform erstellt. Wenn ich mir im Debugmodus das genau anschaue funktioniert es soweit auch, in der Variable x steht auch das, was in die Combobox eingefügt werden soll. Aber der Schritt funktioniert dann nicht...

05.04.2013 - 07:36 Uhr

Hmm, und wie kann ich das rausfinden, bzw ändern?

26.03.2013 - 10:59 Uhr

Combobox 1


public void FillList(ArrayList Daten)
        {
           
            string[] lagertyp, typen;
            ArrayList daten = new ArrayList();

            daten = Daten;
            for (int i = 0; i < daten.Count; i++)
            {
                string zwischen = daten[i].ToString();
                try
                {
                    lagertyp = zwischen.Split('|');
                }
                catch (ArgumentException)
                {
                    return;
                }

                typen = lagertyp;
                string s = typen[0];
                string t = typen[1];
                string Lagertyp = typen[0] + "-" + typen[1];
                try
                {
                    cobLagertyp.Items.Add(Lagertyp);
                }
                catch (ArgumentNullException)
                {
                    return;
                }
            }
        }

SelectedItemChange


        private void cbLagertyp_Auswahl(object sender, EventArgs e)
        {

            if (cobLagertyp.SelectedItem.ToString() == "Lagertyp")
            {
                return;
            }
            else
            {
               
                string auswahl, typ;
                string[] typen;
                auswahl = cobLagertyp.SelectedItem.ToString();

                typen = auswahl.Split('-');
                typ = typen[0];
                H.lagertyp = typ;
                cb.adden();
                
            }

        }

Combobox 2 befüllen


public void adden()
        {
            string test = H.lagertyp;
            MessageBox.Show(test);
            string lagertyp = test;
            RtcMessage anfrage;
            string antwort, neu, xneu;
            string[] dat, lagerplatz, plaetze;
            ArrayList daten = new ArrayList();
            int index, len, laenge;
            
            
            try
            {
                anfrage = RtcConnection.Request("LS.LN?" + lagertyp, 500);
                antwort = anfrage.FullResponse.ToString();
                MessageBox.Show(antwort);
            }
            catch (InvalidOperationException)
            {
                return; 
            }

            index = antwort.IndexOf('{');
            len = antwort.Length;
            laenge = len - index;
            
            try
            {
                neu = antwort.Substring(index);
            }
            catch (ArgumentOutOfRangeException)
            {
                return;
            }
            
            try
            {
                xneu = neu.Replace("{{", "}|{");
            }
            catch (ArgumentNullException)
            {
                return;
            }
            catch (ArgumentException)
            {
                return;
            }

            try
            {
                dat = xneu.Split(new string[] { "}|{"}, StringSplitOptions.None);
            }
            catch(ArgumentException)
            {
                return;
            }

            

            for (int i = 0; i < dat.Length; i++)
            {
                if (dat[i] == "")
                    continue;
                else
                {
                    try
                    {
                        daten.Add(dat[i]);
                    }
                    catch (NotSupportedException)
                    {
                        return;
                    }
                }
            }

            for (int i = 0; i < daten.Count; i++)
            {
                string zwischen = daten[i].ToString();
                try
                {
                    lagerplatz = zwischen.Split('|');
                }
                catch (ArgumentException)
                {
                    return;
                }

                plaetze = lagerplatz;
                string s = plaetze[1];
                string t = plaetze[3];
                string x = plaetze[1] + "-" + plaetze[3];
                try
                {
                    
                    cobLagerplatz.Items.Add(x);
                    cobLagerplatz.Refresh();
                   
                }
                catch (ArgumentNullException)
                {
                    MessageBox.Show("hallo");
                    return;
                    
                }
                
            }



           
        }

26.03.2013 - 09:03 Uhr

Hallo,
ich habe zwei Comboboxen. Box 1 Lagertyp, Box 2 Lagerplatz
Beide werden über eigene Benutzersteuerelemente in einer Form dargestellt.
Comboxbox 1 startete eine Anfrage zur Datenbank, bekamn die Antwort, Verarbeitung auf adden hat problemlos geklappt.

Nun liegt auf Combobox1 noch ein SelectedItemChanged. Es soll die zweite Box befüllen. Die Anfrage und Verarbeitung klappt ohne Probleme, ich bekomme auch den String der in die Combobox geaddet werden soll. Doch der Befehl cobLagerplatz.Items.Add(string) wird nicht ausgeführt, bzw die Combobox2 wird nicht befüllt.

22.03.2013 - 08:22 Uhr

Hallo zusammen, ich habe ein Problem bei der Bearbeitung eines String.
public void holeDaten()

        {
            int len;
            string antwort;
            RtcMessage ThisIsTheMessage;
            try
            {
                ThisIsTheMessage = RtcConnection.Request("LS.LT?", 120);
                //MessageBox.Show(ThisIsTheMessage.FullResponse.ToString());
                antwort = ThisIsTheMessage.FullResponse.ToString();
               
            }
                
            catch (InvalidOperationException e)
            {
                Program.writeLog(e.Message);
                return;
            }
            int iz = antwort.IndexOf('{');
            MessageBox.Show(iz.ToString());
            int iy = antwort.LastIndexOf('}');
            MessageBox.Show(iy.ToString());
            len = antwort.Length-1;
            MessageBox.Show(len.ToString());
            string neu;
           
                neu = antwort.Substring(7, iy);
                MessageBox.Show(neu);
            
        }

Es wird eine Anfrage gestartet und ich bekomme einen Antwort String. Jetzt will ich aber am Anfang und am Ende was wegschneiden um ihn dann bearbeiten zu können. Die Ermittlung von iz und iy klappt auch, aber bei der Substring Methode wirft er mir den Fehler der ArgumentOutOfRangeException. Wo könnte mein Denkfehler liegen?

08.03.2013 - 12:36 Uhr

Also Button A funktioniert, genau wie alle anderen Buchstaben und zahlen.
Wenn ich auf den write Button klicke soll der eingetippte Text dann in die TextBox "Hierhin!!" übergeben werden. Ich habe aber irgendwo einen Denkfehler und weiß nicht genau wie ich das anstelle 😦

08.03.2013 - 11:30 Uhr

Da steht überall das passende.
In der Textbox der simulierten Tastatur steht ja auch das drin, was ich anklicke, es soll dann aber an das Fenster, von wo aus die Handeingabe gestartet worden wurde zurückübergeben werden.

Hab mal ein Bild in den Anhang gepackt!

08.03.2013 - 10:57 Uhr

Ok, wenn ich mit den sender.toString() ausgeben lasse, passiert gar nix. Es erscheint nie beim drücken eines Button die MessageBox 😦

08.03.2013 - 10:24 Uhr

Genau, _btnKeypad_Click _ist für die Eingabe zuständig.
Den sender habe ich genommen, um den Ursprung zu wissen, welcher Button gedrückt wurde und welchen Buchstaben er dann anziehen soll. Oder ist das Unnötig?

Ich möchte nur, dass man auf dem Bildschirm alle Buchstaben, Zahle, Komma und Punkt sieht und somit eine Tastatur simulieren kann 😃

08.03.2013 - 09:19 Uhr

Hallo zusammen,

ich programmieren zur Zeit ein Programm welches in der Produktion laufen soll.
Da die Bedienung zt auch an Touchscreens erfolgt habe ich eine virtuelle Tastatur programmiert. Der Aufruf dieser Funktioniert auch. Allerdings wird der dann eingegebene Wert nie zurück in die Textbox geschrieben 😦 Wo liegt mein Fehler?

Aufruf der Tastaur:

private void btnHandeingabe_Click(object sender, EventArgs e)
        {
            Handeingabe hand = new Handeingabe();
            hand.Show()
         }

Klasse Tastatur ohne die Form
    public partial class Handeingabe : Form
    {
        CoilClientGui gui = new CoilClientGui();
        public Handeingabe()
        {
            InitializeComponent();
        }

        public string Data;
        public bool Break;
        public bool Alpha;

        private void btnKeypad_Click(object sender, EventArgs e)
        {
            Button btn;
            try
            {

                btn = (Button)sender;
            }
            catch (InvalidCastException)
            {
                return;
            }

            tbData.Text = tbData.Text + btn.Text;
            
        }

        private void btDeleteAll_Click(object sender, EventArgs e)
        {
            tbData.Text = string.Empty;
        }

        private void btDelete_Click(object sender, EventArgs e)
        {
            tbData.Text = tbData.Text.Substring(0, tbData.Text.Length - 1);
        }

        private void btExit_Click(object sender, EventArgs e)
        {
            Data = string.Empty;
            Break = true;
            this.DialogResult = DialogResult.Cancel;
            this.Hide();

        }

        private void btWrite_Click(object sender, EventArgs e)
        {
            
            Data = tbData.Text;
            string text = Data;
           
            Break = false;
            H.tbs.schreibeText(text);
            this.DialogResult = DialogResult.OK;

            
            
           
           

            this.Hide();
            
        }

        public string eingabe()
        {
            return Data;
        }
        
    }
}