Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet 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
-
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
-
Der code aus meinen 1. Post, macht der das nicht (bis aufs addieren)?
Matthias
-
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.
-
@ 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
-
- 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.
-
Was bedeutet nicht so klappen?
-
Es bleiben zwei Double-Werte (rest) übrig. Diese hätte ich jetzt versucht mit evaluate("@sum(rest)") zu addieren.
-
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
-
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.
-
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
-
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.
-
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 :
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.
-
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
-
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.
-
@Driri
@Bernhard
Klappt wunderbar! Besten Dank!
-
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
-
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.
-
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.
-
@ 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.".
-
Du solltest eurobtr nach jedem Dokument auch wieder initialisieren.
-
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.
-
@ 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
-
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.
-
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
-
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)