Autor Thema: Feldinhalt per Script mit Replace verändern  (Gelesen 3969 mal)

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Feldinhalt per Script mit Replace verändern
« am: 21.07.05 - 18:12:04 »
Hi,

ich versuche gerade ein Feld per Script zu verändern. Ich frage dazu den alten und den neuen Namen ab und versuche dann den Inhalt des Feldes zu verändern, falls der Name darin auftaucht.

Code
Dim ws As New NotesUIWorkspace
	Dim session As New NotesSession
	Dim db As notesdatabase
	Dim collection As NotesDocumentCollection
	Dim doc As NotesDocument
	Set db = session.CurrentDatabase
	Set collection = db.UnprocessedDocuments
	Set doc = collection.GetFirstDocument()
	
	Dim oldname As String
	Dim newname As String
	oldname = ws.Prompt (PROMPT_OKCANCELEDIT, 	"Old user name", 	"Type or change the old name in the box below.")
	newname = ws.Prompt (PROMPT_OKCANCELEDIT, 	"New user name", 	"Type or change the new name in the box below.")
	
	While Not(doc Is Nothing)
		Dim oldAgents As Variant
		oldAgents = doc.Agents
		
		newAgents = Replace (oldAgents, oldname, newname)
		doc.Agents = newAgents
		Call doc.Save( True, True )
		Set doc = collection.GetNextDocument(doc)

Leider gelingt mir das ganze nicht so recht.
Der Debugger zeigt mir zwar die Daten an aber Replace macht garnichts.  :(

Hat jemand von Euch vielleicht eine Idee?

cu
Sebastian
« Letzte Änderung: 22.07.05 - 12:02:10 von SKL74 »
Domino, Notes, Sametime

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #1 am: 21.07.05 - 20:07:29 »
Es kann sein, dass oldname und newname explizit Arrays sein müssen.
Die Funktion replace ist wie folgt spezifiziert:
Code
Replace(sourceArray as Variant, findArray as Variant, replacementArray as Variant[, start as Integer[, count as Integer[, compMethod as Integer]]]) as Variant

findArray und replacementArray sind bei dir aber Strings.
Vielleicht so:

Code
Dim oldName(0) as String
Dim newName(0) As String
oldname(0) = ws.Prompt (PROMPT_OKCANCELEDIT,  "Old user name",  "Type or change the old name in the box below.")
newname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "New user name", "Type or change the new name in the box below.")

Ja. Habs ausprobiert:

1. Version:
Code
Sub Initialize
	
	Dim arExist (1) As String
	Dim arFind(0) As String
	Dim arReplace(0) As String
	
	
	Dim res As Variant
	
	arExist(0) = "rot"
	arExist(1) = "blau"
	
	'arFind(0) = "blau"
	'arReplace(0) = "gelb"
	
	
	res = Replace(arExist, arFind, arReplace)
	
	Forall x In res
		Print x
	End Forall
End Sub
funktioniert.

2. Kein Fehler vom Kompiler oder Runtime gemeldet. Trotzdem Effekt wie bei dir:
Code
Sub Initialize
	
	Dim arExist (1) As String
	'Dim arFind(0) As String
	'Dim arReplace(0) As String
	Dim arFind As String
	Dim arReplace As String 
	
	
	Dim res As Variant
	
	arExist(0) = "rot"
	arExist(1) = "blau"
	
	'arFind(0) = "blau"
	'arReplace(0) = "gelb"
	arFind = "blau"
	arFind="gelb"
	
	
	res = Replace(arExist, arFind, arReplace)
	
	Forall x In res
		Print x
	End Forall
	
	
	
End Sub

Das generiert einen Kompilierfehler:
Code
Sub Initialize
	
	Dim arExist (1) As String
	Dim arFind As Variant
	Dim arReplace As Variant
	
	
	Dim res As Variant
	
	arExist(0) = "rot"
	arExist(1) = "blau"
	
	arFind = "blau"
	arFind="gelb"
	
	
	res = Replace(arExist, arFind, arReplace)
	
	Forall x In res
		Print x
	End Forall
	
	
	
End Sub
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Glombi

  • Gast
Re: Feldinhalt per Script mit Replace verändern
« Antwort #2 am: 21.07.05 - 20:08:32 »
Replace erwartet jeweils Arrays. Daher würde ich es mal wie folgt versuchen:

Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As notesdatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument()

Dim oldname(0) As String
Dim newname(0) As String
oldname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "Old user name", "Type or change the old name in the box below.")
newname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "New user name", "Type or change the new name in the box below.")

While Not(doc Is Nothing)
Dim oldAgents As Variant
oldAgents = doc.Agents

newAgents = Replace (oldAgents, oldname, newname)
doc.Agents = newAgents
Call doc.Save( True, True )
Set doc = collection.GetNextDocument(doc)

Andreas

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #3 am: 21.07.05 - 20:13:30 »
genau das gleiche, was ich auch gesagt habe  ;D
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #4 am: 21.07.05 - 21:12:22 »
Ich finde das übrigens ziemlich unlogisch von der Sprache Basic her.
Ich kann einer Variant-Variablen kein String zuweisen. Weil String kein Objekt ist? und Variant nur Objekttypen aufnimmt?
Wenn dies so ist.
Dann müsste schon der Compiler einen Funktionsaufruf
Code
 
replace (Variant, string, String) 
zurückweisen,
wenn die korrekte Funktionssignatur
Code
replace (variant, variant, variant) 
heisst
und es eine Funktion mit der Signatur: 
Code
 
replace (Variant, string, String) 
nicht gibt.
« Letzte Änderung: 21.07.05 - 21:14:19 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Glombi

  • Gast
Re: Feldinhalt per Script mit Replace verändern
« Antwort #5 am: 21.07.05 - 22:36:30 »
genau das gleiche, was ich auch gesagt habe  ;D
Was erlauben Keeenwooort  ;D

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #6 am: 22.07.05 - 06:35:58 »
genau das gleiche, was ich auch gesagt habe  ;D
Was erlauben Keeenwooort  ;D
Huiiiii. Jetzt läßt du aber die Sau raus.
Im Grunde ist das aber ein fair deal: Ich nehme dieses Forum nicht ernst, das Forum nimmt mich nicht ernst.
Auf dieser Basis können wir weiterarbeiten.
Relax.
« Letzte Änderung: 22.07.05 - 06:57:18 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Glombi

  • Gast
Re: Feldinhalt per Script mit Replace verändern
« Antwort #7 am: 22.07.05 - 08:30:26 »
He Axel, war ja gar nicht böse gemeint  ;)

Andreas

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Re: Feldinhalt per Script mit Replace verändern
« Antwort #8 am: 22.07.05 - 09:16:57 »
Guten Morgen,

erst mal vielen Dank für Eure schnellen und ausführlichen Antworten.
Auch wenn der Thread mittlerweile etwas Eigendynamik entwickelt hat.  ;)

Werde alles mal versuchen, dann versuchen es zu verstehen und dann hier posten.

cu
Sebastian
« Letzte Änderung: 22.07.05 - 09:39:04 von SKL74 »
Domino, Notes, Sametime

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Re: Feldinhalt per Script mit Replace verändern
« Antwort #9 am: 22.07.05 - 09:45:53 »
Habe jetzt mal das Script von Glombi genommen.

Code
Dim ws As New NotesUIWorkspace
	Dim session As New NotesSession
	Set db = session.CurrentDatabase
	Set collection = db.UnprocessedDocuments
	Set doc = collection.GetFirstDocument()
	
	'Get the names from the user
	oldname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "Old user name", "Type or change the old name in the box below.")
	newname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "New user name", "Type or change the new name in the box below.")
	
	While Not(doc Is Nothing)
		'Get the old Agents field
		oldAgents = doc.Agents
		'Change the username
		newAgents = Replace (oldAgents, oldname, newname)
		doc.Agents = newAgents
		Call doc.Save( True, True )
		Set doc = collection.GetNextDocument(doc)
	Wend

Funktioniert so wie gewünscht. Und ich hoffe es auch verstanden zu haben.

Müssen die Arrays nicht dimensioniert werden?
oldname und newname enthalten ja jeweils nur ein Element. Was aber, wenn oldAgents mehrere Elemente enthält? Werde dann alle überprüft oder nur das Erste?

Ganz schön schwierig so ein Array.  ;)

cu
Sebastian
Domino, Notes, Sametime

Glombi

  • Gast
Re: Feldinhalt per Script mit Replace verändern
« Antwort #10 am: 22.07.05 - 09:49:02 »
Du hast meine Dimensionierungen weggelassen  ;)

Dim oldname(0) As String
Dim newname(0) As String

Was Replace mit Arrays veranstaltet sagt die Hilfe:
Replace(sourceArray as Variant, findArray as Variant, replacementArray as Variant[, start as Integer[, count as Integer[, compMethod as Integer]]]) as Variant
Elements
sourceArray
Array of type String containing the strings to be modified
replaceArray
Array of type String containing the words or phrases to be replaced
replacementArray
Array of type String containing the replacement words or phrases
start
optional Integer specifying the character position to start at in each String
count
optional Integer specifying the maximum number of replacements to make.
compMethod
Optional Integer specifying the type of comparison to use when searching for the delimiter, if the elements are strings.
Number   Comparison Mode
0    case sensitive, pitch sensitive
1    case insensitive, pitch sensitive
4    case sensitive, pitch insensitive
5    case insensitive, pitch insensitive
If you omit compMethod, the default comparison mode is the mode set by the Option Compare statement for this module. If there is no statement for the module, the default is case sensitive and pitch sensitive.
Return value
Replace returns an Array of type String that contains sourceArray, where any values in replaceArray have been replaced by the corresponding values in replacementArray.
Usage
Replace searches the String in sourceArray for the String in replaceArray. If a match is found, the substring is replaced with a corresponding substring from replacementArray. Each String in replaceArray is scanned against each String in sourceArray as modified by prior substitutions. Replace is case sensitive.
If no matches are found, then a copy of sourceArray is returned.
If more strings are specified in replaceArray than in replacementArray, the extra strings in replaceArray are replaced with the last string in replacementArray. Extra strings in replacementArray are ignored.


Andreas

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Re: Feldinhalt per Script mit Replace verändern
« Antwort #11 am: 22.07.05 - 10:06:12 »
Du hast meine Dimensionierungen weggelassen  ;)


Sorry, waren unter Declarations und ich hatte vergessen die zu kopieren.

Code
Sub Initialize
	Dim ws As New NotesUIWorkspace
	Dim session As New NotesSession
	Dim db As notesdatabase
	Dim collection As NotesDocumentCollection
	Dim doc As NotesDocument
	Set db = session.CurrentDatabase
	Set collection = db.UnprocessedDocuments
	Set doc = collection.GetFirstDocument()
	
	'Get the names from the user
	Dim oldname(0) As String
	Dim newname(0) As String
	oldname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "Old user name", "Type or change the old name in the box below.")
	newname(0) = ws.Prompt (PROMPT_OKCANCELEDIT, "New user name", "Type or change the new name in the box below.")
	
	While Not(doc Is Nothing)
		
		'Get the Agents field
		Dim oldAgents As Variant
		oldAgents = doc.Agents
		
		'Change the username
		newAgents = Replace (oldAgents, oldname, newname)
		
		'Set the Agents field
		doc.Agents = newAgents
		Call doc.Save( True, True )
		Set doc = collection.GetNextDocument(doc)
	Wend
End Sub


Hilfe habe ich gelesen und so verstanden, dass das gesamte Array verglichen wird. Egal wieviele Elemente und dass dann einzelne Elemente replaced werden.

Aber es werden die Arrays als Variant erwartet. Warum dann Dim oldname as String?

Sebastian
« Letzte Änderung: 22.07.05 - 10:10:41 von SKL74 »
Domino, Notes, Sametime

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #12 am: 22.07.05 - 10:26:09 »
nicht Dim oldname as String. Sondern Dim oldname(0) as String. Das ist ein somit als Array von String deklariert und nicht als String. Das ist etwas anderes.
Variant ist eine Art Superklasse von Arrays (und anderen Objekt-Datentypen).
JEDER String-Array is-a Variant.
Eben nur ein speziellerer Variant.
Wenn ich jetzt noch den Dreh mit der Liskov Substitution hinkriegen würde.  >:(
Aber ich lasse das und würde vielleicht Unsinn reden.

Der Kontrakt von der Signatur der Methode sagt ja:
replace (Variant, Variant, Variant).
Der zweite und dritte Parameter, die du übergibst sind String-Arrays.
Oben habe ich festgestellt, dass String-Array is-a-Variant.
Also ist der Kontrakt der Signatur vom Caller (=dein Skript) erfüllt.
Mich wundert nur, dass bei replace (Variant, String, String) der Compiler keinen Fehler meldet.

Denk dir Variant einfach nicht als Datentyp sondern als Klammer über mehrere Datentypen. D.h. eine als Variant deklarierte Variable kann so einiges beinhalten. Unter anderem auch Arrays.
« Letzte Änderung: 22.07.05 - 10:35:04 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Re: Feldinhalt per Script mit Replace verändern
« Antwort #13 am: 22.07.05 - 12:01:58 »
Danke Dir.

Könnte sein, dass ich es verstanden habe.
Zumindest bis zum nächsten Problem.  ;)

cu
Sebastian
Domino, Notes, Sametime

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #14 am: 22.07.05 - 23:47:23 »
Liskov Substition Principle:
FUNCTIONS THAT USE POINTERS OR REFERENCES TO BASE CLASSES MUST BE ABLE TO USE OBJECTS OF DERIVED CLASSES WITHOUT KNOWING IT.

Variant ist Base Klasse zu Array_Of_Strings. Array_Of_Strings ist ein Spezialfall von Variant.
Die Funktion replace muß also in der Lage sein, statt Variant array_of_strings zu verarbeiten.

Interessanterweise ist die Funktion replace ein Verstoß gegen Liskov Substitution. In Variant kann ja auch z.B. auch ein Objekt der Klasse NotesDocument verwiesen werden. Damit würde aber die Funktion nicht funktionieren. Sie kann also bestimmte Objekte von Child-Klassen von Variant nicht benutzen. Aber so ist das eben in Basic.
http://www.objectmentor.com/resources/articles/lsp.pdf


« Letzte Änderung: 23.07.05 - 00:15:08 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Feldinhalt per Script mit Replace verändern
« Antwort #15 am: 23.07.05 - 01:26:01 »
Vollkommene Zustimmung, Axel. Und nicht nur Replace ist eine "üble" Funktion, die mit heisser Nadel gestrickt zu sein scheint, auch andere Array-bezogene functions "leiden" darunter.

Ich verwende aus sehr gutem Grunde bereits seit R5 bestimmte Funktionen überhaupt nicht, sondern verlasse mich da ausschliesslich auf eigenen Code, der teilweise seit 1997 (algorithmisch) unverändert läuft und weit über diese LS-"Erweiterungen" hinausgeht.

Beispiel ArrayAppend: Warum muss ich mich beim Aufruf darum kümmern, dass das Zielarray schon gefüllt ist ? So ein Blödsinn. Das hat in diesem Fall die Function erstmal zu bilden.

Aber: Man kann es nutzen - muss es aber nicht.

Bernhard

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Re: Feldinhalt per Script mit Replace verändern
« Antwort #16 am: 23.07.05 - 10:49:08 »
@Bernhard

Und was empfiehlst Du mir als Lainen? Ich versuche gerade mal die Funktionen zu verstehen, anstatt eigenen Code zu erstellen, der die Unzulänglicheiten der Vorgaben aushebelt.

Stell doch mal Deine Version heir rein. Vielleicht ist die ja verständlicher ...  ???

cu
Sebastian
Domino, Notes, Sametime

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Feldinhalt per Script mit Replace verändern
« Antwort #17 am: 23.07.05 - 11:19:59 »
Naja. Wenn du diese Funktion so benutzt wie von Andreas G. und mir beschrieben, dann geht das schon.
Liskov Substitution ist ja mehr ein theoretisches Analyse-Mittel zum besseren Verständnis. Wenn man den Fallstrick kennt, dass Arrays reinmüssen wo Variant draufsteht, dann sollte das schon passen.
In jeder Programmiersprache und jeden Framework gibt es aus Gründen, die uns sowieso unbekannt sind, irgendwelche Fallstricke und Unsauberkeiten.
Einfach nur ein paar Beispiele dafür, dass die Welt nicht nur bei Iris z.T. unheil ist:

- Z.B. sind manche Zusatzfeatures von Java5 nicht nur meiner Meinung nach ein bischen komisch in der Bedienung. Sun begründet das ziemlich ausführlich mit hauptsächlich Gründen der Abwärtskompatibilität.
- Ein anderes Beispiel ist die Implementierung von Class Loading in verschiedenen J2EE Servern.
- Oder ich verstehe nicht, warum ich bei Spring ein circular reference Exception aus dem Inversion-Of-Control Teil bekomme, obwohl die Entwickler behaupten, dass dies nicht auftreten sollte (benutze noch eine ein bischen veraltete Version).
- oder ich selbst hab jetzt ein ca 50 zeiliges (Kommentarzeilen, log-Statements und ha(!) assertions nicht mitgezählt) Transaktionsskript geschrieben, weil ich mit der super-brilliant-cachenden-OO-konformen Superlösung in eine Art Urwald geraten bin, aus dem ich nicht mehr so recht rausgefunden habe  ;D . Mach ich vielleicht später oder nie. Immerhin werden in den 50 Zeilen nach Logik ca. 10 verschiedene Inserts, Selects, Updates, Deletes gegen ca. 5 verschiedene Views und Tables gefahren und zwar in einer Transaktionsklammer und mit Ausnutzung eher fortgeschrittener Features von Posgres8.0 (via Dao-Schicht, springframework und IBatis-SQLMaps). und es ist sicher nicht unübersichtlicher als 50 Zeilen prozeduraler LotusScript Code, aber eben auch nicht übersichtlicher. Oder ich pack das teilweise in eine stored procedure.

Nur find ich es eben manchmal ganz gut, dass man sich den Maßstäben einer heilen, ideasierten Welt bewußt ist. Sonst türmt sich nämlich irgendwann der Müll dermassen auf, dass er umkippt und einen erschlägt. Ein bischen Müll ist aber immer da.

Amen Axel
« Letzte Änderung: 23.07.05 - 11:30:39 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz