Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: kevisback am 27.10.05 - 07:56:48

Titel: Konkatenation von Variablennamen
Beitrag von: kevisback am 27.10.05 - 07:56:48
Hallo zusammen,

wie kann man in LS Variablennamen konkatenieren?

Das soll dann so aussehen:


Code
For i = 1 To count
doc.d + i = irgendwas
next i


d1 bis d10 sind meinetwegen die Felder im Dokument, die ich fuellen will per Schleife. Die Konkatenation habe ich schon mit allen bekannten Operatoren probiert, aber nichts funktioniert.

Hat jemand eine Idee?


Danke vielmals!!!
Titel: Re: Konkatenation von Variablennamen
Beitrag von: m3 am 27.10.05 - 08:01:55
Du willst notesDocument.ReplaceItemValue( ) verwenden, da kannst Du den Feldnamen als String angeben:
Set notesItem = notesDocument.ReplaceItemValue( itemName$, value )

Die "extended class" Syntax (doc.feldname) hat nicht immer Vorteile. ;)
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 27.10.05 - 09:18:33
doc.feldname=...
ist irgendwie auch schlechter Stil - da der Code dann schlechter zu pflegen bzw. weiterzuverwenden ist, wobei ich ganz klar sagen muss, dass ich ob Faulheit das auch selbst ziemlich häufig nutze - vor allem für kleine Sachen.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: TMC am 27.10.05 - 23:42:44
doc.feldname=...
ist irgendwie auch schlechter Stil

Ja genau. Ist für mich *mittlerweile* selbe Liga wie Option Declare nicht einzuschalten, zumal auch Probleme auftauchen können wenn reservierte Properties Feldnamen entsprechen.
Ich kann es auch nicht nachvollziehen, warum das in größeren Apps überhaupt noch Leute verwenden, und nicht auf in Konstanten definierte Feldnamen verweisen.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: flaite am 28.10.05 - 00:07:25
Ich bin dieses Jahr zu der Überzeugung gekommen, dass: Es kommt drauf an.
In vielen Situationen ist es einfach nicht wichtig, ob man doc.getItemValue("feldName")(0) oder doc.feldName(0) schreibt. Es kommt eben einfach auf den Kontext an. Es gibt keine einfachen Regeln. In Python und Ruby wird zum Beispiel als Fortschritt gefeiert, dass es kein Äquivalent zu Option Declare gibt ! Wenn man einen functional programming Stil folgt mit kurzen Funktionen, mag das auch einfach so sein.
http://en.wikipedia.org/wiki/Python_programming_language#Functional_programming
Aber das ist offtopic.

In vielen Situationen finde ich Kurzschreibweise besser, weil einfacher zu schreiben und zu lesen. Es kommt eben immer auf den Kontext an.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 28.10.05 - 07:43:41
Also Option Declare sollte meiner Meinung nach defaultmässig eingeschaltet sein - nicht mal wegen Stilfragen, sondern weil es mich vor unglaublich vielen Tippfehlern und endlosem Debuggen bewahrt.
Über die andere Sache lässt sich streiten. Ich setze das wie gesagt auch Situationsbezogen ein - und Konstanten für Feldnamen benutze ich sehr selten - da ich die irgendwie per se als fix betrachte.
Aber auch hier gilt, dass ich das tun werde, sobald es für mich Sinn macht.
Aber es gibt schon ganz schöne Unterschiede zum Stil:
Während viele inzwischen fast ausschliesslich objektorientiert Script schreiben - hat mein aktueller Vorgänger noch nicht mal (kaum) Funktionen oder gar Bibliotheken benutzt.
Dafür ist der Code dann wild über die DB verteilt - und ich wurde zum Suchenden...

Titel: Re: Konkatenation von Variablennamen
Beitrag von: Glombi am 28.10.05 - 07:49:16
Die Extended Class Syntax zu verwenden ist meiner Meinung nach kein schlechter Stil. Solche Aussagen sollten vorsichtiger formuliert werden, ansonsten schmeisst nachher der Auftraggeber dir den Code um die Ohren.

Die Extended Class Syntax hat aber auch Nachteile gegenüber ReplaceItemValue:
1. Die Performance ist wesentlich schlechter, da der Compiler erst nach der Property/Methode sucht und dann - nachdem er keine gefunden hat - das als Abkürzung für ReplaceItemValue erkennt.
2. Aus 1 ergibt sich dann sofort das Problem: Wenn es DOCH eine Property gibt, so führt das zu Fehlern. Das ist bspw. der Fall, wenn in einer neuen Notes-Version eine neue Property hinzukommt.
Akutelles Beispiel (wurde auch hier im Forum behandelt): Lock

ein doc.Lock = "1" funktioniert dann eben nicht mehr.
Und sowas kann mit ReplaceItemValue nicht passieren.

Andreas
Titel: Re: Konkatenation von Variablennamen
Beitrag von: flaite am 28.10.05 - 11:09:29

Die Extended Class Syntax hat aber auch Nachteile gegenüber ReplaceItemValue:
1. Die Performance ist wesentlich schlechter, da der Compiler erst nach der Property/Methode sucht und dann - nachdem er keine gefunden hat - das als Abkürzung für ReplaceItemValue erkennt.
Das ist in vielen Kontexten eben auch egal. In vielen Fällen wird keiner die eingesparte Zeit merken.
In 7 haben wir ja eine Profiling Klasse. Damit bekommt man für einen konkreten Kontext konkrete Aussagen über die Zeit, die für die einzelnen Funktionen benötigt wird. Betrachtet man Performance vom Standpunkt der merkbaren Auswirkungen beim User (und alles andere macht keinen Sinn), dann sind solche Argumente eben mehr so metaphysisch.

Zitat
2. Aus 1 ergibt sich dann sofort das Problem: Wenn es DOCH eine Property gibt, so führt das zu Fehlern. Das ist bspw. der Fall, wenn in einer neuen Notes-Version eine neue Property hinzukommt.
Akutelles Beispiel (wurde auch hier im Forum behandelt): Lock
ein doc.Lock = "1" funktioniert dann eben nicht mehr.
Und sowas kann mit ReplaceItemValue nicht passieren.
Das ist ein Argument. Mit einem vernünftigen Test-Prozess bei einem upgrade auf die neue Version, in der das implementiert ist, sind die Kosten möglicherweise nicht besonders hoch.

Was ich nur sagen will ist, dass man an einer Menge Stellen aus verschiedenen Gesichtspunkten (Latenz, Skallierbarkeit, Wartbarkeit, etc. ) optimaleren Code schreiben kann. Wir machen es nur nicht, weil man eben nicht alles berücksichtigen kann. Und zwar keiner. Man kann nun 5 einfache Gesetze für "optimalen Code" aufstellen und das als "perfekten code" deklarieren. Die Regeln lassen aber bestimmt 120 Aspekte ausser acht. Ich bin sicherlich nicht gegen gute Programmierpraktiken. Will nur sagen, dass dies oft sehr komplex ist. Und das Ergebnis hinsichtlich einer totalen Betrachtung nie optimal ist.
Eine Architektur-, Design- oder Programmierentscheidung ist letztlich das Ergebnis einer Kosten-Nutzen Rechnung von denen ex ante die wirklichen Kosten und Nutzen nicht kennt.

Ein bischen wie die Theory of the second best in Wipol. In einem Markt mit Störungen führt eine Maßnahme die eine von mehreren Störungen beseitigt zu besseren, genau gleichen oder schlechteren Ergebnissen  ;D
http://internationalecon.com/v1.0/ch100/100c030.html

Axel 
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Tode am 28.10.05 - 11:26:08
Würde jetzt möglicherweise jemand auf die Ursprüngliche Frage eingehen ?

Der Arme Kerl hat noch keine Antwort erhalten.

In LS funktioniert das concat. so:

Dim x(9) as String
For i = 1 to 10
  feldName = "D" & Cstr( i )
  x(i-1) = doc.GetItemValue( feldName )(0)
next

Das concat funktioniert aber nur mit Dokument- Feldern, für Variablennamen gibt es sowas nicht, da würde man das aber auch nicht so lösen, sondern entweder mit einem Array (x im obigen Beispiel) oder aber mit einer Liste.

HTH
Tode
Titel: Re: Konkatenation von Variablennamen
Beitrag von: m3 am 28.10.05 - 14:54:55
Tode: Die erste Antwort (meine) auf sein Posting enthielt bereits diese Antwort.  >:(
Titel: Re: Konkatenation von Variablennamen
Beitrag von: kevisback am 31.10.05 - 02:36:48
@Tode

Danke fuer die Antwort. Erst sie hat mich weitergebracht  ;D
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 31.10.05 - 09:06:30
Ganz ehrlich, wenn Dir m3s Antwort nicht gereicht hat bist Du evtl. in dem Job falsch..
Titel: Re: Konkatenation von Variablennamen
Beitrag von: kevisback am 31.10.05 - 10:19:02
Ich habs immer so gemacht, wie m3 es gesagt hat.

Ich dachte, dass meine Frage ohne jegliche Wertung haette beantwortet werden koennen und das hat nunmal als einziger Tode gecheckt...
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 31.10.05 - 10:59:44
Und was genau war an der Antwort M3s nicht in Ordnung ???
Titel: Re: Konkatenation von Variablennamen
Beitrag von: kevisback am 01.11.05 - 02:16:18
Na er hat nicht gesagt, wie man eine Konkatenation durchfuehrt...
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 01.11.05 - 09:56:52
Also ganz im Ernst:  >:(
Dafür gibt es
a) die Hilfe
b) wird es in jedem Buch beschrieben
c) wird es in jeder Schulung gelehrt
d) stehn hierzu im Forum bereits tausend Beispiele.

Also hast Du weder a) noch b) noch c) noch d) bemüht.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: kevisback am 01.11.05 - 10:06:08
.....aus folgenden Gruenden:


ad a) zeig mir, wo das steht
ad b) ich komme aus Shanghai -> hier gibts ehrlich keine Lotus Buecher
ad c) siehe b)
ad d) siehe a)


 :-:
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Glombi am 01.11.05 - 10:26:06
Also jetzt kommt mal wieder runter.

@Ghandi:
Das Problem ist nun gelöst und es gibt keinen Grund, hier Kevisback so anzugehen.

@Kevisback:
Das in den Thread ausserdem eine Expertendiskussion zur Extended Class Syntax dabei war, würde ich an Deiner Stelle als Add-On mit nach Hause nehmen und für zukünftige Entwicklungen berücksichtigen.

Andreas
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 01.11.05 - 11:31:37
Also Hilfe:
Über den Designer öffnen
Auf Suche gehen
Concat eingeben
oder String eingeben

Dann werden verschiedene Dinge angezeigt.
Die Hilfe ist DIE Referenz - da stehen alle Basisfunktionen drin - und man muss schon lernen damit umzugehen, wenn man Notes entwickeln will.
Mein Groll richtet sich auch weniger gegen Kevisback als vielmehr gegen die, die hier jemanden Notes entwickeln lassen, ohne ihm wenigstens eine Basisschulung zu spendieren. Das kann nichts werden.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: m3 am 01.11.05 - 12:07:33
.....aus folgenden Gruenden:


ad a) zeig mir, wo das steht
Es muss wirklich schwer sein, in der Notes Designer Hilfe im Index "String Conc" einzugeben. Damit wirst Du nämlich DIREKT auf den Hilfetext "String concatenation operators" geleitet.

Wenn jemand einen Variablennamen dynamisch erzeugen will, gehe ich davon aus, dass Lotusscript nicht seine erste Programmiersprache ist und die Person daher prinzipiell mit einer Online-Hlfe umgehen kann. Daher ist es in meinen Augen nicht vermessen anzunehmen, dass jemand das Kapitel "Lotus Script Language -> Expressions and Operators -> Overview of Expressions and Operators" anschaut. Dort findet sich nämlich auch ein hübsches "String concatenation" Beispiel.

Titel: Re: Konkatenation von Variablennamen
Beitrag von: kevisback am 02.11.05 - 02:12:01
So schlau war ich auch schon, aber meine Frage wurde damit nicht beantwortet.

Nochmal: Tode war der einzige, auch immernoch, der gecheckt hat, was ich meine: eine Variablennamenkonkatenation ohne Umwege. Und das steht so nicht in der Hilfe.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: flaite am 02.11.05 - 05:55:42
Soll jetzt keine persönliche Kritik an dir sein und ich bin auch nicht der größte Diplomat.

Vielleicht hast du dich in diesem Thread sprachlich einfach nicht besonders diplomatisch geäußert ;)
Mit solchen Aussagen wie: der einzige der "es" gecheckt hat, wäre ich ein bischen vorsichtig.

Und:
- es ist hier für Fragenbeantworter manchmal nicht leicht herauszufinden, was der Frager eigentlich will.
- kann es schonmal - und gerade wenn die Frage zu beantwortet sein scheint - sich das Thema - hmm sagen wir - evolutionär weiterentwickelt. Wenn das auf übertriebene Weise geschieht, spricht man von Thread-Hyjacking. Hier erschien mir aber die Frage für mich auch beantwortet. Ausserdem nehme ich an diesem Forum nicht teil, um Kevisback Fragen zu beantworten (was ich natürlich als Nebeneffekt gerne tue), sondern aus letztlich egoistischen Motiven, nämlich um mich selbst fortzubilden. Du hättest ja nochmal nachfragen können.

Also Leute. Ich weiss wovon ich rede. Selbstbeherrschung gehört bislang sicher nicht zu meinen Stärken. Aber seid vorsichtig mit persönlichen Angriffen und "der einzige der es gecheckt hat" ist auch ein persönlicher Angriff. "Such dir einen anderen Job" natürlich auch. Wobei es völlig egal ist wer zuerst mit seiner Sandkastenschippe oder Gießkanne auf den anderen losgegangen ist.

Wenn du die Antworten nicht verstanden hast, kannst du ja nochmal nachfragen. Ich fühle mich auch des öfteren dümmer behandelt als ich eigentlich denke zu sein. Das kann verletzend sein. Das intelligenteste ist aber erstmal zu schweigen. Das renkt sich dann irgendwann ein. Wenn es zu arg wird und um sich selbst vor Magengeschwüren zu schützen, kann man bei Gelegenheit dann später auch schon mal das eine oder andere Mal nachtreten. Aber nicht in einem öffentlichen Forum eine Kulturrevolution gegen die dekadenten Mitglieder-die-schon-eine-Menge-Fragen-zufriedenstellend-beantwortet-haben zu starten, weil sie die Bedürfnisse der Jugend nicht sieht.


Gruß Axel
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Mark³ am 02.11.05 - 08:04:37
für diese Antwort gebe ich dir 5 Punkte  ;D
Titel: Re: Konkatenation von Variablennamen
Beitrag von: Gandhi am 02.11.05 - 08:17:12
Auszug aus der Notes Hilfe:
Zitat
Concatenate two expressions as strings.
Ampersand (&) operator
Syntax
expr1 & expr2
Elements
expr1, expr2
Any String expressions, or any of the following:
Numeric expression: LotusScript converts it to its text representation. In the case of Boolean data types, 0 becomes "False," and any other number becomes "True."
NULL: LotusScript treats it as an zero-length String value when concatenated with the other expression. If both expressions are NULL, the result is NULL.
EMPTY: LotusScript treats it as a zero-length String value.
Return value
The result is a String or a Variant of type String, if either of the operands is a Variant.
Usage
Use the ampersand (&) operator to ensure a concatenation operation. The plus (+) operator also concatenates two character strings, but LotusScript determines whether to interpret the plus as a concatenation operator or an addition operator on the basis of the operands in the expression in which it appears.
Examples
Dim x As Variant
x = 56 & " Baker St."
Print x                         ' Prints "56 Baker St."
anInt% = 123
aString$ = "Hello"
anotherString$ = "world"
varV = NULL
Print aString$ & ", " & anInt% & " " & varV & _
    anotherString$ & "."
' Output: Hello, 123 world.
Plus (+) operator
Syntax
expr1 + expr2
Elements
expr1, expr2
Any String expressions, or any of the following:
Numeric expression: LotusScript converts it to its text representation (if plus is interpreted as concatenation).
NULL: LotusScript treats it as NULL. If either expression is NULL, the result is NULL.
EMPTY: LotusScript treats it as a zero-length String value.
Return value
The result is a String or a Variant of type String, if either of the operands is a Variant.
Usage
Use the ampersand (&) operator to ensure a concatenation operation. The plus (+) operator  concatenates two character strings, but LotusScript determines whether to interpret the plus as a concatenation operator or an addition operator on the basis of the operands in the expression in which it appears.
For example:
Print 100 & "200"
' Output is 100200, because & is always
' a concatenation operator
while
Print 100 + "200"
' Output is 300, because + was interpreted
' as addition operator

Print "100" + "200"
' Output is 100200, because + was interpreted
' as concatenation operator
See Also
Table of string operators
Overview of expressions and operators
String relational(comparison) operators
Ansonsten ist das Thema jetzt für mich erledigt. Viel Spass weiterhin noch.
Titel: Re: Konkatenation von Variablennamen
Beitrag von: koehlerbv am 02.11.05 - 20:28:04
Ich denke, in diesem Thread ist alles gesagt: Frühzeitig hat Martin aka m3 gesagt, wie es funktioniert, Torsten aka Tode hat es weitergehend erläutert, andere haben nun die Dokus regelrecht schon auseinandergeflöht - und alles hilft nichts. Mehr kann man nun nicht mehr beitragen, egal, wer das nun versteht oder nicht.
Dieser Thread ist damit geschlossen.

Danke für das Verständnis.
Bernhard