Autor Thema: Export als csv  (Gelesen 7292 mal)

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Export als csv
« am: 21.08.14 - 11:51:56 »
Hallo zusammen,

zum Export einer Tabelle habe ich folgenden Agenten per LotusScript erstellt:

%REM
        Agent Export CCS
        Created 24.07.2014 by Jens/Firma/DE
        Description: Comments for Agent
%END REM
Option Public
Option Declare


Sub Initialize
        Dim ws As New NotesUIWorkspace
        Dim uiview As NotesUIView
        Dim view As NotesView
        Dim db As NotesDatabase
        Dim session As New NotesSession
        
        
        ' use the workspace to get the current view
        'Set uiview = ws.CurrentView  
        'Set view = uiview.View
        Set db = session.CurrentDatabase
        Set view = db.GetView( "CCSMA" )      
        
        Dim filenames As Variant
        
'Dim cn As Variant        
        
        ' Get filename from user using the current ViewName as the default file name
        filenames = ws.SaveFileDialog( _
        False,"File Name",, "C:\daten\", "Adressliste.csv")
        If Not(IsEmpty(filenames)) Then
                Call ViewCSVPrint (view, filenames(0) )
        End If
        
        
End Sub


Sub  ViewCSVPrint (view As NotesView, FileName As String )
        
        Dim fileNum As Integer  
        Dim entry As NotesViewEntry        
        Dim vc As NotesViewEntryCollection
        Dim rowstring As String        
        Dim cns As String
        
        fileNum% = FreeFile()
        Open filename For Output As fileNum%
        
        ' use the view column titles as the CSV headers
        ForAll c In view.Columns
                If cns = "" Then        
                        cns = c.title
                Else
                        cns = cns + +","  + c.title                  
                End If
        End ForAll                
        Print #fileNum%, cns
        
        
     ' now get and print the values for each row and column
        Set vc = view.AllEntries
        Set entry = vc.GetFirstEntry()
        While Not entry Is Nothing  
                rowstring = ""
                ForAll colval In entry.ColumnValues
                        If rowstring = "" Then
                                rowstring = colval
                        Else
                                rowstring = rowstring + +","  + colval
                        End If                        
                End ForAll
                Print #fileNum%, rowstring
                Set entry = vc.GetNextEntry(entry)
        Wend
        Close fileNum%
        
        
End Sub


Problem:
Bei Mehrfachwerten in Feldern werden diese durch ein Komma getrennt. Damit wird die Struktur beim Öffnen der CSV z.B. mit Excel zerschossen.

Wie kann ich das Script ändern, so dass ein anderes Symbol bei Mehrfachwerten mitgegeben wird?

Vorab vielen Dank.

Gruß

Jens
« Letzte Änderung: 22.08.14 - 10:46:50 von Jens82 »

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #1 am: 21.08.14 - 12:00:16 »
Hi Jens,

wie wäre es wenn Du colval auf "," untersuchst und durch ein beliebiges Zeichen Deiner Wahl ersetzt?

Thema wäre besser im Entwicklungsforum untergebracht ;)

Bye,
Markus
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #2 am: 21.08.14 - 12:41:38 »
Hi Markus,

danke für die Antwort.

Wie könnte ich so etwas denn anstellen?

Viele Grüße

Jens

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #3 am: 21.08.14 - 12:58:59 »
Ich hab mal vor ewiger Zeit folgende Funktion gefunden. Ich hab zwar noch kein Mehrwerte-Feld in ein CSV exportiert, aber da Du nur ein
Code
rowstring = rowstring + +","  + colval 
machst, sollte das funktionieren.


Code
Function Findreplace(Byval wholestring As Variant, find As String, ireplace As String) As String
 checkstring=wholestring
 saveleft=""
 While Instr(1, checkstring, find)<>0 
     n=Instr(1, checkstring, find)
     leftstring = Left(checkstring, n-1)
     rightstring=Right(checkstring, Len(checkstring)-n-Len(find)+1)
     saveleft=saveleft+leftstring+ireplace
     checkstring=rightstring
 Wend
 FindReplace= saveleft+checkstring
End Function

Aufrufen tust Du die Funktion dann
colval = findreplace(colval,",",";") <- oder ein anderes Zeichen als ";"
Das setzt Du dann einfach nach dem "Forall colval ..."

Bye,
Markus
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #4 am: 21.08.14 - 13:59:59 »
Jetzt sieht das Ganze so aus:

%REM
        Agent Export CCS
        Created 24.07.2014 by jens
        Description: Comments for Agent
%END REM
Option Public
Option Declare


Sub Initialize
        Dim ws As New NotesUIWorkspace
        Dim uiview As NotesUIView
        Dim view As NotesView
        Dim db As NotesDatabase
        Dim session As New NotesSession
       
       
        ' use the workspace to get the current view
        'Set uiview = ws.CurrentView
        'Set view = uiview.View
        Set db = session.CurrentDatabase
        Set view = db.GetView( "CCSMA" )    
       
        Dim filenames As Variant
       
'Dim cn As Variant        
       
        ' Get filename from user using the current ViewName as the default file name
        filenames = ws.SaveFileDialog( _
        False,"File Name",, "C:\daten\", "Adressliste.csv")
        If Not(IsEmpty(filenames)) Then
                Call ViewCSVPrint (view, filenames(0) )
        End If
       
       
End Sub


Sub  ViewCSVPrint (view As NotesView, FileName As String )
       
        Dim fileNum As Integer
        Dim entry As NotesViewEntry        
        Dim vc As NotesViewEntryCollection
        Dim rowstring As String        
        Dim cns As String
       
        fileNum% = FreeFile()
        Open filename For Output As fileNum%
       
        ' use the view column titles as the CSV headers
        ForAll c In view.Columns
                If cns = "" Then        
                        cns = c.title
                Else
                        cns = cns + +","  + c.title                
                End If
        End ForAll                
        Print #fileNum%, cns
       
       
     ' now get and print the values for each row and column
        Set vc = view.AllEntries
        Set entry = vc.GetFirstEntry()
        While Not entry Is Nothing
                rowstring = ""
                ForAll colval In entry.ColumnValues
                        colval = findreplace(colval,",",";")
                        If rowstring = "" Then
                                rowstring = colval
                        Else
                                rowstring = rowstring + +","  + colval
                        End If                        
                End ForAll
                Print #fileNum%, rowstring
                Set entry = vc.GetNextEntry(entry)
        Wend
        Close fileNum%
       
       
End Sub


       
Function Findreplace(ByVal wholestring As Variant, find As String, ireplace As String) As String
       
        Dim checkstring As Variant
        Dim saveleft As Variant
        Dim n As Variant
        Dim leftstring As Variant
        Dim rightstring As Variant
       
        checkstring=wholestring
         saveleft=""
 While InStr(1, checkstring, find)<>0
     n=InStr(1, checkstring, find)
     leftstring = Left(checkstring, n-1)
     rightstring=Right(checkstring, Len(checkstring)-n-Len(find)+1)
     saveleft=saveleft+leftstring+ireplace
     checkstring=rightstring
 Wend
 FindReplace= saveleft+checkstring


Fehlermeldung:
Falscher Datentyp in Methode OP_CHECK_TOS_BYVAL: STRING wurde gefunden Unknown wurde erwartet

Wo liegt hier mein Fehler?

Viele Grüße

Jens

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #5 am: 21.08.14 - 15:20:00 »
Hi Jens,

ich denke mal er stört sich daran, dass colval kein Variant sondern ein String ist.
Ersetze "ByVal wholestring As Variant" durch "wholestring As String".
Ich hab das bei mir mal nachgebaut da funktioniert es. Ich hab aber keine Ansicht ausgelesen, sondern auf die Schnelle nur ein reines Textfeld und dort einen String ausgelesen.

Bye,
Markus
« Letzte Änderung: 21.08.14 - 15:22:06 von rambrand »
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #6 am: 21.08.14 - 16:57:28 »
Vielen Dank für Deine Mühe!

Hab ich gemacht. Jetzt kommt der Fehler

Falscher Datentyp in Methode CoerceString: Unknown wurde gefunden, Unknown wurde erwartet.

Driri

  • Gast
Re: Export als csv
« Antwort #7 am: 21.08.14 - 17:12:46 »
Warum benutzt Du zum Ersetzen nicht einfach die Replace-Function (siehe Designer-Hilfe) ?

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #8 am: 21.08.14 - 17:24:41 »
Hallo Ingo,

dass ich ziemlicher Anfänger bin weißt Du spätestens jetzt....

Was bedeutet das konkret?

Viele Grüße

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #9 am: 21.08.14 - 18:16:39 »
Gerade für Frischlinge (das ist nicht ehrenrührig, Jens!), ein paar essentielle Hinweise:

- "+" ist *nicht* der Concenator für Strings, sondern "&"! Wenn Du unsauber (ich sage da eigentlich in diesen Fällen immer "g'schlampert") arbeitest und Dich auf das Typecasting von LS verlässt, können Dir in bestimmten Kombinationen sonst kann merkwürdige Resultate anstrahlen.
- Schreibe keinen Code (keine Zeile! Aus einer Zeile wird ganz schnell ein Konvulat aus hundert Zeilen ...) ohne ErrorHandler. Gib das das Suchbegriff hier ins Forum ein - Du wirst auch viele fertige Beispiele finden. Modulname, Fehlerart und -zeile sollten mindestens ausgegeben werden. Im Fall der Fälle ist das dann für Dich schon weit mehr als die Hälfte der Miete, um einen Fehlr zu fixen.

Und last, but not least: Schreibe niemals hier bei AtNotes einfach nur eine Fehlermeldung, die Du bekommst, sondern immer auch die Stelle dazu, bei der es knallt (-> ErrorHandler! Im konkreten Fall wäre der aber auch wenig hilfreich, da das vermutlich direkt aus dem Kernel von LS kommt). Nimm hierfür notfalls (wieder: Siehe ErrorHandler, falls der ausnahmsweise mal doch nicht hilft) den Debugger, dann kannst Du das exakt verfolgen.
Ich vermute, daß eine Methode falsch verwendet wurde (in diesem Falle). Aber ohne weitere Informationen Deinerseits (siehe oben) haben wohl fast alle keinen Bock, nach Feierabend noch eine Menge Code zu durchforsten ...

Und nun viel Spass und Faszination an Deinen Fortschritten mit dem Erlernen von LS und dem Erkennen, welche völlig neuen Möglichkeiten sich für Dich auf einmal ergeben  :)

Bernhard

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #10 am: 22.08.14 - 08:42:20 »
Der Debugger bleibt an der Stelle stehen, wo in Colval ein Mehrfachwert ausgewiesen ist. In dem Fall ["331", "335"].

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Export als csv
« Antwort #11 am: 22.08.14 - 09:05:43 »
Bei einem Mehrfachwerte könnte ein Join(colval,";") im Code helfen.
Eine andere Möglichkeit wäre z.B. in der Ansicht in den Spalten die Mehrfachwerte anzeigen ein @implode( [Mehrfachwert] ;"; ") einzufügen.
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #12 am: 22.08.14 - 10:16:28 »
Super, so hat es funktioniert. Habe mit der @implode gearbeitet.

Nun noch eine Frage:

Der Fileeport soll ohne Dialogbox laufen, da ich ihn gerne automatisch jede Nacht laufen lassen würde. Was kann ich hier stattdessen unter filenames machen?

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #13 am: 24.08.14 - 16:15:10 »
Hi Jens,

filenames ist ein String. Nicht schön aber wenn Du es einfach haben willst, anstelle
filenames = ws.SaveFileDialog...
filenames = "lw:\pfad\dateiname"
Ist nicht elegant, weil wenn man den Pfad irgendwann ändern will, dann muss man das Script ändern.
Eleganter wäre ein Profildokument, in dem Du solche Werte zentral hinterlegst. So kann dann auch ein Benutzer der nicht Zugriff auf den Designer hat den Pfad anpassen.
Aber für das erste sollte das reichen.

Bye,
Markus

Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Jens82

  • Frischling
  • *
  • Beiträge: 8
Re: Export als csv
« Antwort #14 am: 25.08.14 - 14:12:41 »
Super, danke, so läufts.

Herzlichen Dank an Euch alle!!

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #15 am: 25.08.14 - 14:24:26 »
Hallo,

Du schreibst, "so laeufts".
Gleichzeitig schreibst du in einem vorherigen Post von dir, dass es ohne die
Dialogbox laufen soll, da es automatisch jede Nach laufen soll.

Dies waere dann aber ein periodischer Agent, in dem der Export laufen soll.

Dieser, wenn es denn so ist, wird aber nicht laufen, da du in deinem Code "UI-Elemente" (NotesUIWorkspace) verwendest.
Diese koennen in einem periodischen Agenten aber nicht verwendet werden.


Andreas

Offline Keydins

  • Aktives Mitglied
  • ***
  • Beiträge: 163
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #16 am: 25.08.14 - 14:54:24 »
Setzt der Agent bereits bei Dim ws As New NotesUIWorkspace auf?

Denn er verwendet das filenames = ws.SaveFileDialog ja gar nicht mehr, da die Zeile gemäß Vorschalg von Markus voraussichtlich durch filenames = "lw:\pfad\dateiname" ersetzt wurde.

Oder sehe ich den Baum vor lauter Wald grade nicht  :-:

Gruß
Dirk
Gruß Dirk

Aktuelle Notesumgebung
~800 BasicClients 9.0.1 FP9 SHF55
  10 FullClients 9.0.1 FP7 SHF143
    7 DominoServer 9.0.1 FP9 HF 139 / 64 Bit

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #17 am: 25.08.14 - 15:01:23 »
Ja.

Denn mit dem Dim wird ja cuh gleichzeitig noch das betreffende Objekt instanziiert. (As New...)

Ausserdem gibt es ja auch noch die Code-Stuecke mit der UIView.


Andreas

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Export als csv
« Antwort #18 am: 25.08.14 - 15:17:31 »
Jop,

steht im FAQ http://atnotes.de/projekte/bp/team/tmc/_bestpractices/agenten/Agenten_1.00.pdf unter 4.2 explizit drin.

Vielleicht hat er das auch inzwischen auskommentiert/gelöscht, weil er auf ws nicht mehr zugreift und deswegen läuft es.

@Jens: Falls Du noch Fragen haben solltest, poste mal den aktuellen Code damit wir auf dem laufenden sind - aber da es wie Du sagst läuft nehme ich an, Du hast es zumindest einmal auch wirklich als periodischer Agent getestet und nicht per Button-Click aus einem Notes-Client.

Bye,
Markus
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz