Gruppen importieren

Diskussion, Fragen, Anregungen und Wünsche zu efa2

Moderatoren: nick, smg

Forumsregeln
Verfasse bitte die Beiträge in den passenden Kategorien und gib ihnen einen aussagekräftigen Betreff.
Antworte bitte nur zum Thema und beginne ein neues Thema, falls Du noch etwas Zusätzliches sagen möchtest.
Antworten
Stefan Schmidt
Beiträge: 200
Registriert: Do 30. Dez 2010, 11:09

Gruppen importieren

Beitrag von Stefan Schmidt » Do 22. Mai 2014, 14:28

Bei uns kommt langsam doch der Wunsch auf für bestimmte Ruderer und Boote Gruppen zu bestimmen, um die "missbräuchliche" Benutzung etwas zu regeln.
Da ich glaubte mich mit Excel und csv gut auszukennen, hab ich gedacht, erzeuge einige Gruppen und weise Mitglieder diesen Gruppen zu. Die Idee war zu Hause .csv-Import-Dateien zu bauen, die dann im Bootshaus schnell eingepflegt werden können.
Um zu sehen wie eine Import-Datei auszusehen hätte, erstmal eine csv Datei exportiert, nur beim Versuch "Text in Spalten" gehen alle Teilnehmer ab der 2.Position verloren.
Es sieht so aus, das der Feldtrenner | zwischen Gruppen-Name und erstem Teilnehmer nur einmal verwendet wird, die nächsten Teilnehmer in ein eigenen Zellen landen, somit anders getrennt wird.
Der Versuch alle Teilnehmer mit | zu trennen geht auch beim Import schief, es wird nur jeweils der erste Teilnehmer importiert.
Selbst ein Reimport bringt jeweils nur einen Teilnehmer zurück. Ich hatte eine Testgruppe mit drei Teilnehmern erzeugt, als csv. exportiert, die Gruppe gelöscht, und dann wieder importiert.
Somit sehe ich keine Regel, hier zu Fuß was zu basteln, oder mach ich was falsch?
Alternativen:
Eine .xml zu exportieren und darin zu editieren, ist wegen des Syntaxes riskant, Import geht aber. Außerdem ist mit Excel das kopieren von mehreren Datenfeldern gleichzeitig einfacher.
Ich finde auch keine Möglichkeit der Personendatei per Import bestimmten Personen eine oder mehrere Gruppen zuzuweisen. Da funktioniert csv-Import in der Regel einwandfrei.
Stefan

electria
Beiträge: 126
Registriert: Mi 11. Sep 2013, 10:56
Wohnort: Gelsenkirchen
Kontaktdaten:

Re: Gruppen importieren

Beitrag von electria » Do 22. Mai 2014, 15:03

Hi,
der Trenner zwischen Teilnehmer ist das Semikolon.

getestet und funktioniert: Gruppe als CSV exportieren mit Standardeinstellungen. Nutzer mit hinzufügen mit Trenner ";". Importieren mit Feldtrenner "|" und Texttrenner """, Import-Modus aktualisieren und beim aktualisieren aktualisieren.

@Nick: Beim Importieren mit der Option neuem Gültigkeitszeitraum erstellen meckert der bei mir rum das es schon einen Eintrag mit dem Namen gibt und der Name nicht eindeutig ist (Code 2).

Grüßle
Ralf

Stefan Schmidt
Beiträge: 200
Registriert: Do 30. Dez 2010, 11:09

Re: Gruppen importieren

Beitrag von Stefan Schmidt » Fr 23. Mai 2014, 11:08

Danke für den Hinweis, es geht sogar mit Excel, wenn man nicht auf die Idee kommt, "Text in Spalten" zu machen, sondern in die jeweils leeren Felder dahinter was einträgt. Alle Zellen auf max. Länge spreizen, dann sieht man das besser.
Dann am besten mit Nodepad++ kontrollieren ob der Syntax richtig ist. Excel erzeugt im csv teilweise zuviele ; und lässt auch mal am Schluss ein ; weg.
Also einfach zu handhaben ist das ja gerade nicht.
Stefan

electria
Beiträge: 126
Registriert: Mi 11. Sep 2013, 10:56
Wohnort: Gelsenkirchen
Kontaktdaten:

Re: Gruppen importieren

Beitrag von electria » Fr 23. Mai 2014, 11:20

schon, könnte ein wenig intuitiver sein. Du musst ja auch nur eine Gruppe importieren, welches das ganze ein wenig vereinfacht. Du kannst auch in Excel die ganzen Personennamen als eine einzelne CSV-Datei erstellen und mit Semikolon exportieren, danach mit einem Texteditor das CSV in die groups.csv anhängen, so musst du nicht so sehr auf die Trenner achten, weil ja mindestens zwischen Gruppennamen und Personennamen eine Pipe gehört, während die Personennamen mit Semikolon getrennt sind.

Grüßle
Ralf

iww-martin
Beiträge: 268
Registriert: Fr 24. Feb 2012, 15:42
Wohnort: Itzehoe
Kontaktdaten:

xml-Import: Excel-Makro erstellt xml-Struktur für Import

Beitrag von iww-martin » Fr 23. Mai 2014, 11:28

Hi,

csv-Dateien sind bei der Bearbeitung mit Excel nicht unproblematisch. Nach dem Öffnen einer csv-Datei wird automatisch - nach den Einstellungen des Standard-Trennsymbols - versucht, die Daten in Spalten aufzuteilen. Außerdem finden automatische Datentyp-Konvertierungen statt, bei denen schon mal Daten ungewünscht verändert werden können. Dabei verliert schnell mal eine Postleitzahl oder Mitgliedsnummer eine führende Null, weil der Wert wie eine Zahl aussieht und zu einem Zahlwert umgewandelt wird... :(

Es gibt die Möglichlichkeit, xml-Dateien zu exportieren und zu importieren und ich erstelle für Imports aus Excel-Tabellen mit einem Makro xml-Dokumente.
Das hat viele Vorteile und funktioniert großartig! ;)

So kann man die komfortable Datenpflege in Excel nutzen und geht den Problemen mit csv-Dateien aus dem Weg.

Hier ein einfaches Beispiel für so ein Makro zum Import von "Mannschaften".

Das zugehörige Excel-Arbeitsblatt enthält zwei Spalten...

In Zeile 6 stehen die Bezeichner der xml-Elemente...
Zelle [A6] = Name
Zelle [B6] = Crew1Id

Zeile 7 zeigte beispielhafte Mustereinträge
Zelle [A7] = Lööft jot (Max Mustermann)
Zelle [B7] = Mustermann, Max

In Zeile 8 stehen Spaltenüberschriften (mit einem Autofilter, um die zu importierende Auswahl ggf. einzugrenzen)...
Zelle [A8] = Mannschaftname
Zelle [B8] = Mannschaft 1

Ab Zeile 9 stehen die Daten...
Zelle [A9] = Speedy (Karl Muster)
Zelle [B9] = Muster, Karl

Zum Ausprobieren einfach mal diese 8 Attribute in ein Excel-Datenblatt eingeben. Muss die Mannschaft größer sein, können weitere Spalten Crew2Id, Crew3Id, Crew4Id, ... hinzugefügt werden.

Die Daten werden mit dem folgenden Makro aufbereitet:

Code: Alles auswählen

' Funktion für Zeilumbrüche in Textaugaben
Function CrLf(Anzahl As Integer) As String
  s = ""
  n = 1
  While (n <= Anzahl)
    s = s + Chr(13) + Chr(10)
    n = n + 1
  Wend
  CrLf = s
  Exit Function
End Function

Sub crews_xml()

  Dim Param(200)
  
  ' Arrays zur Maskierung von Sonderzeichen in der xml-Importdatei
  SearchFor = Array("&", "<", ">", Chr(34))
  ReplaceWith = Array("&", "<", ">", """)
  
  ' Bildschirmausgabe unterdrücken
  Application.ScreenUpdating = False

  i = 1
  
  ' Einlesen der xml-Elemente 
  Range("A6").Activate
  
  While (ActiveCell.Value <> "")
    Param(i) = ActiveCell.Value
    ActiveCell.Offset(0, 1).Activate
    i = i + 1
  Wend
  
  ' Anzahl der xml-Elemente...
  nMaxElements = i - 1
   
  ' Ausgabedatei
  sFilename = ActiveWorkbook.Path + "\crews.xml"
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set f = fs.CreateTextFile(sFilename, True, False)

  ' xml-Header in Ausgabedate schreiben...
  f.WriteLine "<?xml version=" + Chr(34) + "1.0" + Chr(34) + " encoding=" + Chr(34) + "ISO-8859-1" + Chr(34) + "?>"
  f.WriteLine "<export type=" + Chr(34) + "text" + Chr(34) + ">"
  
  ' Verarbeitung der Datenzeilen
  Range("A9").Activate
  
  nAnzahl = 0
  bFilteredRows = False
  
  While (ActiveCell.Offset(0, 1).Value <> "")
    ' Durch einen Autofilter ausgeblendete Zeilen haben eine Zeilenhöhe von 0
    ' Die folgende if-Anweisung berücksichtigt nur Zeilen aus der Ergebnismenge eines Autofilters!
    If ActiveCell.Rows.Height > 0 Then
      i = 1
      f.Write "<Record>"
      While (i <= nMaxElements)
        
        xmlTag = "<" + Param(i) + ">"
        xmlEndTag = "</" + Param(i) + ">"
        
        Select Case Param(i)
          '  Hier werden ggf. Sonderfälle korrekt formatiert oder leere Elemente unterdrückt. Hier gezeigt am Beispiel eines Elements Birthday (z.B. in Personendaten) , dass als Datum formatiert wird...
          ' Case "Birthday"
          '  f.Write xmlTag + Format(ActiveCell.Value, "dd.mm.yyyy") + xmlEndTag
          ' Case "xxx"
          ' 
          Case Else
            If (ActiveCell.Value <> "") Then
              ' Sonderzeichen maskieren...
              sAttribut = CStr(ActiveCell.Value)
              j = LBound(SearchFor)
              While (j <= UBound(SearchFor))
                If (InStr(1, sAttribut, SearchFor(j)) > 0) Then
                  sAttribut = Replace(sAttribut, SearchFor(j), ReplaceWith(j))
                End If
                j = j + 1
              Wend 'j < UBound(SearchFor)
              f.Write xmlTag + sAttribut + xmlEndTag
            End If
        End Select
        
        ActiveCell.Offset(0, 1).Activate
        i = i + 1

      Wend
      f.WriteLine "</Record>"
      ActiveCell.Offset(1, -nMaxAttributes).Activate
      nAnzahl = nAnzahl + 1
    Else
      ' es gibt ausgefilterte Zeilen
      bFilteredRows = True
      ' nächste Datenzeile
      ActiveCell.Offset(1, 0).Activate
    End If
  Wend

  f.WriteLine "</export>"
  
  ' Ausgabedatei schließen...  
  f.Close
  
  ' Setze den Cursor wieder auf die Ausgangzelle zurück...
  Range("A6").Activate
  
  ' Bildschirmausgabe aktivieren
  Application.ScreenUpdating = True
  
  MsgText = "Parameter für " + Str(nAnzahl) + " Mannschaften wurden verarbeitet." _
        + CrLf(2) _
        + "Die Importdatei" _
        + CrLf(2) _
        + sFilename _
        + CrLf(2) _
        + "wurde erfolgreich erstellt."
        
  If bFilteredRows Then
    MsgText = MsgText + CrLf(2) _
                      + "Es wurden nur die Zeilen aus der Ergebnismenge des Autofilters berücksichtigt!"
  End If

  msg = MsgBox(MsgText, _
        vbOKOnly, _
        "Itzehoer Wasser-Wanderer e.V. - Importdatei (xml) für Mannschaften erstellen...")
   
End Sub
Das Beispiel kann leicht für andere Importformate angepasst werden, wenn man als Muster zuvor Datensätze in eine xml-Datei exportiert.
Das Makro liest der Reihe nach alle xml-Elemente in Zeile 6 - egal ob 2 oder 35 oder mehr - und verarbeitet die zugehörigen Datenzeilen...

Imports sollten zuerst einmal auf einer Testinstallation ausprobiert werden, da man ggf. in der Excel-Tabelle leere Attribute mit einem Standardwert belegen muss oder ein leeres Attribut nicht mit übergeben darf.
Die aussagefähigen Warnungen und Fehlermeldungen beim Import helfen sehr gut, um diese Sonderfälle in Abhängigkeit vom bezeichner des xml-Elemets in der o.g. Case-Anweisung zu lösen.

Wir verwenden solche Excel-Dateien u.a. für den xml-Import von Personen, Booten, Mannschaften und vor allem zum Import von Fahrtenbucheinträgen nach mehrtägigen Vereinsfahrten mit vielen Teilnehmer/innen.

Viele Grüße
Martin

Itzehoer Wasser-Wanderer e.V.

Stefan Schmidt
Beiträge: 200
Registriert: Do 30. Dez 2010, 11:09

Re: Gruppen importieren

Beitrag von Stefan Schmidt » Sa 24. Mai 2014, 12:09

Herzlichen Dank für den Lehrgang für Exzel/xml Programmierung. Ich hoffe dass hilft auch anderen. Ich warte aber erst mal ab, was sich unsere werte Sportleitung in Sachen Gruppen ausdenkt.
Dann komm ich gerne wieder drauf zurück.
Stefan

Antworten