Toon posts:

[VB.NET] Dynamische tabel(Chart), Layout hulp nodig.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mede-tweakers,

Tijdens mijn stage als systeembeheerder kom ik natuurlijk in aanraking met automatisering. Hier is mij gevraagd om van alle werkstation's in het netwerk(+/- 250 st.) bepaalde informatie op te halen en weer te geven in een Tabel/Chart.

Zelf heb ik al wel wat ervaring met Visual basic and het .Net Framework. Dit omdat ik eerst een gemengde studie volgde, zowel Systeembeheer & Applicatie ontwikkelaar.

De informatie die dient opgehaald te worden is het PC Model nummer & de bios versie. Het 'crawlen' van deze informatie wordt op de volgende manier gedraait. Tijdens het inloggen op elke werkplek wordt er een login script gedraaid. Hier een entry toegevoegd zodat mij applicatie, die op een netwerkshare staat waar iedereen toegang tot heeft & automatisch gemapt wordt tijdens het inloggen, gestart wordt.

Relevante code van de Client zijde.
Visual Basic .NET: Client zijde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
    Sub RetrieveInfo()
        Dim _PCName As String = My.Computer.Name
        Dim _Info As String = vbNullString
        Dim _FileName As String = "G:\BiosVersion\" & _PCName & ".txt"
        Dim _ManagmentC As New ManagementClass("Win32_ComputerSystem")
        Dim _Moc As ManagementObjectCollection = _ManagmentC.GetInstances

        For Each _Mo As ManagementObject In _Moc
            Dim Model() As String = Split(_Mo.Properties("Model").Value.ToString, " ")
            For i = 0 To Model.Length - 1
                If Model(i).ToLower.Contains("dc") Then _Info &= Model(i)
            Next
        Next

        _ManagmentC = New ManagementClass("win32_bios")
        _Moc = _ManagmentC.GetInstances
        For Each _Mo As ManagementObject In _Moc
            _Info &= "|" & _Mo.Properties("SMBIOSBIOSVersion").Value.ToString
        Next

        Try
            If IO.File.Exists(_FileName) Then
                IO.File.Delete(_FileName)
            End If
        Catch ex As IO.IOException
            _FileName = _FileName.Replace(_PCName, _PCName & "-" & New Random().Next(10, 10000))
        End Try

        IO.File.WriteAllText(_FileName, _Info)
    End Sub





Zoals je kunt zien/lezen/begrijpen wordt er op de Share een tekst file aangemaakt met als naam de pc naam: "PC1042". In dit tekst bestand wordt zowel het modelnummer(bijv: DC7900) als de bios versie(786G1 v01.16) weggeschreven met als scheidingsteken "|".

code: Inhoud tekstbestand
1
dc7900|786G1 v01.16


Deze informatie wordt dan weer door een (server)applicatie ingelezen & hier wordt een Tabel/Chart van gemaakt, althans dat ben ik aan het proberen.

Relevante code van de Server zijde
Visual Basic .NET: Server zijde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
    Sub CreateChart()
        Dim PCModels As New List(Of String)
        Dim BiosVersions As New List(Of String)
        Dim Files As IO.FileInfo() = New IO.DirectoryInfo(Path).GetFiles

        For Each File As IO.FileInfo In Files
            If File.Extension = ".txt" Then
                PCModels.Add(IO.File.ReadAllText(File.FullName).Split("|")(0))
                BiosVersions.Add(IO.File.ReadAllText(File.FullName).Split("|")(1))
            End If
        Next
        PCModels = RemoveDuplicates(PCModels)
        BiosVersions = RemoveDuplicates(BiosVersions)

        For i = 0 To chartBios.Series.Count - 1
            chartBios.Series.Remove(chartBios.Series.Item(i))
        Next

        Dim Dictionary As New Dictionary(Of String, Integer)
        For Each Version As String In BiosVersions
            Dim Count As Integer = 0
            For Each File As IO.FileInfo In Files
                If IO.File.ReadAllText(File.FullName).Split("|")(1).ToLower.Trim = Version.ToLower.Trim Then
                    Count += 1
                End If
            Next
            Dictionary.Add(Version, Count)
        Next

        For Each Model As String In PCModels
            chartBios.Series.Add(Model).ChartType = DataVisualization.Charting.SeriesChartType.Bar
            Dim c As Integer = 0
            For Each Entry As KeyValuePair(Of String, Integer) In Dictionary
                chartBios.Series(Model).Points.AddY(Entry.Value)
                chartBios.Series(Model).Points.Item(c).AxisLabel = Entry.Key
                c += 1
            Next
        Next
    End Sub


De applicatie geeft de volgende output:
Afbeeldingslocatie: http://img703.imageshack.us/img703/4739/chartbx.jpg

Van de pc's met versie 1.17 wordt zowel een DC7900 als een DC7700 weergeven, alleen heeft maar 1 van deze 2 pc's de versie 1.17.

De logica fout zit hem volgens mij hier:
code:
1
2
3
4
5
6
7
8
9
For Each Model As String In PCModels
      chartBios.Series.Add(Model).ChartType = DataVisualization.Charting.SeriesChartType.Bar
      Dim c As Integer = 0
      For Each Entry As KeyValuePair(Of String, Integer) In Dictionary
            chartBios.Series(Model).Points.AddY(Entry.Value)
            chartBios.Series(Model).Points.Item(c).AxisLabel = Entry.Key
            c += 1
      Next
Next


Omdat voor elke entry een point wordt toegekent ondanks het model.

Wat is uiteindelijk als resultaat wil is het volgende.
Afbeeldingslocatie: http://img607.imageshack.us/img607/4131/charteg.jpg

De vraag:
Is hier mijn hele opzet verkeerd of zie ik de logica niet.

Acties:
  • 0 Henk 'm!

  • BvDorp
  • Registratie: Januari 2004
  • Laatst online: 14-09 16:39
Ik heb nu drie keer je post gelezen en snap nog steeds je probleem / vraag niet. Kun je herformuleren?

En even uit-de-doos: is het niet makkelijker om een (SQ) DB neer te zetten, en dit script/applicatie naar deze DB te laten schrijven, onder vermelding van een unieke identifier als computernaam of desnoods MAC-adres? Er zijn nog wel 10 manieren mogelijk om dit te doen natuurlijk, maar dit is maar een idee.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Natuurlijk kan ik de vraag herformuleren. Ik wil in een tabel(chart) laten zien welke bios versie op een bepaald PC model staat en tevens hoe vaak deze combinatie voorkomt.

Het probleem is dat zoals je kunt zien in afbeelding 1, er een datapoint teveel wordt toegevoegd. Zowel een DC7700 als een DC7900 blijkt volgens de tabel te beschikken over versie 1.17. Dit is echter niet geval.

Vandaar ook de vraag "Is hier mijn hele opzet verkeerd of zie ik de logica niet.".

Ik ben ook opzoek naar zoiets als een Dictionary maar dan met 1 key & 2 waardes.

Over het even uit-de-doos: Dit in natuurlijk mogelijk maar waarom zou ik ? Er is inderdaad een beschikking over bijv. een iis-server waar op een nieuwe site kan worden aangemaakt. Aleen zie ik het nut er niet van. Behalve m.b.t. het oplossen van de Dictionary probleem/logica.

Alvast bedankt!!!!

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 11:50
Je voegt voor elk model computer alle punten toe aan de chart serie. Tussen regel 4 en 5 moet nog een check komen (of direct adhv de key de waarde uit de dictionary halen).

Edit: er zitten nog wel wat meer haken en ogen zie ik net. Je datastructuur is bijvoorbeeld ook niet helemaal handig.
Verwijderd schreef op maandag 12 december 2011 @ 16:09:
Ik ben ook opzoek naar zoiets als een Dictionary maar dan met 1 key & 2 waardes.
Een Dictionary<string, Dictionary<string, int>>?

[ Voor 55% gewijzigd door sig69 op 12-12-2011 23:13 ]

Roomba E5 te koop