Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: KnoJo am 25.10.05 - 10:06:32

Titel: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 10:06:32
guten morgen
im vornherein sag ich gleich, dass ich die suche und die hilfe schon benutzt habe.
leider ohne erfolg.

es geht darum einen wert aus einer textlist zu löschen.
was ich bereits hier im forum gefunden habe war:
@Trim (@ReplaceSubstring (Quellliste; WERTDERWEGSOLL; ""))
diese formel will ich aber nun in lotus script haben.
dachte das müsste so aussehen:
neuetextliste = session.Evaluate("@Trim(@ReplaceSubstring(anzahl_alle;nummer; ""))", doc )
dabei kommt aber ein fehler: not a member:evaluate
was ist daran nun falsch  ???
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: klaussal am 25.10.05 - 10:14:06
Ist "neuetextliste" ein Variant ?
Siehe die Hilfe unter "session & evaluate".
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 10:17:09
ja hab ich so deklariert
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: diali am 25.10.05 - 10:39:48
Warum nicht direkt per Script?

neuetextliste = Fulltrim(ArrayReplace(anzahl_alle,nummer, "")
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 10:40:58
Hi,

das kann auch so nicht gehen. Denn...

.... man achte auf den Hinweis in der Designer-Hilfe:

Hinweis  This method is supported in COM only.


So sollte das funktionieren:

neuetextliste = Evaluate(|@Trim(@ReplaceSubstring(anzahl_alle;nummer; ""))|, doc )


Axel


Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 10:56:34
@axel
es kommt kein fehler mehr, aber die werte in 'neuetextliste' sind gleich den werten in 'anzahl_alle'
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 10:59:09
Wo kommen denn die Parameter anzahl_alle und nummer her? Sind das Felder eines Dokumentes oder Variablen? Wie sehen die Inhalte aus?


Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 11:06:58
ich hab ein feld 'anzahl' in dem ich ein wert eintrag.
ich hab ein button 'hinzufügen' womit ich 'anzahl' in ein mehrfachwerte feld 'anzahl_alle' speicher. dies mach ich mit Call anzahl_alle.AppendToTextList(uidoc.fieldgettext("Anzahl"))
nachdem ich jetzt mehrer werte hinzugefügt hab, will ich einen wieder über einen button löschen. in einem feld 'nummer' geb ich die position des wertes an der gelöscht werden soll.

so hab ichs deklariert:
Dim anzahl_alle As notesitem
Dim nummer As Integer
Dim neuetextliste As Variant
Set anzahl_alle = doc.GetFirstItem( "anzahl_alle" )
nummer = uidoc.FieldGetText("nummer")
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 11:16:21
Hi,

von welchem Typ haben sind denn die Felder? Text, Zahl.

Deine Deklaration kann so auf keinen Fall funktionieren. FieldGetText liefert immer einen String und den kannst du nicht einer Integer-Variablen zuweisen.


Axel

 
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 11:21:24
na die felder in den ich was eingeb sind alle vom typ text.
die anderen inden ich dann die werte wieder rein schreib sind auch vom typ text und den haken bei mehrfachwerte hab ich gesetzt.
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 11:25:58
Hi,

das ist soweit richtig. Wieso willst du denn eigentlich das über Script machen? Wenn's in dem Button nur um das Löschen eines Wertes aus einer Liste geht, mach's am einfachsten mit der Formelsprache.

Damit müsste es funktionieren:

FIELD anzahl_alle := anzahl_alle;
neuetextliste := @Trim(@ReplaceSubstring(anzahl_alle;nummer; ""));
@SetField("anzahl_alle";neuetextliste)


Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 12:19:31
also das funktioniert.
ich würde es aber gerne über script sprache machen weil es für mich einfacher erscheint (als anfänger *g*)
denn ich hab noch ein weiteres mehrfachwerte feld. dies nummeriert sozusagen die einträge von anzahl_alle.
wenn ich jetzt aus anzahl_alle was lösche. bleiben die nummerierung gleich. aber es soll ja nicht so sein.
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: flaite am 25.10.05 - 12:23:42
Du kannst es ganz "zu Fuß" machen.
NotesItem des Objekts besorgen.
über .values iterieren.
Und einen neuen Array aufbauen.

so ungefähr:
Code
for all aVal in itFeld.values 
if (trim$(aVal <> "")  then
arCounter = arCounter + 1
Redim Preserve newVals(arCounter)
newVals(arCounter) = aVal
end if
end forall
Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 13:38:57
na das is mir dann doch n bisl zu hoch *grml*
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 14:08:01
Hi,

aus dem Kopf heraus ist mal folgender Lösungsansatz entstanden:


Dim doc As Notesdocument
Dim idx As Integer
Dim arrValue() As String
Dim varListe As Variant

...
...

'Löschen aus der Liste
varListe = Fulltrim(ArrayReplace(doc.anzahl_alle, doc.nummer(0), "")

'Dimensionierung des dyn. Arrays
Redim arrValue(Ubound(doc.anzahl_alle))

'Neu nummerieren
idx = 1
ForAll value in doc.anzahl_alle
  arrValue(idx-1) = idx
  idx = idx +1
End ForAll

'Wieder dem Feld zuweisen
doc.anzahl_alle = arrValue
...

Versuch's mal ob das so funktioniert.


Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 14:34:20
also für die werte löschen hab ichs jetzt so gemacht. funktioniert auch anscheinend:
i=Ubound(anzahl_a)
For j=nummer To i-1
      anzahl_a(j)=anzahl_a(j+1)
Next
Redim temp(i-1)
For j=0 To Ubound(anzahl_a)-1
      temp(j)=anzahl_a(j)
Next

denk mal, dass es dann für die nummerierung das selbe prinzip ist.
also so wie du es eben beschrieben hast.

thx für deine hilfe  :)
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 15:34:28
Bist du dir sicher, dass das funktioniert? Ich wage das etwas zu bezweifeln.

Wenn ich das richtig sehe schiebst du nur Werte durch die Gegend. Was passiert denn, wenn du einen Wert mitten aus der Liste löschst?


Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Gandhi am 25.10.05 - 15:41:37
Die Datenstruktur Array ist - sagen wir mal - suboptimal für Löschungen - dazu wäre ein Liste deutlich geeigneter - nur mal so als Anmerkung.
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 16:29:48
ja ich weis das es ein sehr umständlicher weg ist. aber hauptsache ich versteh ihn.
ich hab natürlich noch ein paar anweisungen vergessen mit hinzuschreiben. also:

zunächst übergeb ich die listenelemente in ein array vom typ variant
anzahl_a = doc.GetItemValue( "anzahl_alle" )

ich ermittle die menge der werte des arrays
i=Ubound(anzahl_a)

'nummer' ist die stelle die gelöscht werden soll
in einer for-schleife verschieb ich alle elemente um eins nach links
For j=nummer To i-1
      anzahl_a(j)=anzahl_a(j+1)
Next
angenommen ich will die 2. stelle löschen:
aus [1,2,3,4,5] wird [1,3,4,5,5]

jetzt nehm ich mir einen neuen dynamischen array
die anzahl der werte ist eins weniger
Redim temp(i-1)

in dieses temp-array schreib ich dann die werte von anzahl_a wobei dann die letzte stelle wegfällt

und zum schluss schreib ich dann alles wieder zurück in die text liste
doc.anzahl_alle=temp

@gandhi
hab es nur so realisieren können. hab kein plan wie ich es mit einer liste lösen kann.
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Gandhi am 25.10.05 - 16:32:39
Warum nimmst Du dann nicht wenigstens was fertiges. Zitat Axel:
varListe = Fulltrim(ArrayReplace(doc.anzahl_alle, doc.nummer(0), "")

Und als Hausaufgabe die Noteshilfe zum Thema Listen lesen ;)
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 16:46:31
mmmmmh, vielleicht weil ich tomaten auf den augen hatte? :D
will ja auch selber n bisl überlegen und nich gleich alles vorgesetzt bekommen ;)
aber ich machs jetzt nochmal so

hab das jetzt nochmal so gemacht. beim ersten löschen gehts aber wenn ich gleich nochmal auf den button klick tut sich nichts :\
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 16:57:55

will ja auch selber n bisl überlegen und nich gleich alles vorgesetzt bekommen ;)


Das ist eine sehr gute Einstellung. Nur so lernt man was dabei und gewinnt an Erfahrung.

Diese Einstellung müsste mehr vorhanden sein.


Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Gandhi am 25.10.05 - 16:58:03
Zitat
will ja auch selber n bisl überlegen und nich gleich alles vorgesetzt bekommen
Wirklich sehr löblich - ich wünschte jeder hier würde so denken.
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 25.10.05 - 17:06:39
das fulltrim... funktioniert nur beim erstenmal.
angenommen ich hab 3 werte.
geb als nummer 1 ein, dann wird der erste wert gelöscht.
somit müssten die anderen 2 werte 'nachrücken'
klick ich aber nochmal drauf um den ersten wert zu löschen (was ja ursprünglich der zweite war) tut sich nichts. muss erst ne 2 eingeben um den zu löschen...
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 25.10.05 - 19:26:30
Hi,

ich vermute mal, du setzt diese Konstrukt

     Fulltrim(ArrayReplace(anzahl_alle,nummer, "")

ein.

Dann ist das logisch warum das so funktioniert.

Die Replace-Funktion sucht nach dem Vorkommen des Inhaltes von nummer in anzahl_alle und ersetzt es durch eine leere Zeichenkette. Wenn du die Funktion erneut ausführst, hat ja nummer noch den gleichen Wert wie beim ersten Mal. Der ist ja nicht mehr vorhanden und somit passiert auch nichts.

Das ist aber doch das, was du anfangs haben wolltest. Oder?


Axel
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: KnoJo am 26.10.05 - 08:21:15
guten morgen

so wie ich das jetzt sehe und du das auch erklärt hast sucht ArrayReplace nach einem bestimmten string in einer liste. ich will aber nach der position gehen und nicht nachdem was drinn steht.
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Axel am 26.10.05 - 08:48:01
Hi,

hattestwenn du es mit einem Array lösen willst bleibt nur der Weg den du in Antwort 15 und 18 gepostet hast. Wobei es hier sicher Optimierungsmöglichkeiten gibt.

Der elegantere Weg, das hat Gandhi ja schon gesagt, ist der Weg über eine Liste.

Dazu schreibst du den Feldinhalt zuerst in eine Integer-Liste, löschst dann das Element an der entsprechenden Position und schreibst den Rest zurück in das Feld. Wobei hier aber der Umweg über ein Array genommen werden muss, da es nicht möglich ist eine Liste direkt einem Feld zuzuweisen.

In der Designerhilfe findest du alles was du brauchst.


Axel
 
Titel: Re: element aus textlist löschen [schonwieder]
Beitrag von: Gandhi am 26.10.05 - 09:19:45
Wenn Du wirklich eine Position löschen willst (warum auch immer - das ist wohl eher eine seltenere Option), dann bieten Listen nicht mehr unbedingt Vorteile.

Dann würde ich einfach so vorgehen:


function arrayDeleteElement(altArray as variant, pos as integer) as variant   
'altArray=Array aus dem gelöscht werden soll
'pos=die Position, an der gelöscht werden soll.

if pos>=Ubound(altArray) then
   arrayDeleteElement=altArray
else

   dim neuArrray(Ubound(altArray)-1)

   dim i as integer

   for i=0 to pos-1
     neuArray(i)=altArray(i)
   next

   for i=pos+1 to UBound(altArray)
     neuArray(i-1)=altArray(i)
   next

   arrayDeleteElement=neuArray
end if

end function