none
Programmstart aus dem Programm; Daten sortieren RRS feed

  • Frage

  • Frage 1:

    Kann man in Visual Basic ein Program aus dem gleichen Programm heraus neu starten?

    Mit dem Befehl „Me.Show()“ wird zwar die Maske angezeigt, Änderungen werden dabei jedoch nicht berücksichtigt.

    Beim Uralt-Basic kann man mit dem Befehl RUN oder RUN z. B. 1000 oder auch mit der Verzweigung GOTO 1 (=1. Zeilennummer des Programms) das Programm starten!

     

    Frage 2:

    Um die Daten  innerhalb einer Datei zu sortieren gibt es beim Uralt-Basic die Möglichkeit mit dem Befehl SHELL(C:\...SORT.BAT) die angegebene Batch-Datei im DOS aufzurufen.

    @echo off

    sort c:\ erfassa>c:\ erfassb

    exit

    Hier wird die unsortierte Speicherdatei „erfassa“ in die sortierte Datei „erfassb“ konvertiert.

    Diese Vorgehensweise funktioniert auch noch in VISUAL Basic.

    Gibt es eine modernere Möglichkeit Daten zu sortieren?
    Dienstag, 1. Dezember 2020 10:37

Alle Antworten

  • Hi,

    zuerst mal die Frage: VB.NET? VBA? ...? Falls .NET, dann die weitere Frage: .NET Classic, .NET Core, ...?

    [Zu Frage 1]

    Man kann schon aber ich sehe den Sinn dahinter grad nicht. Welche Änderungen meinst Du?

    Eine Anwendung besteht ja meist nicht nur aus einer Form, sondern aus vielen Bestandteilen. Erzähl uns doch etwas mehr über deine Anwendung, dann können wir dir sicher auch sagen, wie Du das Gewünschte erreichen kannst.

    [Zu Frage 2]

    Die Daten innerhalb einer Datei zu sortieren ist eine sehr vage Beschreibung. Willst Du die Zeilenwerte sortieren? Falls ja, was genau steht denn da drin?

    Wenn es wirklich nur um die vollständigen Zeilenwerte geht, kannst Du die Inhalte bspw. über:

    Dim Lines As List( Of String )
        Lines = File.ReadAllLines( "<Pfad>" ).ToList()
    
        Lines = Lines.Sort( ... )
    
        File.WriteAllLines( "<Pfad>", Lines )

    sortieren. ( ... ) bei Sort, da es mehrere Überladungsmöglichkeiten für den Aufruf gibt. Um einfach alle Werte sortieren zu lassen, einfach .Sort() schreiben).


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 1. Dezember 2020 12:11
    Moderator

  • Hallo Herr Falz,
    
    in Ergänzung zu meiner heutigen Anfrage habe ich noch den Programmausdruck beigefügt.
    Vielleicht können Sie einen Blick darüber werfen und mir mitteilen ob sich meine Fragen bezügl. 
    dem Starten aus dem Programm bzw. Sortieren der Daten in einer Datei  beantworten lassen.
    
    Mit freundlichen Grüßen
    Agathon König
    
    
    VISUAL STUDIO 2019
    Projekt erstellt als windows Forms-App (.NET Framework)
    
    ' Programm zum Verwalten von Interessenten
    
    Imports System.IO
    
    Public Class Form1
        Dim be, anr, vorn, nachn, stra, ort, club, snr, typ, bn, yz As String
        Dim code As Integer
        Dim code1 As Integer = 0
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load, LblStraße.Click
    
            FileOpen(1, "c:\master\daten\stamm\erfassb", OpenMode.Input)
    
            If Not EOF(1) Then
                Do While Not EOF(1)
                    Input(1, be) : Input(1, code) : Input(1, club) : Input(1, snr) : Input(1, typ) : Input(1, bn)
                    Input(1, yz) : Input(1, anr) : Input(1, vorn) : Input(1, nachn) : Input(1, stra) : Input(1, ort)
                    If code > code1 Then code1 = code
    
                    LstInteresse.Items.Add(be)
                Loop
            End If
            FileClose(1)
    
        End Sub
    
        Private Sub LstInteresse_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LstInteresse.SelectedIndexChanged
    
            FileClose()
            FileOpen(2, "c:\master\daten\stamm\erfassz", OpenMode.Output) : FileClose(2)
            FileOpen(1, "c:\master\daten\stamm\erfassb", OpenMode.Input)
            FileOpen(2, "c:\master\daten\stamm\erfassz", OpenMode.Append)
            If Not EOF(1) Then
    
                Do Until be = LstInteresse.SelectedItem
                    Input(1, be) : Input(1, code) : Input(1, club) : Input(1, snr) : Input(1, typ) : Input(1, bn)
                    Input(1, yz) : Input(1, anr) : Input(1, vorn) : Input(1, Name) : Input(1, stra) : Input(1, ort)
                    If LstInteresse.SelectedItem = "---Neuangabe---" Then code = code1 + 1
    
                    If be = LstInteresse.SelectedItem Then TxtCode.Text = code : TxtAnrede.Text = anr : TxtName.Text = Name : TxtVorname.Text = vorn : TxtStraße.Text =
                        stra : TxtOrt.Text = ort : TxtClub.Text = club : TxtSnr.Text = snr : TxtTyp.Text = typ : TxtYZ.Text = yz : TxtBN.Text = bn Else Print(
                        2, be) : Print(2, vbCrLf) : Print(2, code) : Print(2, vbCrLf) : Print(2, club) : Print(2, vbCrLf) : Print(2, snr) : Print(2, vbCrLf) : Print(2, typ) : Print(
                        2, vbCrLf) : Print(2, bn) : Print(2, vbCrLf) : Print(2, yz) : Print(2, vbCrLf) : Print(2, anr) : Print(2, vbCrLf) : Print(2, Name) : Print(2, vbCrLf) : Print(
                        2, vorn) : Print(2, vbCrLf) : Print(2, stra) : Print(2, vbCrLf) : Print(2, ort) : Print(2, vbCrLf)
                Loop
            End If
        End Sub
    
        Private Sub CmdSpeichern_Click(sender As Object, e As EventArgs) Handles CmdSpeichern.Click
            'Dim p As New Segler1
            If IsNumeric(TxtCode.Text) Then code =
                TxtCode.Text Else code = 0
            If TxtAnrede.Text <> "" Then anr =
                TxtAnrede.Text Else anr = "-"
            If TxtName.Text <> "" Then nachn =
                TxtName.Text Else nachn = "-"
            If TxtVorname.Text <> "" Then vorn =
                TxtVorname.Text Else vorn = ""
            If TxtStraße.Text <> "" Then stra =
                TxtStraße.Text Else stra = "-"
            If TxtOrt.Text <> "" Then ort =
                TxtOrt.Text Else ort = "-"
            If TxtClub.Text <> "" Then club =
                TxtClub.Text Else club = "-"
            If TxtSnr.Text <> "" Then snr =
                TxtSnr.Text Else snr = "-"
            If TxtTyp.Text <> "" Then typ =
                TxtTyp.Text Else typ = "-"
            If TxtYZ.Text <> "" Then yz =
                TxtYZ.Text Else yz = "-"
            If TxtBN.Text <> "" Then bn =
                TxtBN.Text Else bn = "-"
    
            be = nachn & " " & vorn
            Print(2, be & "," & code & "," & club & "," & snr & "," & typ & "," & bn & "," & yz & "," & anr & "," & nachn & "," & vorn & "," &
                stra & "," & ort) : Print(2, vbCrLf)
    
            Do Until EOF(1)
                Input(1, be) : Input(1, code) : Input(1, club) : Input(1, snr) : Input(1, typ) : Input(1, bn)
                Input(1, yz) : Input(1, anr) : Input(1, vorn) : Input(1, nachn) : Input(1, stra) : Input(1, ort)
    
                Print(2, be & "," & code & "," & club & "," & snr & "," & typ & "," & bn & "," & yz & "," & anr & "," & nachn & "," & vorn & "," &
                stra & "," & ort) : Print(2, vbCrLf)
            Loop
            FileClose()
    
            FileOpen(2, "c:\master\daten\stamm\erfassa", OpenMode.Output)
            FileOpen(1, "c:\master\daten\stamm\erfassz", OpenMode.Input)
    
            Do Until EOF(1)
                Input(1, be) : Input(1, code) : Input(1, club) : Input(1, snr) : Input(1, typ) : Input(1, bn)
                Input(1, yz) : Input(1, anr) : Input(1, vorn) : Input(1, nachn) : Input(1, stra) : Input(1, ort)
    
                Print(2, be & "," & code & "," & club & "," & snr & "," & typ & "," & bn & "," & yz & "," & anr & "," & nachn & "," & vorn & "," &
              stra & "," & ort) : Print(2, vbCrLf)
            Loop
            FileClose()
    
            FileOpen(1, "c:\master\daten\stamm\erfassa", OpenMode.Input)
            Input(1, be) : Input(1, code) : Input(1, club) : Input(1, snr) : Input(1, typ) : Input(1, bn)
            Input(1, yz) : Input(1, anr) : Input(1, vorn) : Input(1, nachn) : Input(1, stra) : Input(1, ort) : FileClose(1)
            If be <> "---Neuangabe---" Then FileOpen(2, "c:\master\daten\stamm\erfassa", OpenMode.Append) : Print(
                2, "---Neuangabe---" & "," & 0 & "," & "" & "," & "" & "," & "" & "," & "" & "," & "" & "," & "" & "," & "" & "," & "" & "," &
              "" & "," & "") : Print(2, vbCrLf)
    
            Shell("C:\master\daten\stamm\sorta.bat", 1)
     Hier wird die unsortierte Datei „erfassa“ in die sortierte Datei „erfassb“ konvertiert !
    
            'Me.Show()  
    Hier sollte das Programm neu gestartete werden und die Anzeigen sollten die Änderungen schon berücksichtigen !
        End Sub
    
    
        Private Sub CmdZurück_Click(sender As Object, e As EventArgs) Handles CmdZurück.Click
            Shell("C:\master\daten\stamm\sorta.bat", 1)
            FileClose() : End
        End Sub
    End Class
    

    Dienstag, 1. Dezember 2020 17:25
  • Hallo Agathon,

    vorab: In den Foren sind wir eigentlich beim Du und ich weiche da auch nur sehr ungerne und in Ausnahmefällen davon ab. Ist das Ok für dich?

    Zum Code: Jesses, was ist das? Aus VB Classic konvertierter Code, der "irgendwas" machen soll?

    Ich bin ja nun in VB Classic nicht wirklich firm aber für mich sieht das nicht so aus als ob das in seiner Gesamtheit irgendeinen Sinn ergeben würde.

    Do While Not EOF(1)
        Input(1, be) : Input(1, code) : Input(1, club) : ...
        If code > code1 Then code1 = code
    
        LstInteresse.Items.Add(be)
    Loop

    Warum liest Du hier bspw. 12 mal die Werte aus, wenn Du maximal zwei Werte brauchst? (Und warum auf die veraltete Weise mit den VB Classic Befehlen?)

    Innerhalb der Metrhode LstInteresse_SelectedIndexChanged öffnest und schließt Du Dateien, erstellst mögliche  Endlosschleifen (bspw. wenn be niemals LstInteresse.SelectedItem sein wird), schreibst dann wieder etwas in eine andere Datei.

    Innerhalb von CmdSpeicher_Click dann dasselbe. Du schreibst, liest, schreibst wieder und rufst dann per Shell eine BAT Datei auf.

    Auch wenn das für dich evtl. Sinn ergeben mag, für mich tut es das nicht wirklich. Ich verstehe zwar die einzelnen Teile aber ich erkenne keinen wirklichen Sinn in deinem Code.

    Es wäre für uns hier viel hilfreicher, wenn Du mal eine Beispieldatei und das gewünschte Ergebnis nach der Bearbeitung posten würdest.

    Deine Frage nach "Programm neu starten und Änderungen berücksichtigen" kann man eigentlich nur so beantworten, dass das Programm das anzeigt, was in der Datei steht (irgendwie zumindest). Wenn also noch die alten Werte ausgegeben werden, wurde die Datei halt nicht aktualisiert.

    Wie gesagt, poste bitte mal eine Datei im Original und eine, die das gewünschte Ergebnis beinhaltet. Dazu dann die Beschreibung, was genau Du nun mit den Daten wie machen willst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 1. Dezember 2020 22:38
    Moderator
  • Hallo Stefan,

     

    voerst vielen Dank für Deine Geduld mit mir. Untenstehend habe ich die wesentlichen Bestandteile des Programmes mit der gewünschten Zielsetzung aufgelistet.

     

    Auszug aus der Speicherdatei „ERFASSB“

     

    Darstellung der Bearbeitungsmaske

     

     

    Zielsetzung

     

    In der dargestellten Speicherdatei „ERFASSB“ sind die Daten bereits alphabetisch nach „be“ (=Bootseigner=Interessent) sortiert. Jeder Bootseigner hat dabei auch einen Code.

    Die Listbox „LstInteresse“ zeigt alle bereits erfassten Bootseigner. Aus der Listbox wird ein Bootseigner zu Bearbeitung ausgewählt. Die vor dem ausgewählten Datensatz nicht veränderten Datensätze werden in der Speicherdatei „ERFASSZ“ gespeichert.

    Die einzelnen 12 Daten werden nach Auswahl aus der Listbox in den Textboxen angezeigt. Mit Ausnahme der Code-Nr. können alle übrigen Daten verändert werden. Bei geänderten Daten wird nach Betätigen des Buttons „Speichern“ dieser Datensatz bei „ERFASSZ“ hinten angehängt. Desweiteren werden alle folgenden Datensätze ebenfalls bei „ERFASSZ“ nach dem geänderten Datensatz gespeichert. Aus der Datei „ERFASSZ“ wird „ERFASSA“ enwickelt.

    Über die mit dem Befehl „Shell“ aufgerufene BAT-Datei wird „ERFASSA“ nach „ERFASSB“ alphabetisch sortiert (Der Nachname beim geänderten Datensatz könnte ja mit einem anderen Buchstaben beginnen). Nach Rückkehr aus der BAT-Datei sollte die Listbox der Bearbeitungsmaske die ev. Änderungen beim Namen enthalten. Tut sie aber nicht !!

     

    Bei der ---Neuangabe--- eines Interessenten wird in der Textbox die nächste freie Code-Nr.

    angezeigt (ermittelt mit „If code > code1 Then code1 = code“), alle übrigen Felder bleiben

    frei und können mit den neuen Daten ausgefüllt werden.

    Der geänderte Datensatz (be= ---Neuangabe---) wird in der Datei „ERFASSZ“ als erstes gepeichert. Der weitere Speicher- bzw. Sortiervorgang erfolgt wie oben beschrieben.

    Damit weiter neue Bootseigner erfasst werden können wird an die Datei „ERFASSA“ noch der Datensatz (---Neuangabe---,0,,,,,,,,,, )angehängt. Nach der Sortierung durch die besagte BAT-Datei steht dieser Datensatz bei „ERFASSB“ wieder ganz oben.

     

     

    Vielen Dank schon mal im Voraus.

    Gruß Agathon


    Mittwoch, 2. Dezember 2020 10:36
  • Hallo Agathon,

    leider können wir die Screenshots nicht sehen, da die nur auf deinem lokalen Laufwerk C:\ liegen.

    Lad die bitte über die Funktion "Insert Image" (das Icon ganz rechts in der Editor Symbolleiste) hoch, und füg das Bild dann in dein Posting ein.

    Frage generell: Ist das, was Du da machst (also mit genau diesen Dateien, diesen Dateiformaten, der Batchdatei für die Sortierung, usw.) zwingend so umzusetzen? Meiner persönlichen Meinung nach würde ich das komplett wegschmeißen und es auf ganz neue Beine stellen.

    Den Rest schaue ich mir noch an.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 2. Dezember 2020 10:41
    Moderator
  • Hallo Stefan,

    ich habe vor gut 20 Jahren ein Auswertungsprogramm für eine spezielle Regattaserie mit GW-BASIC 3.22 erstellt. Ich versuche es jetzt auf eine unter WINDOWS laufende Version umzuprogrammieren.

    Gruß Agathon

    Mittwoch, 2. Dezember 2020 16:23