Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Jenson am 20.08.04 - 08:59:21

Titel: @DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: Jenson am 20.08.04 - 08:59:21
Guten Morgen,

wenn eine DBLookup-Anweisung in einem Script mehrere Ergebnisse liefert, dann wird teilweise der Anweisungsblock um die DBLookup-Anweisung so ofrt ausgeführt wie es ergebnisdokumente gibt.

Kann man das irgendwie umgehen?

Kann man die Ergebnisse nicht irgendwie in einer Schleife verarbeiten? Wenn ich das versuche, dann wird die ganze Schleife so oft wiederholt wie es Ergebnisdokumente gibt.


Jenson
Titel: Re:@DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: Glombi am 20.08.04 - 09:00:58
Poste doch mal den entsprechenden Code.

@DbLookup in Script, also mit Evaluate. Du kannst dann bspw. mit Forall darüber iterieren.

Was willst Du eigentlich erreichen?

Andreas
Titel: Re:@DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: Jenson am 20.08.04 - 09:09:32
Ich habe eine Schleife die Dokumente für 31 Tage ermitelt. Wenn immer nur ein Dokument für einen Tag da ist, dann funktioniert mein restlicher Code einwandfrei.

Wenn nun für einen Tag mehrere Dokumente existieren, dann wird der Scriptblock in dem ich die Dokumente verarbeitet leider so oft wiederholt wie es Ergebnisdokumente gibt. Ich will aber eigentlich alle Dokumente aneinanderreihen.

Den Scriptblock zu posten wird nicht viel bringen, da das Script mittlerweile mehrere DIN-A4 Seiten füllt. Aber ich Poste mal den Teil, um den es gerade geht:

Code

_WorkingDaysNo := 31;
n := 1;
_HoursADay := "";
@While(n <= _WorkingDaysNo;
_Line := "";
         _TextDate := @Text(n) + "." + @Text(MONTH) + "." + @Text(YEAR);
         _RealDate := @Date (YEAR; MONTH; n);      
         _KeyTimeEntry    := _KeyTimeSheet + "-" + _TextDate;
         _DayDBResult     :=  @DBLookup("":"NoCache";"":"xxxxxxxx.nsf";"CMSCollector_TimeEntry";_KeyTimeEntry;2);
         @If((@Weekday(_RealDate) = 1) | (@Weekday(_RealDate) = 7); _Hours := "&nbsp;";  _Hours := "0");
         _Category := "";
         @if(@Elements(_DayDBResult) > 0; 
            @Do(
                 DayCount := 1;
                 @While(DayCount <= @Elements(_DayDBResult);
                      @if(@Elements(_DayDBResult) > 1;
                           @Do(
                                _Hours := "0";
                                _HoursInt := "";

                               n2 := 1;
                               _FlatList := @Implode(_DayDBResult; "#");
                               @While(n2 <= @Elements(_DayDBResult);
                                       _WorkList := @Explode(_FlatList; "#");
                                       _Line := "";
                                       _HoursInt :=_HoursInt + @Text(@Word(_WorkList[n2]; "|"; 4));
                                       _Order := @Text(@Word(_WorkList[n2]; "|"; 5));
                                       _Mem := @Member(_Order; _OrderNoList);


                                      @if(_Mem = 0; _Mem := 1;"");
                                      n3 := 1;
                                      @While(n3 < _Mem;
                                            _Line := _Line + "0|";
                                      n3 := n3 + 1);
                                      _Line := _Line + _HoursInt + "|";
                                      n3 := _mem+1;
                                      @While(n3 <= _OrderNoCount;
                                            _Line := _Line + "0|";
                                      n3 := n3 + 1);
                                      _MEMBER := _MEMBER + "<BR>" +_Line + "--" + _TextDate;




                               n2 := n2 + 1);
                               _Hours := @Text(_HoursInt)
                            ); @Do(
                               _Hours := @Text(@Word(_DayDBResult; "|"; 4));
                               _Order := @Text(@Word(_DayDBResult; "|"; 5));
                               _Mem := @Member(_Order; _OrderNoList);
@if(_Mem = 0; _Mem := 1;"");
n3 := 1;
@While(n3 < _Mem;
      _Line := _Line + "0|";
n3 := n3 + 1);
_Line := _Line + _Hours + "|";
n3 := _mem+1;
@While(n3 <= _OrderNoCount;
      _Line := _Line + "0|";
n3 := n3 + 1);
_MEMBER := _MEMBER + "<BR>" + @Text(_Line) + "--" + _TextDate
                            ));
                       _Category := @Word(_DayDBResult; "|"; 1);
                       _StartTime := @Word(_DayDBResult; "|"; 2);
                       _EndTime:= @Word(_DayDBResult; "|"; 3);
                  DayCount := DayCount + 1)
            ); 
            "");
           
           _OrderNoList := @Explode(_OrderNo; "|");
           _OrderNoList := @Sort(@Unique(_OrderNoList));
           _Categorys     := _Categorys + _Category + "|"; 
           _HoursADay   := _HoursADay + _Hours + "|";

n := n + 1);

_CatArray := _Categorys;
_HoursArray := _HoursADay;

FIELD _DEBUG := @text(_MEMBER);



Ich bekomme nun folgende Ausgabe für das Feld _DEBUG:

 
 
 

8|0|0|0|0|--12.8.2004
0|0|0|9|0|--13.8.2004
0|0|0|0|12.5|--16.8.2004
0|0|0|10|0|--17.8.2004
1.5|0|0|0|0|--18.8.2004
0|1.53|0|0|0|--18.8.2004
0|0|1.533|0|0|--18.8.2004
1.5|0|0|0|0|--18.8.2004
0|1.53|0|0|0|--18.8.2004
0|0|1.533|0|0|--18.8.2004
1.5|0|0|0|0|--18.8.2004
0|1.53|0|0|0|--18.8.2004
0|0|1.533|0|0|--18.8.2004
0|0|0|3|0|--19.8.2004
 

Die letzten 9 Zeilen entsprechen eigentlich nur 3 Dokumenten. Eines mit 1.5 Stunden, und zwei mit 3 Stunden. Das führt aufgrund des Wiederholen des Blockes um DBLookup zu dem fehlerhaften werten von 1.5, 1,53, 1,533




Hoffe es ist dennoch verständlich.


Jenson
Titel: Re:@DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: TMC am 20.08.04 - 18:23:27
Den Scriptblock zu posten wird nicht viel bringen, da das Script mittlerweile mehrere DIN-A4 Seiten füllt.

 :o  :o

Ohne mir das jetzt im Detail anzusehen und auch ohne zu wissen was Du hier machst, aber mehrere A4-Seiten Formelsprache:
Da stellt sich für mich die Frage, warum man das nicht mit LotusScript abbildet. Das LS dann sauber aufgeteilt und man hat Übersicht. Und man hat einen Debugger, ein Errorhandling etc. etc.
Titel: Re:@DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: animate am 20.08.04 - 18:44:45
hier hast du doch eine Schleife, die so oft durchlaufen wird, wie es Ergebnisse gibt.
Oder seh ich das falsch.

Code
@While(n2 <= @Elements(_DayDBResult);
                                      _WorkList := @Explode(_FlatList; "#");
                                      _Line := "";
                                      _HoursInt :=_HoursInt + @Text(@Word(_WorkList[n2]; "|"; 4));
                                      _Order := @Text(@Word(_WorkList[n2]; "|"; 5));
                                      _Mem := @Member(_Order; _OrderNoList);


                                      @if(_Mem = 0; _Mem := 1;"");
                                      n3 := 1;
                                      @While(n3 < _Mem;
                                            _Line := _Line + "0|";
                                      n3 := n3 + 1);
                                      _Line := _Line + _HoursInt + "|";
                                      n3 := _mem+1;
                                      @While(n3 <= _OrderNoCount;
                                            _Line := _Line + "0|";
                                      n3 := n3 + 1);
                                      _MEMBER := _MEMBER + "<BR>" +_Line + "--" + _TextDate;




                              n2 := n2 + 1);

btw: bei der Code-Kommentierung gilt nicht der Slogan "weniger ist mehr" ;-)
Titel: Re:@DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: animate am 20.08.04 - 18:49:34
und hier ist noch eine

Code
@While(DayCount <= @Elements(_DayDBResult);
                      @if(@Elements(_DayDBResult) > 1;

.....

_MEMBER := _MEMBER + "<BR>" + @Text(_Line) + "--" + _TextDate
                            ));
                      _Category := @Word(_DayDBResult; "|"; 1);
                      _StartTime := @Word(_DayDBResult; "|"; 2);
                      _EndTime:= @Word(_DayDBResult; "|"; 3);
                  DayCount := DayCount + 1)


Vermutlich liegts an einer der beiden, dass da was öfter auftaucht, als du möchtest...
Titel: Re:@DBLookup Frage bei Rückgabe mehrerer Dokumente
Beitrag von: Jenson am 21.08.04 - 10:39:37
Ich darf hier innerhalb einer CMS Datenbank Programmieren. Das ist eine Content Management Datenbank für Webseiten. Leider kann man hier nur @Formeln verwenden, sonst wäre ich schon längst auf LotusScript umgestiegen.

Jenson