Ist klug sowas mit VB.Net zu machen, oder muss SQL her?

zioProduct

Erfahrenes Mitglied
Erm ich glaube in VB.Net ist das so:

Code:
Dim pfad as String,

pfad = "c:\\taglist.xml"

Wichtig sind die \\, da er sonst einen Befehl ausführen will, wie \a für einen Alert, oder \n für New Line.

mfg
ziop
 

mage

Erfahrenes Mitglied
Vamp7771 hat gesagt.:
@ Norbert :
..
wie kann ich im Code z.B.: "c:\taglist.xml" als Pfad angeben, ich habe es mit dem "Application Startup...usw versucht, aber er macht das einfach nicht : (

Wenn Du den ApplicationStartup Pfad beim Testen verwendest, musst du darauf achten das die Datei auch im Debug Ordner vorhanden ist und nicht im Programmierungsverzeichnis. Du kannst beim Debugstart auch irgendwie einstellen, das er dir die Datei in Dein Debugverzeichnis kopiert.
 

Vamp7771

Mitglied
Hi, Folks!

Vielen Dank für eure wirklich guten Tipps!

Das @ Zeichen nimmt er leider nicht mehr in VB.Net, zumindestens maul er, es wäre ein ungültiges Zeichen.

Er schluckt aber nun endlich den Pfad, jedoch gibt er mir ganz am Ende des Codes eine Fehlermeldung raus

Hier erst mal der Aufruf zur "Translation"

Code:
 Translator.Filename("c:\\taglist.xml")
        MessageBox.Show(Translator.GetText("LIN" + "QTY" + "DTM" + "FTX" + "MOA" + "PRI" + "RFF" + "LOC" + "TAX"))

Hier der Code zur Translation:

Code:
Public Class Translator

    Private Shared translations As Hashtable
    Private Shared isOpen As Boolean = False
    Private Shared fname As String = Nothing

    Public Shared Sub Filename(ByVal name As String)

        name = "C:\\taglist.xml"
        name = fname
    End Sub
    Private Shared Sub ReadEntries()
        If fname <> Nothing Then
            translations = New Hashtable
            Dim doc As XmlDocument = New XmlDocument
            doc.Load(fname)
            Debug.WriteLine("Open File")
            Dim xnl As XmlNodeList = doc.SelectNodes("/edittaglist/tag")
            If Not xnl Is Nothing And xnl.Count > 0 Then
                Dim i As Integer
                Dim xn As XmlNode
                Dim att As XmlAttribute
                For i = 0 To i = xnl.Count
                    xn = xnl(i)
                    att = xn.Attributes(0)
                    If Not att Is Nothing Then
                        If Not translations.Contains(att.InnerText) Then
                            translations.Add(att.InnerText, xn.InnerText)
                        End If
                    End If
                Next
                isOpen = True
            End If
        End If
    End Sub

    Public Shared Function GetText(ByVal tag As String) As String
        If Not isOpen Then
            ReadEntries()
        End If
        Return translations(tag)    
End Function

End Class


Und hier nun die obligatorische Fehlermeldung: (Im Code ROT hinterlegt)

Code:
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Toyota Segemtierer.exe aufgetreten.

Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Das .xml File liegt unter C:\\ und hat den Namen "taglist.xml"

Im File sieht es so aus:

Code:
<xml version="1.0" encoding="utf-8" ?> 
<edittaglist>
  <tag short="LIN">Line item number</tag>
  <tag short="QTY">Quantity</tag>
  <tag short="DTM">Date/Time Period</tag>
  <tag short="FTX"><Free text/tag>
  <tag short="MOA">Monetary amount</tag>
  <tag short="PRI">Price Detail</tag>
  <tag short="RFF">Reference</tag>
  <tag short="LOC">Location</tag>
  <tag short="TAX">Tax</tag>  
</edittaglist>

Weiß jm wieso ich diese Fehlermeldung erhalte?
Anscheinend weiß er einfach nicht was er mir "returnen" soll, liege ich da richtig?

Vielen Dank für jeden, der sich das überhaupt durchliest : )

Euer (genau so gut wie ihr werden wollender) Vamp
 

zioProduct

Erfahrenes Mitglied
Falls ich ich irren sollte sorry, ansonsten:

Code:
 Private Shared fname As String = Nothing

    Public Shared Sub Filename(ByVal name As String)

        name = "C:\\taglist.xml"
        name = fname

Du setzte deinen Pfad als name, und gleich darauf überschreibste deinen Pfad mit Nothing= ReferenceNotSetNullException

fname = name ;)

Ist mir nur so auf den ersten Blick aufgefallen

so long
ziop
 

Christian Kusmanow

Erfahrenes Mitglied
Vamp7771 hat gesagt.:
Code:
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Toyota Segemtierer.exe aufgetreten.

Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Weiß jm wieso ich diese Fehlermeldung erhalte?
Ganz einfach, mach mal aus der Zeile
Code:
Return translations(tag)
eine Abfrage, daß wenn die Arraylist den String nicht enthält,
ein String.Empty oder besser ein "not found" zurückgegeben wird.

Wenn Du alle Entrys auf einmal anzeigen möchtest,
musst Du Sie erstmal nacheinander auslesen und in einem String zuwischenspeichern.
Danach kannst sie in der MsgBox ausgeben.
 

mage

Erfahrenes Mitglied
Du solltest in deinem Übersetzung Dictionary vorher prüfen, ob dein Element vorhanden ist:
If translations.Contains(tag) Then
 

Vamp7771

Mitglied
Danke !!

Jetzt hab ich meinen Code komplett überarbeitet und es geht nix mehr : )

Damn, ich glaube ich schreibe es komplett neu.

@ Tipp name=fname und dass ich den fname sofort danach auf "nothing" setze.

STIMMT! : ) Aber mache ich das auf die Logische Weise, sprich fname=name, dann bekomme ich Syntaxfehler im doc.load.

Ich weiß nicht mehr weiter.

der Code oben hat noch bis zum "Return translations(tag) funktioniert, der in meinem VB.Net macht gar nix mehr.

Hab mich glaube ich doch übernommen, mit meinen Newbie Kenntnissen.
 

Christian Kusmanow

Erfahrenes Mitglied
Wo ist jetzt das Problem?
Deine Exception wurde ausgelöst, weil die MesageBox keinen String zum Anzeigen bekommen hat,
da sich kein
Code:
"LIN" + "QTY" + "DTM" + "FTX" + "MOA" + "PRI" + "RFF" + "LOC" + "TAX"
in der Hashtable befindet (!)

Du solltest doch lediglich eine Abfrage aus der Zeile
Code:
Return translations(tag)
machen, in der Du mit translations.Contains(tag) prüfst ober der Entry überhaupt vorhanden ist.
Wenn nicht, musst Du mindestens ein String.Empty zurückgeben da dies von der Methode erwartet wird.
*Handschuheanzieh* :D
Code:
If translations.Contains(tag) Then
	Return translations(tag)
Else
	Return String.Empty
End If
*Handschuheauszieh* :D
(Ich hasse VB)
 

Vamp7771

Mitglied
Hm, ich habe es nun anderweilig gelöst, ich bin mir sicher eure Vorschläge waren bestimmt besser, aber für mich als Anfänger eben zu kompliziert und ich wollte / will nicht jeden Schritt mir von euch vorkauen müssen.

Ihr armen, bin euch echt soooo dankbar!

Ich habe nun einfach alle Kürzel in Excel File eingefügt, habe dieses als txt gespeichert und habe nun ein wunderschön sortiertes txt File, diese lese ich nun aus und mache die Translation per Streamreader / Writer.

Ich bin nun ca.50% mit dem Projekt fertig, aber bitte Topic noch offen lassen, ich bin mir sicher ich finde viel soooo viele Fragen.

Liebe Grüsse - Vamp
 

Neue Beiträge