Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: john doh am 07.07.08 - 11:05:26

Titel: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 07.07.08 - 11:05:26
Hallo zusammen,

die CSV sieht ungefähr so aus:

...;"14";...;"Rechnungbetrag Firme 1";...;15,99 €
...;"14";...;"blah blah";...;
...;"14";...;"blah blah";...;
...;"14";...;"Rechnungbetrag Firme 2";...;;;0,99 €
...;"14";...;"blah blah";...;
...;"14";...;"Rechnungbetrag Firme 3";...;;100,99 €

Mein Problem sieht so aus, alle Zeilen mit gleicher Kartennr (in diesem Fall 14) und dem Wort "Rechnungsbetrag" sollen addiert werden. Die Eurobeträge stehen an VERSCHIEDENEN Positionen.
Das ist mein bisherigen Code:

Sub Initialize
   Dim uiws As New NotesUIWorkspace
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim view As NotesView
   Dim fileNum As Integer
   Dim fileName As Variant
   Dim InputStr As String
   Dim delimiter As String
   Dim FieldArray  As Variant
   
   Set db = session.currentdatabase
   Set view = db.GetView ("abgleich")
   fileNum% = Freefile()
   fileName = uiws.OpenFileDialog(True, "CSV-Datei auswählen", "CSV Files|*.CSV", "C:\")
   delimiter = ";"
   
   Open fileName(0) For Input As fileNum%
   Line Input #1,  InputStr$
   
   Do While Not Eof(fileNum%)
      Line Input #1,  InputStr$
      FieldArray = Split(Replace(inputstr$ ,Chr(34),""),delimiter,-1,0)
      
      If  Not Isempty(FieldArray) Then
         If Instr (InputStr$,"Rechnungsbetrag") > 0 Then
            Set doc = view.GetDocumentByKey(fieldarray(2))
            If Not doc Is Nothing Then
               Call doc.ReplaceItemValue("status", "Abgleich am "+Now)
               Call doc.ReplaceItemValue("puffer", fieldarray(18))
               Call doc.Save(True,True)
            End If
         End If
      End If
      
   Loop
   
   Close fileNum%
End Sub

Ich hab nicht den leisesten Schimmer, wie ich das realisieren soll.

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: koehlerbv am 07.07.08 - 11:09:52
Dann muss Du Dir einen Parser bauen:
- Prüfen, ob in Array (x) die gewünschte Kartennummer steht. Wenn nein -> nächste Zeile
- Prüfen, ob in FieldArray (y) "Rechnungsbetrag" steht. Wenn nein -> nächste Zeile
- Alle folgenden Elemente des Arrays durchsuchen, ob dort das Euro-Zeichen steht.
- Wenn ja, alle Zeichen ausser Ziffern und Komma eliminieren, Double-Wert bilden und addieren.

HTH,
Bernhard
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 07.07.08 - 13:41:20
Der code aus meinen 1. Post, macht der das nicht (bis aufs addieren)?

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: klaussal am 07.07.08 - 13:45:54
Zitat
Der code aus meinen 1. Post, macht der das nicht (bis aufs addieren)?

Böse Falle. Seinen eigenen Code sollte man schon kennen + was der macht.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 07.07.08 - 15:04:53
@ Bernhard

Manchmal bin ich sooo doof.  ;D
JETZT, wo ich endlich verstanden habe wie Du das meinst, werde ich mich voller Tatendrang dransetzen. Falls ich Schwierigkeiten haben sollte, werd ich nochmal nach Hilfe schreien.
Vielen Dank für den Schups in die richtige Richtung.

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 08.07.08 - 09:55:20
- Prüfen, ob in Array (x) die gewünschte Kartennummer steht. Wenn nein -> nächste Zeile
- Prüfen, ob in FieldArray (y) "Rechnungsbetrag" steht. Wenn nein -> nächste Zeile
- Alle folgenden Elemente des Arrays durchsuchen, ob dort das Euro-Zeichen steht.
- Wenn ja, alle Zeichen ausser Ziffern und Komma eliminieren, Double-Wert bilden

Soweit alles hinbekommen, nur das mit dem addieren will nicht so klappen.





Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: DerAndre am 08.07.08 - 09:56:41
Was bedeutet nicht so klappen?
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 08.07.08 - 10:03:41
Es bleiben zwei Double-Werte (rest) übrig. Diese hätte ich jetzt versucht mit evaluate("@sum(rest)") zu addieren.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 08.07.08 - 10:58:15
Sub Initialize
   Dim uiws As New NotesUIWorkspace
   Dim session As New notessession
   Dim db As notesdatabase
   Dim fileNum As Integer
   Dim fileName As Variant
   Dim InputStr As String
   Dim FieldArray  As Variant
   Dim rest As Double
   
   
   Set db = session.currentdatabase
   fileNum% = Freefile()
   fileName = uiws.OpenFileDialog(True, "CSV-Datei auswählen", "CSV Files|*.CSV", "C:\!zeug!")
   
   Open fileName(0) For Input As fileNum%
   Line Input #1,  InputStr$
   
   Do While Not Eof(fileNum%)
      Line Input #1,  InputStr$
      
      If Instr (inputstr$,"43409699") Then
         If Instr (inputstr$,"Rechnungsbetrag") Then
            fieldarray = Replace(Right(inputstr$,10) ,";","")
            rest = Evaluate("@sum(fieldarray)")
            Call CreateDocument(db, rest)
         End If
      End If
      
   Loop
   
   Close fileNum%
End Sub

Als Ergebnis bekomme ich zwei Zeilen mit 0. Es soll aber eine Zeile mit 80,19 herauskommen. In "Fieldarray" stehen zwei Werte, 79,45 und 0,74. Wo mache ich den oder die Fehler?

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: MadMetzger am 08.07.08 - 11:09:32
In dem Evaluate liegt der Fehler. Schau dir mal die Hilfe dazu an. Kleiner Hinweis: Erzeuge dir ein temporäres Dokument in dessen Kontext das Evaluate laufen kann. Da kannst du dann dein Field-Array als Item hinterlegen und Schwupps sollte es funken.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 08.07.08 - 11:43:52
Erzeuge dir ein temporäres Dokument in dessen Kontext das Evaluate laufen kann. Da kannst du dann dein Field-Array als Item hinterlegen und Schwupps sollte es funken.

Ich weiß ungefähr, was Du meinst. Nur, ich hab sehr wenig Erfahrung in Script und weiß nicht wie ich das einbauen soll.

Tut mir Leid.
Matthias

Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: MadMetzger am 08.07.08 - 12:08:24
Für das temporäre Dokument:
Schau dir mal in der Designer-Help den Eintrag zu NotesDatabase und insbesondere CreateDocument an. Wenn du ein erzeugtes NotesDocument nicht speicherst verschwindet es auch von alleine wieder.

Für das Zuweisen:
Interessant ist da wahrscheinlich der Artikel in der Hilfe zu NotesDocument. Dort werden Wege gezeigt, wie man einem NotesDocument Items hinzufügen kann.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: Driri am 08.07.08 - 12:55:49
Zitat
If Instr (inputstr$,"43409699") Then
         If Instr (inputstr$,"Rechnungsbetrag") Then
            fieldarray = Replace(Right(inputstr$,10) ,";","")
            rest = Evaluate("@sum(fieldarray)")
            Call CreateDocument(db, rest)
         End If
      End If

Mit "fieldarray = ..." schießt Du in jedem Durchlauf einen anderen Stringwert in fieldarray. Du erhälst somit also nur einen Wert und nicht alle relevanten.

Das Evaluate dürfte immer 0 ergeben, weil die Formel @Sum versucht, aus einem Feld "fieldarray" die Summe zu bilden.

Was Du doch eigentlich erreichen möchtest, ist doch eine Summierung aller Beträge aus den Zeilen, die den beiden Bedingungen aus den If-Abfragen entsprechen, oder ?

Dann reicht es doch, wenn Du die Beträge jeweils aus dem String herausoperierst (möglichst noch mit Prüfung, ob es eine Zahl ist) und diese Einzelbeträge dann in einer Double-Variable aufsummierst.

In Auszügen so etwa :

Zitat
Dim ergebnis As Double
...
If Instr (inputstr$,"43409699") Then
  If Instr (inputstr$,"Rechnungsbetrag") Then
    fieldarray = Replace(Right(inputstr$,10) ,";","")
    If IsNumeric(fieldarray) Then
      ergebnis = ergebnis + CDbl(fieldarray)
    Else
      ...
    End If
...
End If
End If

Das Replace wird vermutlich nicht ausreichen, um sicherzustellen, daß Du nur eine Zahl aus dem String extrahierst. Da mußt Du noch Nachbearbeitung leisten.

Wenn der Betrag immer an der letzten Stelle steht, wäre es das Einfachste, den String per Split in einen Array zu zerlegen und das letzte Element des Array auszulesen (Stichwort UBound).
Diesen Wert kannst Du dann noch prüfen (z.B. € enthalten, IsNumeric, etc.) und erst dann summieren.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 08.07.08 - 13:15:46
Was Du doch eigentlich erreichen möchtest, ist doch eine Summierung aller Beträge aus den Zeilen, die den beiden Bedingungen aus den If-Abfragen entsprechen, oder ?

Ja, genau so!

Das Ergebnis, mit Deiner Ergänzung, sieht so aus
79,45
80,19
Er soll mir aber nur ein Document erzeugen, mit der Summe der Beträge.

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: Driri am 08.07.08 - 13:36:50
Mein Code oben "repariert" auch nur deinen geposteten Code. Der letzte Absatz in meinem Posting weist Dir den Weg.


Edit : Das CreateDocument mußt Du nach der Do-Schleife einbauen. Innerhalb der Schleife kann sich der Wert ja ändern und somit würde für jeden Zwischenwert ein Ergebnisdokument erzeugt.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 08.07.08 - 14:26:29
@Driri
@Bernhard

Klappt wunderbar! Besten Dank!
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 10.07.08 - 09:26:47
Hallo Zusammen,

ich muss den Thread leider wiederbeleben. Folgender Sachverhalt.
Infos zur CSV-Datei:
- kommt jeden Monat neu und kann im Aufbau und Formatierung nicht geändert werden
- enthält mehrere Kartennr, zu jeder gibt es ca. 25 Zeilen
- jede dieser Zeile enthält die Kartennr, einen Eurobetrag und einige das Wort "Rechnungsbetrag"

Infos zur DB:
- enthält Kartenr, die nur einmal vorkommen

Aufgabe des Agenten:
- gucken, ob die Kartennr in der CSV, auch in der DB auftaucht
- wenn ja, sollen die jeweiligen Eurobeträge (die nicht an der gleichen stelle Stehen) der Zeilen mit "Rechnungsbetrag" addiert und der entsprechenden Kartennr zugeordnet werden

Das ist der Agent:
Sub Initialize
   Dim uiws As New NotesUIWorkspace
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim view As NotesView
   Dim filenr As Integer
   Dim filename As Variant
   Dim inputstr As String
   Dim delimiter As String
   Dim array  As Variant
   Dim euroarray As Variant
   Dim eurobtr As Double
   
   Set db = session.currentdatabase
   Set view = db.GetView ("abgleich")
   filenr% = Freefile()
   filename = uiws.OpenFileDialog(True, "CSV-Datei auswählen", "CSV Files|*.CSV", "C:\!zeug!")
   delimiter = ";"
   
   Open filename(0) For Input As filenr%
   Line Input #1,  inputstr$
   
   Do While Not Eof(filenr%)
      Line Input #1,  inputstr$
      array = Split(Replace(inputstr$ ,Chr(34),""),delimiter)
      euroarray = Replace(Right(inputstr$,10) ,";","")
      
      If  Not Isempty(array) Then
         If Instr(inputstr$,"Rechnungsbetrag") Then
            
            Set doc = view.GetDocumentByKey(array(2))
            If  Not doc Is Nothing Then
               eurobtr = eurobtr + Cdbl(euroarray)      
               Call doc.ReplaceItemValue("euros", eurobtr)
               Call doc.Save(True,True)
            End If
         End If
      End If
      
   Loop
   
   Close filenr%
End Sub

Die Ansicht nach dem Ausführen des Agenten:
03747706  11,17
16049486  24,14
24910325  74,17
43409699  154,36
55423754  203,82

So sollte sie aber aussehen:
03747706  11,17
16049486  12,97
24910325  50,03
43409699  80,19
55423754  49,46

Zu der Kartennr 43409699 gibt es zwei Zeilen mit "Rechnugsbetrag". Die erste enthält den Eurobetrag 79,45, die zweite 0,74, macht zusammen 80,19.

Wie muss der Code aussehen, um das gewünschte Ergebnis zu erhalten?

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: Thomas Schulte am 10.07.08 - 09:37:20
Es tut mir leid wenn ich jetzt gar garstig klinge.

Kauf dir jemanden ein der dir die Lösung schreibt.

Und dann noch jemand der dich ausbildet.

Oder am besten beides.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: Driri am 10.07.08 - 09:38:51
Full ACK. Zumal Du meinen Hinweis, wie Du den Betrag am sinnvollsten ermittelst, nicht gelesen oder nicht verstanden hast. In euroarray kann u.U. so alles mögliche drinstehen.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 10.07.08 - 10:10:25
@ Driri
Tschuldigung, hatte vergessen zu erwähnen, dass die Eurobeträge nicht an der gleichen Stelle stehen. Und ich habe Deinen Hinweis gelesen, Die Beträge, die er mir ermittelt sind alle richtig. Nur er bildet mir die Summe mit allen Kartennr und nicht für jede einzeln.

@Thomas Schulte
Tut mir leid, wenn ich mich blöd anstelle, aber das sind meine ersten Gehversuche in Lotus Script. Ich hab es mir nicht ausgesucht. Ich tue das alles auf Bitten meines Chefs. Da ich auch noch was anderes zutun habe,als mich den ganzen Tag mit Script zubeschäftigen und mir keine wirklich gute deutschsprachige Dokumentation zum Thema Script bekannt ist, dachte ich mir "Wende ich mich mal ans Furom, vielleicht können die mir helfen.".
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: tks am 10.07.08 - 10:15:08
Du solltest eurobtr nach jedem Dokument auch wieder initialisieren.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: Thomas Schulte am 10.07.08 - 10:47:40
Tut mir leid, wenn ich mich blöd anstelle, aber das sind meine ersten Gehversuche in Lotus Script. Ich hab es mir nicht ausgesucht. Ich tue das alles auf Bitten meines Chefs. Da ich auch noch was anderes zutun habe,als mich den ganzen Tag mit Script zubeschäftigen und mir keine wirklich gute deutschsprachige Dokumentation zum Thema Script bekannt ist, dachte ich mir "Wende ich mich mal ans Furom, vielleicht können die mir helfen.".
Dann sag deinem Chef du hättest da gerne eine Ausbildung.

Die Schwächen die du zeigst sind keine der Sprache Lotus Script geschuldeten Schwächen.
Die Fehler die du machst sind Logikfehler, wie der von Thomas als letztes genannte Fehler beim Reinit deines Betragfeldes der übrigens für dein Problem mit den sich dauernd hochzählenden Werten verantwortlich ist.

Wenn du jetzt aber den Tipp von Thomas umsetzt, dann wirst du wieder darüber stolpern das du die interne Aufsummierung nicht mehr hinbekommst. Du hast dir nicht genug Gedanken darüber gemacht wie man so etwas zum Beispiel auf Papier machen würde. Wenn du das machen würdest dann würdest du sehr schnell darauf kommen warum das was du willst in der Art wie du das machst nicht funktionieren kann.

Das Forum hat dir schon geholfen. Es hat es zumindest versucht. Es ist in seiner Gesamtheit aber keine Ausbildungsstätte.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 10.07.08 - 11:24:10
@ Thomas Schulte

Danke, Du hast mir Klarheit verschafft. Ich bin an die Problematik viel zu überstürzt rangegangen. Ich werde mich jetzt erstmal hinsetzen und meine Herangehensweise überdenken. Du hast Recht, das Forum hat mir wirklich sehr geholfen.

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: klaussal am 10.07.08 - 12:15:55
Wenn bereits ein Dok mit der Kartennr besteht, muss du den Betrag auf das entsprechende Feld dieses Doks addieren.

Das hat jetzt aber nix mit LS zu tun, sonder mit logischem Denken. Und da hapert's wohl auch ein bisschen.
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: john doh am 10.07.08 - 12:55:51
Dass ich Logikfehler mache, hat mir Thomas schon gesagt und ich sehen es auch ein. Darum habe ich in meinem letzten Post auch geschrieben, dass ich die ganze Sachen nochmal überdenken werde. Damit war für mich das Thema abgeschlossen. Warum Du jetzt noch so ein Kommentar von Dir geben musst, ist mir ein Rätsel.

Hiermit bedanke ich mich nocheinmal bei allen, die mir geholfen haben. Thread ist damit abgeschlossen!

Matthias
Titel: Re: Beim einlesen von CSV-Datei Zeilen addieren
Beitrag von: Driri am 10.07.08 - 13:10:35
Ich finde das generell schon mal die richtige Einstellung. Setz dich hin und überleg Dir einfach genau, wie der Ablauf sein muß. Und dann versuch das in Programmcode umzusetzen.

Bei Detailproblemen bekommst Du hier im Forum auch garantiert Hilfe. Nur kann dieses Forum keine Ausbildung ersetzen. Evtl. schaust Du dir z.B. mal die Schulungsunterlagen vom Herdt Verlag an, die sind für den Einstieg schon sehr hilfreich und kosten nicht die Welt. Zumindest das sollte es deinem Chef Wert sein.

IBM Lotus Notes Domino 6 für Windows - Datenbankentwicklung: Grundlagen  (http://www.herdt4business.de/commerceportal/default.asp?dl=/commerceportal/item_detail.asp%3FItemNo=1000308)
IBM Lotus Notes Domino 6 für Windows - Datenbankentwicklung: LotusScript  (http://www.herdt4business.de/commerceportal/default.asp?dl=/commerceportal/item_detail.asp%3FItemNo=1001057)