Windows Form-Anwendung oder Windows C#

Horst1945

Cadet 4th Year
Registriert
Okt. 2014
Beiträge
106

Hallöchen,

ich musste wohl oder übel, nachdem Microsoft kein Update mehr auf die Windows XP Prof. mehr macht und diese XP-Version sozusagen eingestellt hat, meine Betriebssoftware auf Windows 7 bzw. auf Windows 8.1 umstellen.
Nicht nur das, denn ich musste auch mein keines selbstgeschriebenes Faktura, das ich unter Visual Basic 6 geschrieben habe, auch umstellen.

Dies Faktura-Programm lief auf eine Windows Server 2003 Business. Den PC habe ich alle 3 Jahre ausgetauscht.

Ich habe mir folgende Programme neuzugelegt:
- Visual Basic Studio Professional 2013
- Windows Server 2012 R2

Ich habe so langsam begonnen, das Faktura-Programm unter VB 2013 neu zuschreiben.

Hier ein Einblick über das Test-Modul „Artikel“:

Code:
Imports System.Data
Imports System.Data.OleDb

Public Class Artikel
    Dim inc As Integer
    Dim MaxRows As Integer
    Dim con As New OleDb.OleDbConnection
    Dim dbProvider As String
    Dim dbSource As String
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim Sql As String
    Dim suchen As String
    Dim listpreis As Double = 0.0
    Dim aSuchen As Double

    Private Sub Artikel_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        grbSuchen.Visible = False
        With cmbSuchWo

            .Items.Add("Artikel-Nr")
            .Items.Add("Arikel-Bezeichnung")
            .Text = "Artikel-Nr"
        End With
        dbProvider = "Provider = Microsoft.Jet.OLEDB.4.0;"
        dbSource = "Data Source =faktur.mdb"
        con.ConnectionString = dbProvider & dbSource
        If grbSuchen.Visible = True Then
            If cmbSuchWo.Text = "Artikel-Nr" Then
                Sql = "Select * from artikel where artnr =" & "'" & suchen & "'"

            ElseIf cmbSuchWo.Text = "Artikel-Bezeichnung" Then
                Sql = "Select * from artikel where artbz =" & "'" & suchen & "'"

            End If


        Else
            Sql = "SELECT * FROM artikel"
        End If

        Try
            da = New OleDb.OleDbDataAdapter(Sql, con)
            da.Fill(ds, "artikel")
            con.Close()

        Catch ex As Exception
            MsgBox("Tabelle Artikel ist bereits geöffnet", vbAbort, "Tabelle")
            Return
        End Try

        AllleSehen()
    End Sub
    Private Sub AllleSehen()
        If Not IsDBNull(ds.Tables("artikel").Rows(0).Item("artnr")) Then
            txtArtNr.Text = ds.Tables("artikel").Rows(0).Item("artnr")
        Else
            txtArtNr.Clear()
        End If

        If Not IsDBNull(ds.Tables("artikel").Rows(0).Item("artbez")) Then
            txtArtBez.Text = ds.Tables("artikel").Rows(0).Item("artbez")
        Else
            txtArtBez.Clear()
        End If
        If Not IsDBNull(ds.Tables("artikel").Rows(0).Item("lfNr")) Then

            txtLiefRaNr.Text = ds.Tables("artikel").Rows(0).Item("lfNr")
        Else
            txtLiefRaNr.Clear()
        End If

        If Not IsDBNull(ds.Tables("artikel").Rows(0).Item("listpreis")) Then
            listpreis = Convert.ToDouble(ds.Tables("artikel").Rows(0).Item("listpreis"))
            txtListenPr.Text = listpreis

            If Not IsDBNull(ds.Tables("artikel").Rows(0).Item("lfNr")) Then

                txtLiefRaNr.Text = ds.Tables("artikel").Rows(0).Item("lfNr")
            Else
                txtLiefRaNr.Clear()
            End If

        Else
            txtListenPr.Clear()
        End If
        MaxRows = ds.Tables("artikel").Rows.Count

        inc = -1
    End Sub
    Private Sub NavigateRecords()
        If Not IsDBNull(ds.Tables("artikel").Rows(inc).Item("artnr")) Then
            txtArtNr.Text = ds.Tables("artikel").Rows(inc).Item("artnr")
        Else
            txtArtNr.Clear()
        End If

        If Not IsDBNull(ds.Tables("artikel").Rows(inc).Item("artbez")) Then
            txtArtBez.Text = ds.Tables("artikel").Rows(inc).Item("artbez")
        Else
            txtArtBez.Clear()
        End If
        If Not IsDBNull(ds.Tables("artikel").Rows(inc).Item("lfNr")) Then

            txtLiefRaNr.Text = ds.Tables("artikel").Rows(inc).Item("lfNr")
        Else
            txtLiefRaNr.Clear()
        End If

        If Not IsDBNull(ds.Tables("artikel").Rows(inc).Item("listpreis")) Then
            listpreis = Convert.ToDouble(ds.Tables("artikel").Rows(inc).Item("listpreis"))
            txtListenPr.Text = listpreis
        Else
            txtListenPr.Clear()
        End If
    End Sub
    Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click

        If inc <> MaxRows - 1 Then

            inc = inc + 1

            NavigateRecords()

        Else

            MsgBox("Letzter Datensatz")

        End If

    End Sub

    Private Sub cmdSuchen_Click(sender As Object, e As EventArgs) Handles cmdSuchen.Click
        grbSuchen.Visible = True
        txtAbDatum.Clear()
        txtABWRMenge.Clear()
        txtArtAllgemein.Clear()
        txtArtBez.Clear()
        txtArtNr.Clear()
        txtArtZusatz.Clear()
        txtErstazNr.Clear()
        txtLgBestand.Clear()
        txtLgMenge.Clear()
        txtLgOrt.Clear()
        txtLiefRaNr.Clear()
        txtListenPr.Clear()
        txtWEMenge.Clear()
        txtZuDatum.Clear()
        cmdSuchen.Visible = False

    End Sub

    Private Sub btmBeenden_Click(sender As Object, e As EventArgs) Handles btmBeenden.Click
        Me.Close()
    End Sub

    Private Sub Label25_Click(sender As Object, e As EventArgs) Handles Label25.Click
        Label25.Text = inc
    End Sub

    Private Sub txtArtNr_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtArtNr.KeyPress
        If e.KeyChar = ChrW(13) Then
            txtArtBez.Focus
        End If
    End Sub

    Private Sub txtArtNr_TextChanged(sender As Object, e As EventArgs) Handles txtArtNr.TextChanged

    End Sub

    Private Sub btnSuchen_Click(sender As Object, e As EventArgs) Handles btnSuchen.Click
        'aSuchen = txtSuchen.Text
        suchen = txtSuchen.Text
        If grbSuchen.Visible = True Then
            If cmbSuchWo.Text = "Artikel-Nr" Then
                Sql = "Select * from artikel where artnr =" & "'" & suchen & "'"
            End If
        End If
        da = New OleDb.OleDbDataAdapter(Sql, con)
        da.Fill(ds, "artikel")
        AllleSehen()
    End Sub
End Class

Ich habe das Proggi (Windows Form-Anwendung) auch schon einmal getestet und da ist mir aufgefallen, dass die Datenbank nicht auf zwei Rechner gleichzeitig angesprochen werden kann. Derzeit habe ich neben dem Server, fünf weiter Arbeitsstationen (PC)

Ich habe mich etwas um gehört und man hat mir gesagt, dass ich mir noch zusätzlich einen SQL Server zulegen müsste und das Programm unter Visual C# umgestalten sollte. Gesagt getan: „Aber da treten bei mir einige Schwierigkeiten auf.

Das Programm sollte schon wie unter der Testversion, auch unter Visual-Windows Form-Anwendung vom Prinzip her genauso aussehen:

Faktura-Start.jpg Artikelstamm.jpg

Kann mir jemand von Euch mir einen kleinen Tipp geben, wie ich das mit Visual C# realisieren kann?

Horst
 
Hallo, könntest Du bitte noch einmal sagen, was Du aktuell für ein Datenbanksystem im Einsatz hast? Ist das eine MS Access "Datenbank"?

Ich glaube, Du bräuchtest mal ein paar grundsätzliche Ratschläge zur Architektur Deiner Anwendung.

Ganz allgemein würde ich raten, Dir einmal die Express Versionen vom Visual Studio und SQL Server anzuschauen. Damit kommt man schon ziemlich weit, ohne Geld in die Hand nehmen zu müssen.

http://www.microsoft.com/de-de/server-cloud/products/sql-server-editions/sql-server-express.aspx

http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx

Beim Visual Studio mußt Du die Version für Windows nehmen (die zweite von oben).

Ich würde Dir empfehlen, die Datenhaltung in einer SQL Datenbank zu realisieren. Darauf kannst Du einen Client setzen. Für "Anfänger" ist Windows Forms gut geeignet. Dort kannst Du die Oberfläche einfach zusammen klicken. Über ADO.NET kommst Du an die Datenbank. Das Stichwort heißt "Databinding". Das Entity Framework würde ich sagen, ist für Dich eine Nummer zu groß.

Die Windows Anwendung strickst Du nach dem MVC Prinzip. Also Model, View, Controller. Soll heißen. Die Solution besteht aus 3 Teilprojekten. Einmal Datenbankzugriff als eigene Klassenbibliothek. Einmal die Geschäftslogik (also Rechenoperationen, steuern der Abläufe, etc.) als eigene Klassenbibliothek und zum Schluß die Oberfläche als Windows Forms Anwendung. Das Teilprojekt der Oberfläche bindet die beiden Klassenbibliotheken ein.

Die Geschäftslogik bietet Methoden an, die die Oberfläche aufrufen kann. Also z.B. "LadeArtikel(int artikelNummer)". Diese Methoden geben die Daten als Objekt an die Oberfläche. Also z.B. Artikel-Objekt hat die Eigenschaften Nummer, Beschreibung, Preis, usw..

Die Oberfläche kann dann mit diesen Daten machen, was sie will. Z.B. die Maske füllen.

Die Geschäftslogik muß die Methode LadeArtike implementieren. Was muß sie dafür machen? Z.B. muß sie den Artikel aus der Datenbank laden. Dafür ruft sie ihrerseits eine Methode aus der Klassenbibliothek für den Datenbankzugriff auf.

Was hast Du nun von alledem?

1. MVC ist state of the art, wenn Du größere Geschäftsanwendungen programmieren willst.

2. Die Trennung in Schichten hat den Vorteil, daß Du die Anwendung in Zukunft leichter erweitern kannst. Außerdem kannst Du bestimmte Teile austauschen.
Die Oberfläche soll sich ändern? Kein Problem. Die Geschäftslogik bleibt gleich. Der Datenbankzugriff auch.
Die Datenbank zieht auf eine andere Plattform um? Kein Problem. Es muß nur das Teilprojekt für den Datenbankzugriff geändert werden. Der Rest bleibt gleich.


So habe ich Dich jetzt erschlagen? Oder kannst Du mir noch folgen?
 
Zuletzt bearbeitet:
Mal ohne den ganzen Artikel durchzulesen bisschen aufräumen:

- Windows Form ist eigentlich nur die "Darstellungsform". D.h. du kannst Windows Form Anwendungen sowohl mit VB.Net, C# oder auch C++ entwickeln.
- Das Programm heißt Visual Studio und nicht Visual Basic Studio
- Du musst nicht zwingend von VB (hoffentlich VB.Net) auf C# umsteigen, da beides das .Net Framework verwenden und somit im Hintergrund eh das gleiche passiert.

Dein Problem dürfte sich somit also rein darauf beschränken, dass du Access nutzt und du diese Access Datenbank halt immer nur mit einem User ansprichst.
Bevor du dir auch noch nen SQL-Server zulegst, solltest du erst mal mit SQL Express testen. Der ist in der aktuellen Version 2014 bis DB-Größen von 10 GB geeignet, darüber benötigst du dann leider doch eine vollwertige SQL Server Version

@Ruheliebhaber: Mir hört sich das ganze Thema hier schon recht nach kommerziellem Einsatz an. Somit dürfte man hier rein Produktlizenztechnisch die Express Edition vom Visual Studio gar nicht einsetzen. (Gut, gibt Grauzonen).
 
@evilbaschdi: Da hast Du Recht. Zum Entwickeln und ausprobieren sollte es aber erst einmal reichen. Ein große Lizenz kann man bei Bedarf immer noch kaufen.

Ich habe das so verstanden, daß der TE eine kleine Firm hat und für den Eigenbedarf eine Anwendung schreiben möchte. Also nichts, was kommerziell weiter verkauft wird.

Außerdem weiß ich nicht, auf welchem Niveau wir uns unterhalten. Daher wollte ich das alles erst einmal möglichst einfach halten. Es gibt schließlich immer mehrere Wege zum Ziel.

Auf welcher Plattform der TE seine Daten aktuell hat (MS Access, MySQL, oder was auch immer) ist ein zentraler Punkt. Das müssen wir als erstes klären.
 
Wie Umfangreich sind die Daten in der Access-Datenbank. Wenn es sehr viel ist, könnte man überlegen, den Fehler in Deiner Anwendung zu suchen.

Wenn es sehr wenig ist, könnte man überlegen, die Daten auf den SQL Server zu migrieren. Auf lange Sicht ist das die Lösung, welche die größte Flexibilität und Zukunftssicherheit bietet.
 
So ich habe eine Lösung endlich gefunden!

War wirklich eine schwierige Geburt:
Code:
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Text;

namespace VBFaktura
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
           
            SqlConnection con = new SqlConnection(@"Data Source=.\sqlexpress;Database=faktura;Integrated security=yes");
            // SQL-Befehl
            con.Open();
            
           string strSQL = "Select kdnr, ansprechen, name from stammdaten where kdnr = '10 011'";

            SqlCommand cmd = new SqlCommand(strSQL, con);
            
            // Kommando absetzen      
            SqlDataReader rdr = cmd.ExecuteReader();
            var sb = new System.Text.StringBuilder();



            while (rdr.Read())
            {
                // get the results of each column
                txtKdnr.Text = (string)rdr["kdnr"];
                txtAnrede.Text = (string)rdr["ansprechen"];
                txtKunde.Text = (string)rdr["name"];
                
            }
            rdr.Close();  
        }

        private void btnSuchen_Click(object sender, EventArgs e)
        {

                

        }
            
          
        }
    
}
 
Zurück
Oben