| |
VB.NET - FortgeschritteneProgramm Code Abgleich XLS | | | Autor: ERBRU | Datum: 29.05.17 08:26 |
| Guten Morgen zusammen,
habe folgendes vor:
1. eine xls Liste in ein "Formular" Tabelle einlesen
2. über eine Form "Suchen" eines bestimmten Feldes nach bestimmten Zeichen (7 Zeichen)
und abgleichen wenn vorhanden soll der Fund markiert werden und mit Bemerkung gespeichert werden
3. ggf. soll so eine erstellte Liste noch gedruckt werden
die xls hat 7 Spalten A-G
IDNr = Typ decimal
IDNrX = Typ String
ZSBNr = Typ String
A13-2E = Typ Integer
A13-2B = Typ Integer
Zeit = DateTime
4. mittels Scanner siehe Punkt 2 Suchen markieren (der Code ist ein 3D-Matrix) Code der gescannt werden soll
das soll eine kleine Windows Application werden | |
Re: Programm Code Abgleich XLS | | | Autor: Manfred X | Datum: 29.05.17 11:09 |
| Hallo!
Wir wissen jetzt, was Du planst. Danke für diese Information. | |
Re: Programm Code Abgleich XLS | | | Autor: ERBRU | Datum: 29.05.17 12:55 |
| OK habe verstanden, wer hat da Lust das mit mir anzugehen umzusetzen? | |
Re: Programm Code Abgleich XLS | | | Autor: ERBRU | Datum: 29.05.17 13:56 |
| Hallo Manfred,
jetzt habe ich zunächst mittels Code eine xlsx eingelesen in ein DGV
wenn da Optimierungspotenzial besteht, nehme ich das Dankend an.
Private Sub openFileDialog1_FileOk(sender As Object, e As _
System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
Dim filePath As String = OpenFileDialog1.FileName
Dim extension As String = Path.GetExtension(filePath)
Dim header As String = If(rbHeaderYes.Checked, "YES", "NO")
Dim conStr As String, sheetName As String
conStr = String.Empty
Select Case extension
Case ".xls"
'Excel 97-03
conStr = String.Format(Excel03ConString, filePath, header)
Exit Select
Case ".xlsx"
'Excel 07
conStr = String.Format(Excel07ConString, filePath, header)
Exit Select
End Select
'Get the name of the First Sheet.
Using con As New OleDbConnection(conStr)
Using cmd As New OleDbCommand()
cmd.Connection = con
con.Open()
Dim dtExcelSchema As DataTable = con.GetOleDbSchemaTable( _
OleDbSchemaGuid.Tables, Nothing)
sheetName = dtExcelSchema.Rows(0)("TABLE_NAME").ToString()
con.Close()
End Using
End Using
'Read Data from the First Sheet.
Using con As New OleDbConnection(conStr)
Using cmd As New OleDbCommand()
Using oda As New OleDbDataAdapter()
Dim dt As New DataTable()
cmd.CommandText = (Convert.ToString("SELECT * From [") & _
sheetName) + "]"
cmd.Connection = con
con.Open()
oda.SelectCommand = cmd
oda.Fill(dt)
con.Close()
'Populate DataGridView.
dataGridView1.DataSource = dt
End Using
End Using
End Using
End Sub Ergebnis:
2017050000000 AHEF2ND 5N0512011BS 1 1 15.05.2017 14:00:35
2017050000000 AHEF2NE 5N0512011BS 1 1 15.05.2017 14:00:35
2017050000000 AHEF2NH 5N0512011BS 1 1 15.05.2017 14:01:15
2017050000000 AHEF2NI 5N0512011BS 1 1 15.05.2017 14:01:15 nun soll die 2 Spalte mittels "Eingabe" TextBox durchsucht werden ist die entsprechende Eingabe vorhanden
soll der Fund farblich gekennzeichnet werden (rot) zum Beispiel
die nächste Eingabe soll in der gleichen Spalte suchen nicht vorhanden soll eine Meldung aufpopen nicht vorhanden. Wenn doch vorhanden dann auch den Fund kennzeichnen (rot)
es muss dieser Status gespeichert werden können so das man später das evtl. nach xlsx exportiert
aber mit Kennzeichnung. Ist das so möglich? und wie ?
Beitrag wurde zuletzt am 29.05.17 um 13:59:24 editiert. | |
Re: Programm Code Abgleich XLS | | | Autor: Manfred X | Datum: 29.05.17 17:00 |
| Hallo!
In VB.Net sind Auflistungen null-basierend indiziert.
In Deinem Beispiel enthält die Spalte 2 (ab 0 gezählt) stets den gleichen Eintrag: 5N0512011BS
Wen Du eine Suche nach Datensätzen anhand des Cell-Contents einer oder mehrerer Spalten
durchführen willst, verwende eine Bindingsource zum Filtern der Daten.
Wie willst Du die Markierungen gestalten, wenn vom User mehrere Suchen hintereinander
durchgeführt werden?
Am einfachsten wird es sein, Du speicherst alle eingegebenen Such-Werte als Liste und
bearbeitest sie beim Rückspeichern in Excel (als XLS(X)-Format).
Wie Du diese Liste beim Speichern verwenden willst, dafür gibt es diverse Möglichkeiten
(zusätzliche Markerspalte, einheitliche oder verschiedenartige Farbmarkierung der Zellen,
Entfernen der Zell-Werte oder der betroffenen Datenzeile usw.) | |
Re: Programm Code Abgleich XLS | | | Autor: ERBRU | Datum: 29.05.17 17:47 |
| Wie willst Du die Markierungen gestalten, wenn vom User mehrere Suchen hintereinander
durchgeführt werden? na ja es sollte eine Meldung erfolgen und die Stelle des Fundes Rot markieren
weitersuchen oder Neue Suche
dieser Vorschlag gefällt mir.
Am einfachsten wird es sein, Du speicherst alle eingegebenen Such-Werte als Liste und
gehst du das mit mir an?
meine Suche will schon mal nicht
tbx_Eingabe_Feld.Text = tbx_Eingabe_Feld.Text.Trim
Dim strSuchwort = tbx_Eingabe_Feld.Text
'Pflichtfeld prüfen
If String.IsNullOrEmpty(strSuchwort) Then : Fehler_Pflichtfeld_Eingabe( _
"Eingabe:") : Return : End If
'Suchen in DGV
Dim searchIndex = 0
DataGridView1.ClearSelection()
For Each row As DataGridViewRow In DataGridView1.Rows
For Each cell As DataGridViewCell In row.Cells
If cell.Value.StartsWith(strSuchwort, _
StringComparison.InvariantCultureIgnoreCase) Then
cell.Selected = True
DataGridView1.CurrentCell = DataGridView1.SelectedCells(1)
'Exit For
End If
Next
Next
DataGridView1.Visible = True da passiert nichts | |
Re: Programm Code Abgleich XLS | | | Autor: Manfred X | Datum: 29.05.17 18:28 |
| Welche Art von "Suche" soll das werden?
- Durch Betätigung einer Funktionstaste den Zellcursor durch die
Zellen, deren Content dem Suchbegriff entspricht, bewegen.
- Alle Zellen, deren Content einem Suchbegriff entspricht, markieren
dauerhaft oder temporär
- Alle Zeilen, deren Content in der Suchspalte dem Suchbegriff entspricht,
markieren
- Alle Zeilen filtern, deren Content in ....
Es gibt weitere Varianten einer "Suche in Spalte" (Zeilen aussondern/-kopieren, ...)
Und wie sollen Suchergebnisse gespeichert werden?
Wie sollen verschiedene Suchergebnisse im Control markiert werden?
Deine bisherigen Angaben kombinieren verschiedene Such-Varianten
(z.B. Cursor bewegen, Markieren). Das funktioniert nicht. | |
Re: Programm Code Abgleich XLS | | | Autor: ERBRU | Datum: 29.05.17 18:43 |
| Danke die Fragen beantworte ich so:
- Alle Zeilen, deren Content in der Suchspalte dem Suchbegriff entspricht,
dauerhaft markieren
Und wie sollen Suchergebnisse gespeichert werden?
in eine Tabelle mit Namen "N.i.O - Fund" wäre ein Vorschlag so das die wiederrum in eine DGV angezeigt wird.
Wie sollen verschiedene Suchergebnisse im Control markiert werden?
evtl. geht es ja so: eine Auswertungsspalte Type boolean die den Fund wiedergibt könnte man dann sogar filtern und sich eine Zusätzliche Speicherung sparen.
Anmerkung: die Suche über ein Eingabefeld darf 7 Zeichen haben nicht weniger bzw. mehr
hoffe verstehst meine Art hier zu formulieren | |
Re: Programm Code Abgleich XLS | | | Autor: Manfred X | Datum: 29.05.17 19:18 |
| Naja. Die Frage bleibt offen, wie die Ergebnisse mehrerer Suchen
miteinander kombiniert werden sollen (falls das erforderlich ist).
Prinzipielles Vorgehen:
Mit LINQ-Aggregate-Count abfragen, wie viele Datensätze dem
aktuellen Suchbegriff entsprechen.
Falls keine Datensätze gefunden werden, erfolgt eine Meldung.
Sonst wird der Suchtext in einer List(of String) angehängt,
falls dort noch nicht vorhanden.
Im "CellPainting"-Event des Datagridview-Control wird geprüft, ob die
aktuell zu zeichnende Zelle zur "kritischen" Spalte gehört und einen
der in der Liste gespeicherten Suchbegriffe enthält.
In dem Fall wird der Hintergrund in der Markierfarbe gezeichnet,
sonst Normal (weiß).
Um das Eingabefeld der Suche in der Länge zu begrenzen, kann man eine
MaskedTextbox verwenden (und dort auch genaue Formatangaben vorgeben)
oder eine gewöhnliche Textbox, bei der z.B. im Keydown-Event geprüft wird,
ob die Länge der Text-Eigenschaft überschritten ist. | |
Re: Programm Code Abgleich XLS | | | Autor: ERBRU | Datum: 29.05.17 19:31 |
| die offene Frage werde ich noch beantworten.
evtl. hilfst mir dabei, die Linq-Abfrage zum Beispiel oder zunächst eine Struktur zu erhalten
hier mal einige Daten aus der xls Datei
"Suchen markieren"
2017050000000 AHEF2ND 5N0512011BS 1 1 15.05.2017 14:00:35
2017050000000 AHEF2NE 5N0512011BS 1 1 15.05.2017 14:00:35
2017050000000 AHEF2NH 5N0512011BS 1 1 15.05.2017 14:01:15
2017050000000 AHEF2NI 5N0512011BS 1 1 15.05.2017 14:01:15
2017050000000 AHEF2NL 5N0512011BS 1 1 15.05.2017 14:01:51
2017050000000 AHEF2NM 5N0512011BS 1 1 15.05.2017 14:01:51
2017050000000 AHEF2NP 5N0512011BS 1 1 15.05.2017 14:02:30
2017050000000 AHEF2NQ 5N0512011BS 1 1 15.05.2017 14:02:30
2017050000000 AHEF2NT 5N0512011BS 1 1 15.05.2017 14:03:09
2017050000000 AHEF2NU 5N0512011BS 1 1 15.05.2017 14:03:09
2017050000000 AHEF2NX 5N0512011BS 1 1 15.05.2017 14:03:46
2017050000000 AHEF2NY 5N0512011BS 1 1 15.05.2017 14:03:46
2017050000000 AHEF2O1 5N0512011BS 1 1 15.05.2017 14:04:14
2017050000000 AHEF2O2 5N0512011BS 1 1 15.05.2017 14:04:14
2017050000000 AHEF2O5 5N0512011BS 1 1 15.05.2017 14:04:44
2017050000000 AHEF2O6 5N0512011BS 1 1 15.05.2017 14:04:44
2017050000000 AHEF2O9 5N0512011BS 1 1 15.05.2017 14:05:20
2017050000000 AHEF2OA 5N0512011BS 1 1 15.05.2017 14:05:20
2017050000000 AHEF2OD 5N0512011BS 1 1 15.05.2017 14:05:57
2017050000000 AHEF2OE 5N0512011BS 1 1 15.05.2017 14:05:57
2017050000000 AHEF2OH 5N0512011BS 1 1 15.05.2017 14:06:46
2017050000000 AHEF2OI 5N0512011BS 1 1 15.05.2017 14:06:46
2017050000000 AHEF2OL 5N0512011BS 1 1 15.05.2017 14:07:24
2017050000000 AHEF2OM 5N0512011BS 1 1 15.05.2017 14:07:24
2017050000000 AHEF2OP 5N0512011BS 1 1 15.05.2017 14:09:24
2017050000000 AHEF2OQ 5N0512011BS 1 1 15.05.2017 14:09:24
2017050000000 AHEF2OT 5N0512011BS 1 1 15.05.2017 14:09:51
2017050000000 AHEF2OU 5N0512011BS 1 1 15.05.2017 14:09:51
2017050000000 AHEF2OX 5N0512011BS 1 1 15.05.2017 14:10:17
2017050000000 AHEF2OY 5N0512011BS 1 1 15.05.2017 14:10:17 | |
Beispiel für Suchen/Markieren | | | Autor: Manfred X | Datum: 29.05.17 20:46 |
| Public Class frmMultiSearch
Dim WithEvents mtbo As New MaskedTextBox With _
{.Parent = Me, .Width = 80}
Dim dt As New DataTable
Dim bs As New BindingSource
Dim WithEvents dgv As New DataGridView With _
{.Parent = Me, .Size = New Size(400, 400), .Top = 50, _
.DataSource = bs, _
.AllowUserToAddRows = False}
Dim search_columnindex As Integer = 1 'Die kritische Spalte
Dim searchlist As New List(Of String) 'Liste der Suchbegriffe
Private Sub frmMultiSearch_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.Size = New Size(450, 500)
mtbo.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
mtbo.Mask = ">LLLL0LL" 'Eingabemaske für Suchstring
'Die oben gegebenen Daten irgendwie in die Datatable .....
For i As Integer = 0 To 4
dt.Columns.Add("SP_" & CStr(i))
Next i
Dim lines() As String = IO.File.ReadAllLines("C:\daten\ex_xls.txt")
For Each line As String In lines
Dim fields() As String = line.Split(" "c)
Dim k As Integer = -1
Dim row As DataRow = dt.NewRow
For Each field As String In fields
If Not field.Trim = "" AndAlso k < 4 Then
k += 1
row(k) = field
End If
Next
dt.Rows.Add(row)
Next
bs.DataSource = dt
End Sub
Private Sub mtbo_KeyDown(sender As Object, _
e As System.Windows.Forms.KeyEventArgs) Handles mtbo.KeyDown
If e.KeyCode = Keys.Return Then
If Not mtbo.MaskFull Then
Dim ret As MsgBoxResult = _
MsgBox("Keine vollständige Such-Eingabe", _
MsgBoxStyle.OkCancel)
If ret = MsgBoxResult.Cancel Then Exit Sub
End If
'Anzahl der gefundenen Zeilen (incl. bereits markierte)
Dim row_found As Integer = _
Aggregate row As DataRow In dt.AsEnumerable _
Where row(search_columnindex).ToString.StartsWith( _
mtbo.Text) _
Into Count()
MsgBox(row_found.ToString & " Zeilen gefunden")
If row_found > 0 AndAlso Not searchlist.Contains(mtbo.Text) Then
searchlist.Add(mtbo.Text)
dgv.InvalidateColumn(search_columnindex)
End If
End If
End Sub
Private Sub dgv_CellPainting(sender As Object, _
e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
Handles dgv.CellPainting
If e.RowIndex = -1 Or e.ColumnIndex = -1 Then Exit Sub
Dim vl As String = _
dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString
'Entspricht der Zellwert einem Suchbegriff (Startswith)
Dim searched As Boolean
For i As Integer = 0 To searchlist.Count - 1
searched = vl.StartsWith(searchlist(i))
If searched Then Exit For
Next i
If searched Then
'Zelle gelb markieren
Using bry As New SolidBrush(Color.Yellow)
e.Graphics.FillRectangle(bry, e.CellBounds)
End Using
e.Paint(e.CellBounds, DataGridViewPaintParts.Border)
e.Paint(e.CellBounds, DataGridViewPaintParts.ContentForeground)
e.Handled = True
End If
End Sub
End Class
Beitrag wurde zuletzt am 29.05.17 um 20:52:19 editiert. | |
Re: Beispiel für Suchen/Markieren | | | Autor: Manfred X | Datum: 29.05.17 21:40 |
| Ergänzung zum "CellPainting"-Event:
Der Code sollte natürlich so beginnen ...
If e.RowIndex = -1 Or e.ColumnIndex = -1 Then Exit Sub
If Not e.ColumnIndex = search_columnindex Then Exit Sub
If IsDBNull(dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) Then Exit Sub | |
Re: Beispiel für Suchen/Markieren | | | Autor: ERBRU | Datum: 29.05.17 21:51 |
| Danke!
ich melde mich Morgen noch mal da will etwas nicht funktionieren
einlesen der xls Datei klappt nicht wie es soll | |
Re: Beispiel für Suchen/Markieren | | | Autor: ERBRU | Datum: 30.05.17 09:14 |
| Hallo Manfred X,
Danke dir für die tolle Hilfe. Das funktioniert soweit
Aber ich möchte (muss)die xls einlesen können, per Button.
geht das im Grunde auch? wie?
For i As Integer = 0 To 4
dt.Columns.Add("SP_" & CStr(i))
Next i
Dim lines() As String = IO.File.ReadAllLines( _
"D:\Sperrlisten\ex_xls.txt")
For Each line As String In lines
Dim fields() As String = line.Split(" "c)
Dim k As Integer = -1
Dim row As DataRow = dt.NewRow
For Each field As String In fields
If Not field.Trim = "" AndAlso k < 4 Then
k += 1
row(k) = field
End If
Next
dt.Rows.Add(row)
Next | |
Re: Beispiel für Suchen/Markieren | | | Autor: Manfred X | Datum: 30.05.17 09:32 |
| Wieso programmierst Du nicht direkt in Excel ein geeignetes Suchformular?
Eine Möglichkeit, von VB-Net direkt auf Excel-Tabellen zuzugreifen, ist die
Excel-Automatisierung (Verweis auf Microsoft Excel bzw. On the fly).
Es gibt auch "Visual Studio Tools for Office".
https://www.visualstudio.com/vs/office-tools
Ein einfacher Weg ist der Export des Inhalts der Excel-Tabelle als
CSV-Datei und das Einlesen dieser Datei in VB.Net. | |
Re: Beispiel für Suchen/Markieren | | | Autor: ERBRU | Datum: 30.05.17 15:40 |
| Nun habe ich noch eine Frage Manfred X
ich lese so um die 5000 Zeilen ein die nun gefundenen und markierten Cellen möchte ich die Anzahl in einem Label anzeigen und von den 5000 verbleibenen Suche abziehen
also: 5000 Datensätze zum prüfen 3 gefunden + markiert = 4997 "Codes noch zu prüfen"
kannst du mir folgen?
PS die msb Maske lässt ab der 5 Stelle keine Zahlen zu?
bis dahin OK
AHEF2_
hätte aber so eingeben wollen, geht leider nicht?
AHEF202 | |
Re: Beispiel für Suchen/Markieren | | | Autor: Manfred X | Datum: 30.05.17 17:54 |
| In der "Mask"-Eigenschaft der MaskedTextbox kann für jede Input-Position
eine Einschränkung gesetzt werden. Die MSDN-Dokumentation dieser Eigenschaft
beschreibt die entsprechenden Möglichkeiten (z.B. L=Buchstabe 0=Ziffer usw).
Ich hatte bereits mehrfach gefragt, wie die Suchen zu kombinieren sind.
Bis jetzt habe ich keine Antwort erhalten.
Wieviele "Codes noch zu prüfen" sind??
Keine Ahnung was das bedeuten könnte ... | |
Re: Beispiel für Suchen/Markieren | | | Autor: ERBRU | Datum: 30.05.17 19:23 |
| Danke die Eigenschaften werde ich mir mal anschauen.
Sorry, doch es kann durchaus Kombinationen geben aus Zahlen und Buchstaben
oder Buchstaben und Zahlen
wieviele codes noch zu prüfen sind?
nehmen wir an diese 14 Zeilen wurden eingelesen
in SP_1 werden 2 Strings gefunden und markiert das bedeutet in der Liste 2 NIO gefunden
das soll gezählt werden (Rest 12 noch zu prüfen)
die SP_5 ist eine Spalte wird beim einlesen aber als 2 Spalten behandelt?
die SP_3 und SP_4 werden in die SP_2 angehängt. hier habe ich das mal manuell gerichtet
es sind eigentlich 6 Spalten
SP_0 SP_1 SP_2 SP_3 SP_4 SP_5
2.02E+12 AHEF2ND 5N0512011BS 1 1 15.05.2017 14:00:35
2.02E+12 AHEF2NE 5N0512011BS 1 1 15.05.2017 14:00:35
2.02E+12 AHEF2NH 5N0512011BS 1 1 15.05.2017 14:01:15
2.02E+12 AHEF2NI 5N0512011BS 1 1 15.05.2017 14:01:15
2.02E+12 AHEF2NL 5N0512011BS 1 1 15.05.2017 14:01:51
2.02E+12 AHEF2NM 5N0512011BS 1 1 15.05.2017 14:01:51
2.02E+12 AHEF2NP 5N0512011BS 1 1 15.05.2017 14:02:30
2.02E+12 AHEF2NQ 5N0512011BS 1 1 15.05.2017 14:02:30
2.02E+12 AHEF2NT 5N0512011BS 1 1 15.05.2017 14:03:09
2.02E+12 AHEF2NU 5N0512011BS 1 1 15.05.2017 14:03:09
2.02E+12 AHEF2NX 5N0512011BS 1 1 15.05.2017 14:03:46
2.02E+12 AHEF2NY 5N0512011BS 1 1 15.05.2017 14:03:46
2.02E+12 AHEF2O1 5N0512011BS 1 1 15.05.2017 14:04:14
2.02E+12 AHEF2O2 5N0512011BS 1 1 15.05.2017 14:04:14 | |
Re: Programm Code Abgleich XLS | | | Autor: ERBRU | Datum: 02.06.17 12:29 |
| Hallo Manfred X,
bist du da?
habe noch die eine oder andere Frage zum Thema:
wie kann ich da noch zusätzlich eine Checkbox true setzen wenn Suchwort markiert wurde und in den Sichtbereich der DGV holen (selektieren)?
Private Sub DGV_Excel1_CellPainting(sender As Object, _
e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
Handles DGV_Excel1.CellPainting
If e.RowIndex = -1 Or e.ColumnIndex = -1 Then Exit Sub
If Not e.ColumnIndex = search_columnindex Then Exit Sub
If IsDBNull(DGV_Excel1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) _
Then Exit Sub
Dim vl As String = _
DGV_Excel1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString
'Entspricht der Zellwert einem Suchbegriff (Startswith)
Dim searched As Boolean
For i As Integer = 0 To searchlist.Count - 1
searched = vl.StartsWith(searchlist(i))
If searched Then Exit For
Next i
If searched Then
'Zelle gelb markieren und eine DGV-Checkbox true stempeln
Using bry As New SolidBrush(Color.Yellow)
e.Graphics.FillRectangle(bry, e.CellBounds)
End Using
e.Paint(e.CellBounds, DataGridViewPaintParts.Border)
e.Paint(e.CellBounds, DataGridViewPaintParts.ContentForeground)
e.Handled = True
End If
End Sub | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|