schrittweise Ersetzung von VB6-Methoden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 52 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    schrittweise Ersetzung von VB6-Methoden

    Hi,

    ich parse eine grosse Datenbank um die Daten zu verarbeiten bzw. zu visualisieren.

    Und nun stoße ich auf ein komisches Problem:

    Jahr, Monat und Tag liegen als String vor, die Werte sind immer in folgenden Grenzen:
    Jahr "1975" ... "2021"
    Monat "01" ... "12"
    Tag "01" ... "31"

    Wenn ich aus den String-Teilstücken nun ein Datum zur Verabeitung erstelle...

    VB.NET-Quellcode

    1. Dim Datum As Date = New Date(CInt(Jahr), CInt(Monat), CInt(Tag))

    alternativ so:

    VB.NET-Quellcode

    1. Dim Datum As Date = CDate(Tag & "." & Monat & "." & Jahr)


    Bekomme ich folgenden Fehlermeldung:
    Die Parameter "Year", "Month", und "Day" beschreiben eine nicht darstellbare DateTime.

    Habe debugged und in der original Datenbank an vielen Stellen einen Eintrag auf den 31. gefunden wo der Monat nur 30 Tage hatte.

    Nun suchich eine Lösung, wie man ein Datum vorher auf Gültigkeit prüfen kann.
    So richtig fündig werde ich aber nicht...oder ich seh mal wieder den Wald vor Bäumen nicht.

    Hat da jemand eine sinnvolle Idee ?
    Vielen Dank vorab für Eure Unterstützung und Hilfe.

    Hat sich erledigt: ich habe falsch gesucht... die Lösung lautet:

    VB.NET-Quellcode

    1. Dim isValidDate As Boolean = IsDate(Monat & "/" & Tag & "/" & Jahr)


    So simpel...und ich brech mir da einen ab...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Mabbi“ ()

    Naja, das ist die VB6-Methode. Eine passende VB.NET-Methode lautet:

    VB.NET-Quellcode

    1. Dim isValidDate As Boolean = Date.TryParse($"{Tag}.{Monat}.{Jahr}", Nothing)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Mabbi Oder Du verwendest die Funktion DateTime.DaysInMonth(..)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Bartosz schrieb:

    @Mabbi Nur zur Info: Geh auf Projekt ...-Eigenschaften und dann auf Verweise und nimm den Haken bei Microsoft Visual Basic raus.
    vb-paradise.de/index.php/Attac…558472cb05a2e7860fabcbc2d

    PS: Falls du aber Steuerzeichen (z.B. NewLine, TAB) benötigst, kannst du manuell einen punktuellen Verweis einfügen.

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.ControlChars


    Wow...das führt zu viel Arbeit. Grob geschätzte "seeehr viele" Fehler.
    Ich mache erstmal ein BackUp und schaue mir das genauer an.

    Hmmmm....Ich habe derzeit knappe 68k Zeilen Code in diesem Projekt (inkl. Kommentare(viele für die Lesbarkeit und Leerzeilen(wenige))

    Ich vermute, ich ziehe mir mit der Frage das Unverständnis der Code-Gurus zu, bin ich ja selber an sauberer Programmierung interessiert und optimiere viel auch in alten Projektteilen rum.
    z.B. habe ich hier viel über dgv und sourcebindings mit Datable gelesen. Alle alten Listview sind idZ. DGV mit gefilterten Datavies die auf Datatables basieren.
    Nun sind meine Coder Fähigkeiten eher basisorientiert zu nennen und ich bin wirklich froh über Eure Hilfe und glaube auch in vielen kleinen Schritten dazu zu lernen.
    Z.B. ist alles idZ. Option Strict ON ohne Ausnahme, was mir mal echt graue Haare beschert hat. Aber das Verständnis wächst mit der Umsetzung -> zielführend :)

    Zurück zu der aktuellen Problematik:
    Vieles kann ich einfach fixen, und in den neueren Teilen des Projekts habe ich auch darauf geachtet vb.net Syntax zu verwenden.

    Ist es ein NoGo VB6 Routinen im Code zu lassen ?
    ..und ich trete hier hoffentlich keine epische Meinungsdiskussion los...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mabbi“ ()

    Mabbi schrieb:

    Ist es ein NoGo VB6 Routinen im Code zu lassen ?
    Wenn der VisualBasic-Namespace weg ist, werden diese Dir nicht mehr per Default angeboten.
    Nenne mal zwei Beispiele.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Rod:

    z.B. alle möglichen String Operationen:
    Instr,Trim,Left,Len etc.

    Umwandlungen:
    CStr etc.

    Sicherheitsabfragen
    IsNumeric etc.

    Konstanten
    VbCrLf, VbYes etc

    Die kann ich alle fixen, es sind halt wirklich viele, aber ist auch nur Tipperei. Die Frage ist...lohnt sich der Aufwand oder ist er sogar zwingend notwendig ?

    Und was mir noch Sorgen macht:
    Ich sehe ja aber immer nur 100 Fehler und weis nicht so genau, was da noch auf mich zukommt.
    Die untersten Konstantem kannst Du drinne lassen, mit

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.ControlChars
    Alle String-Operationen musst Du in .NET-String-Operationen konvertieren.
    Sieh mal hier rein:
    Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen
    Böse Funktionen vermeiden
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann mal tau....gibt ein paar Tage Arbeit denke ich.
    Ich bin auf ein Problem gestossen:

    Len(CType(wks.Cells(3, 1), Excel.Range).Value) -> CType(wks.Cells(3, 1), Excel.Range).Value.lenght

    führt zu:
    Option Strict ON Late Binding error

    Das ist der Anfang der Routine:

    VB.NET-Quellcode

    1. Dim xlApp As New Excel.Application
    2. xlApp = CType(Microsoft.VisualBasic.CreateObject("Excel.Application"), Excel.Application)
    3. Dim xlWorkbooks As Excel.Workbooks = xlApp.Workbooks
    4. Dim xlWorkbook As Excel.Workbook = xlWorkbooks.Add()
    5. Dim tmp As String = ""
    6. With xlApp
    7. 'Datei öffnen und Daten einlesen
    8. xlWorkbook = .Workbooks.Open(strFilename)
    9. With xlWorkbook
    10. For Each sheet In xlWorkbook.Sheets
    11. Dim wks = DirectCast(sheet, Excel.Worksheet)
    12. ...


    Ich weis, dass oben noch "VIsualBasic" drin steht, alles zu seiner Zeit....
    Und ich war so froh keine LB-Error mehr beim Einlesen von Excel Tabellen zu haben....

    Hier scheitere ich, wie bekomme ich den weg ?

    die Farbe Rot ist der Moderation vorbehalten und wurde ersetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @Mabbi Probierma so was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports Microsoft.Office.Interop
    4. 'Microsoft.Office.Interop.Excel (15)
    5. Public Class Form1
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Dim path = "C:\Temp\\testfile.xls"
    8. Debug.Assert(System.IO.File.Exists(path))
    9. Try
    10. Dim objExcel As New Excel.Application
    11. Dim wb As Excel.Workbook = objExcel.Workbooks.OpenDatabase(path)
    12. Dim ws As Excel.Worksheet = CType(objExcel.ActiveSheet, Excel.Worksheet)
    13. MessageBox.Show(ws.Cells(1, 1).ToString)
    14. Catch ex As Exception
    15. MessageBox.Show(ex.Message)
    16. End Try
    17. End Sub
    18. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Mabbi Das sieht nach String-Operationen aus.
    Sieh Dir die Wirkungsweise der alten Funktionen an und dann suche Dir die passende neue Prozedur raus.
    Probier mal .StartsWith(), .EndsWith() und .Contains().
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod,

    ja, das sind mehrere Hundert gewesen.

    Ich habe (Suche und Ziel sind strings oder werden mit .tostring konvertiert, Position ist integer)

    Visual Basic-Quellcode

    1. instr(1, Suche, Ziel)

    Visual Basic-Quellcode

    1. instr(Position, Suche, Ziel)


    ersetzt mit

    VB.NET-Quellcode

    1. Suche.indexof(Ziel) +1

    VB.NET-Quellcode

    1. Suche.indexof(Ziel, Position -1) +1


    Wobei der hier auch mit .contains geht wenn man es nur als True/False Abfrage braucht...

    VB.NET-Quellcode

    1. Suche.indexof(Ziel) +1


    Ich brauche aber zu 90% die Position im String, deswegen verwende ich selten .contains
    Das ist doch so korrekt oder ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mabbi“ ()

    :thumbup:

    Du gehst den richtigen Weg, auch wenn er steinig ist. Da könnten sich einige ne Scheibe von abschneiden. Aber nimm vorher ne Schmerztablette, könnte unangenehm werden :P
    Ja, InStr wird mit IndexOf ersetzt. Das Ergebis fängt bei InStr bei 1 an, bei IndexOf ist es 0. Von daher auch korrekt mit dem + 1 bei Dir.
    InStrRev wird durch LastIndexOf ersetzt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Vaporized: :D...man lernt es nur wenn man es selber macht.

    Ich habe aber noch eine Frage zu den .indexof:

    Visual Basic-Quellcode

    1. strStart = InStrRev(Filedata, "###RNR:", InStr(1, FileData2, Suche) + Suche.Length, CType(1, Microsoft.VisualBasic.CompareMethod))


    wird zu

    VB.NET-Quellcode

    1. strStart = Filedata.LastIndexOf("###RNR:", FileData2.IndexOf(Suche) + 1 + Suche.Length - 1) + 1


    aktuell.

    Ich weis ehrlich nicht mehr, wofür die comparemethod gut war an dieser Stelle, aber die hatte sicher einen Sinn, sonst wäre sie nicht da.

    Wie bekomme ich die in .indexof oder . lastindexof rein oder ist das obsolete ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mabbi“ ()

    Mabbi schrieb:

    Visual Basic-Quellcode

    1. instr(Position, Suche, Ziel)
    müsste der sein:

    VB.NET-Quellcode

    1. Position.IndexOf(Suche, Ziel)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Die korrekte Konvertieung sollte doch so sein oder ?

    VB.NET-Quellcode

    1. instr(Position, Suche, Ziel)
    2. 'zu
    3. Suche.indexof(Ziel, Position -1) +1


    Indexof fängt imho bei NULL (Position) und instr bei EINS an, somit ist auch das Ergebnis von indexof um EINS kleiner als bei instr ?



    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Mabbi schrieb:

    man lernt es nur wenn man es selber macht
    Und zwar Schritt für Schritt. Anstatt solch einen Ausdruck im gesamten konvertieren zu wollen, nimm einen Teilausdruck nach dem anderen und schau, was damit passiert. Nimm festgelegte Teststrings, bei denen Du die Sollantwort kennst und vergleiche mit dem was rauskommt. So erkennst Du viel besser, wo Du was durch PlusMinus 1 korrigieren musst. Und dann setz alle Puzzleteile zusammen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Mabbi Mach Dir ein neues Projekt mit dem VisualBasic-Namespace und probiere jeden Befehl einzeln aus.
    Eine Zeile alte Syntax, eine Zeile neue Syntax, wenn das Ergebnis gleich ist, sollte es stimmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!