Autor Thema: erase dutt nett :-(  (Gelesen 4870 mal)

Offline Maverick

  • Aktives Mitglied
  • ***
  • Beiträge: 150
  • Geschlecht: Männlich
  • New day - same shit
erase dutt nett :-(
« am: 17.01.05 - 15:33:32 »
Hallo,

ich hab ein Problem damit, einen Eintrag aus einer Listvariable zu entfernen

Nach dem Lesen mehrer Quellen dachte ich mit folgendem Script weiterzukommen:

...
   Produkt1 = docKundeAlt.TxtProd1
...

Danach zeigt der Debugger ein Variant-Array der Gestalt:

Produkt1       ["Amexco", "Diners", "VISA", "Mastercard",...]
   [ 0 ]              "Amexco"
   [ 1 ]              "Diners"
   [ 2 ]              "VISA"
   [ 3 ]              "Mastercard"
   [ 4 ]              "EC-Cash"
   [ 5 ]              "Schmonz"


aber weiter im Script:

...
   'Bereinigen um Kartenprodukte
   Forall i In Produkt1
      If i = "Amexco" Then Erase Produkt1(i)
   End Forall
...

Und hier passiert es.

In der If...-Zeile bricht die ganze Chose mit ner Type Mismatch Meldung ab.

i ist zu dem Zeitpunkt eine Variant-Var mit dem Inhalt "Amexco"

Hat jemand einen Tip für mich?

Danke und Gruß
Paul
eben war's noch da

Paul    (Server: ja, Clients: zu viele)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: erase dutt nett :-(
« Antwort #1 am: 17.01.05 - 15:36:59 »
Hm, das ist aber keine Listvariable, sondern ein Array, was Du da vor Dir hast. Und Erase kannst Du nur auf ein komplettes Array beziehen, nicht auf einzelne Elemente.

Ich sehe zwei Lösungswege: Entweder Du verwendest tatsächlich eine Listvariable, oder Du schreibst Dir ein "Erase" für einzelne Elemente eines Arrays selber.

Bernhard

Offline Maverick

  • Aktives Mitglied
  • ***
  • Beiträge: 150
  • Geschlecht: Männlich
  • New day - same shit
Re: erase dutt nett :-(
« Antwort #2 am: 17.01.05 - 15:42:38 »
Ne Listvariable ist es doch schon dadurch, dass das Feld Dialogliste ist und Mehrfachwerte zulässt.

Wenn ich das Script mental drauf vorbereite, dass da'n Array kommt

...
Dim Produkt1 List As String
...

kommt schon beim Versuch es zu speichern die Meldung "illegal reference to array or list: PRODUKT1"

*heul*
eben war's noch da

Paul    (Server: ja, Clients: zu viele)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: erase dutt nett :-(
« Antwort #3 am: 17.01.05 - 15:45:52 »
Ne Listvariable ist es doch schon dadurch, dass das Feld Dialogliste ist und Mehrfachwerte zulässt.

Ich befürchte, Du musst da noch ein wenig Nachhilfe aus der DesignerHelp beziehen. Eine Listvariable hat mit Dialoglisten überhaupt nichts zu tun, ja, kann nicht einmal in Notes-Dokumenten gespeichert werden (hat aber trotzdem für viele Zwecke eine enorme Nützlichkeit).

Bernhard

Offline Maverick

  • Aktives Mitglied
  • ***
  • Beiträge: 150
  • Geschlecht: Männlich
  • New day - same shit
Re: erase dutt nett :-(
« Antwort #4 am: 17.01.05 - 16:08:10 »
Was hab ich mich zunächst über Deine Antwort geärgert.

Jetzt, nachdem ich dann aber nochmal ganz "unvereingenommen" in die Quellen schaute, bat ich einen Kollegen, mir vor die Stirn zu klopfen.

Listvariablen sind ja was gaanz anderes.

Insofern danke ich Dir.

:-))))

Grüße
Paul
eben war's noch da

Paul    (Server: ja, Clients: zu viele)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: erase dutt nett :-(
« Antwort #5 am: 17.01.05 - 16:11:50 »
Warum hast Du Dich denn geärgert, Paul ?

Da Du aber einen Bezug zu einem Feld hast, bist Du sicherlich mit einem Array besser bedient. Mit R5 dort wieder Elemente 'rauszukippen, geht ggf. am einfachsten mit einem Evaluate über ein @Trim (@Replace (..)) - das erspart etliche Zeilen Code und Hilfsarrays und Redims usw.

HTH,
Bernhard

Offline Maverick

  • Aktives Mitglied
  • ***
  • Beiträge: 150
  • Geschlecht: Männlich
  • New day - same shit
Re: erase dutt nett :-(
« Antwort #6 am: 17.01.05 - 16:22:30 »
Machen wir es mal nicht dramatischer als es ist.

Ich kam mir mit dem Verweis auf RTFM etwas abgekanzelt vor. Andererseits ertappe ich mich selbst ab und an, einem Anwender gegenüber ähnlich zu reagieren. Hmmmm.

Vergessen !!!

Array ist nun klar. Die günstige Formelbearbeitung auch. Meine Situation ist nur die, dass ich aus einem alten Dokument je nach Produkt unterschiedliche neue Dokumente bauen muss.

OK, Formeln könnten das Splitten noch in der alten Maske machen. Da mag ich aber nicht mehr dran rumschrauben.

Ist ja auch egal, erste Tests  - OHNE LISTVARIABLEN - sehen sehr gut aus.

Topic geschlossen.

Grüße
Paul
eben war's noch da

Paul    (Server: ja, Clients: zu viele)

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: erase dutt nett :-(
« Antwort #7 am: 17.01.05 - 16:23:15 »
Bernhard: Wieso Hilfsarrays und etliche Zeilen? Wenn ich mich nicht täusche, gibts den ArrayGetIndex und den Fulltrim seit R5 (das aber nur der Vollständigkeit halber)
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: erase dutt nett :-(
« Antwort #8 am: 17.01.05 - 16:51:42 »
@Paul: Ich meinte keine Erweiterung der Maske, sondern das Entfernen von nicht gewünschten Elementen in Deinem LS-Code:

BereinigtesArray = Evaluate (@Trim (@Replace (KomplettesArray; UnerwünschterWert; ""))

@Jens: So eine DeleteElement-Routine schreibt man ja sinnigerweise nicht jedes Mal neu. Daher würden es schon ein paar mehr Zeilen, wenn man das ganze professionell angeht:
ArrayGetIndex setzt immer ein Array als zu prüfende Daten voraus. Und das muss ja nicht in jeder Situation gegeben sein. Ergo sind schon mal Prüfungen angesagt. Dann kann es sein, dass mein zu bereinigendes Array nicht unbedingt Strings enthält.
Und FullTrim ist erst seit R6.0.1 (CF1 ?) bugfrei und daher für mich tabu (in solch allgemeinen Routinen).

Bernhard

Offline Maverick

  • Aktives Mitglied
  • ***
  • Beiträge: 150
  • Geschlecht: Männlich
  • New day - same shit
Re: erase dutt nett :-(
« Antwort #9 am: 17.01.05 - 18:07:29 »
Dank Dir,

es geht leider nicht darum, nur mal so'n array zu bereinigen. Jetzt, da ich das Gefühl, dass Du Dich ganz doll nett um mich kümmerst, sollst Du die ganze Wahrheit erfahren. :)

In einer DB aus uralten Zeiten hatten meine Kollegen die Chance alle Kundeninfos in einem Dok zusammenzutragen.

Sie hatten demnach auch ein Feld Produkt1, in welches sie alle Produkte eingetragen haben, die der Kunde von uns hat. Über die Jahre sind dort nun Einträge drin wie
"Mastercard, VISA, Software1, Software2 ,..."

In der neuen Anwendung wollen wir nun je nach Produkteigenschaft eigene Doks einsetzen, für alle Karten eines, für Software ein anderes. Natürlich holt sich jedes neue Dok auch unterschiedliche Feldwerte zusätzlich aus dem alten.

Zunächst gilt es, alle Nicht-Karten-Dokumente anzulegen:


Sub Initialize
   Dim session As New NotesSession
   Dim dbAlt As NotesDatabase
   Dim dbNeu As NotesDatabase
   Dim view As NotesView
   Dim coll As NotesDocumentCollection
   Dim j As Integer
   Dim docKundeAlt As NotesDocument
   Dim docKundeNeu As Notesdocument
   Dim dateTime As New NotesDateTime("01/01/1995")
   Dim selection As String

   Set dbNeu = session.CurrentDatabase
   Set dbAlt = session.GetDatabase ("...","vst\ebl.nsf")
   
   selection = |Form="Erfassung"|
   
   Set coll = dbAlt.Search(selection, dateTime, 0)
   
   For j = 1 To coll.Count
      Set docKundeAlt = coll.GetNthDocument(j)
      'Hole die Werte aus dem alten Dokument
      HKT =docKundeAlt.HKT
      Produkt1 = docKundeAlt.TxtProd1

      'Wenn in Produkt1 ein Produkt vorhanden ist,
      If Produkt1(0)  <>"" Then
         'bewege dich durch alle Produkte
         Forall Prod In Produkt1
            If Prod ="Amexco" Then Goto Marke1
            If Prod ="Diners" Then Goto Marke1
            If Prod ="EUROCARD" Then Goto Marke1
            If Prod ="VISA" Then Goto Marke1
            'Kundendokument anlegen und Felder füllen
            Set docKundeNeu = New NotesDocument(dbNeu)
            docKundeNeu.Form = "Produkt"
            docKundeNeu.HKT = HKT
            docKundeNeu.Produkt = Prod
            'Sichere das Kundendokument
            Call docKundeNeu.Save(True, True)
Marke1:
         End Forall
      End If
   Next
End Sub


OK, das mit der Sprunganweisung ist nicht schick, aber dieses Codeschnipsel erfüllt seinen Zweck.

Dein Tip mit dem Bereinigen des Array müsste ich für vier unerwünschte Kartenprodukte auch vier mal durchführen. Ich weiß, dass das auch eleganter geht. :-)

Was ich mit Erweiterung der Quellmaske meinte, war, aus diesem Feldwert soviele einzelne Felder zu machen, wie Einträge drin sind. Aber das wäre noch weniger ruhmreich.

Gruß
Paul

Viel Text?? Du wolltest es nicht anders.  :)
eben war's noch da

Paul    (Server: ja, Clients: zu viele)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: erase dutt nett :-(
« Antwort #10 am: 17.01.05 - 23:22:45 »
Ich kümmere mich doch immer ganz doll nett  ;) Da ich dabei auch immer meine ehrliche Meinung sage, fühlt sich nur der eine oder andere auf den Schlips getreten  ;D Dem gegenüber steht meine Einsichtsfähigkeit - wenn ich mal über's Ziel hinausschiesse, sehe ich das auch gerne ein und tue dies kund.

Irgendwie stellt sich mit Deinem letzten Posting Dein Problem aber ganz anders dar. Ich versuche mal, das ganze in ein anderes Konzept zu giessen. Als Massgabe habe ich verstanden, dass aus der alten DB jedes Dokument zu einem / mehreren neuen Produkt-Doks werden soll, wobei Karten zu einem anderen Dokumenttyp als andere Produkte werden sollen.

Deinen Code habe ich mal ein wenig umgestellt. Als wichigste Änderung möchte ich neben dem Wegwurf einiger unnötiger Vars und den GOTOs auf die Vermeidung der Performance-Bremse mit NBotesDocumentCollection.GetNthDocument hinweisen (wenn da mehrere Tausend Docs enthalten sind, schlafen der Routine die Füsse ein !).

Okay, hier ist jetzt "the Chiemgau proposal":
Code

OPTION DECLARE

Sub Intialize	

	Const CARDPRODUCTS = "AmexCo~~Diners~~EUROCARD~~VISA~~"
	
	Dim session As New NotesSession
	Dim dbAlt As NotesDatabase
	Dim dbNeu As NotesDatabase
	Dim coll As NotesDocumentCollection
	Dim docKundeAlt As NotesDocument
	Dim docKundeNeu As Notesdocument
	Dim dateTime As New NotesDateTime ("01/01/1995")
	Dim selection As String
	
	Set dbNeu = session.CurrentDatabase
	Set dbAlt = session.GetDatabase ("...","vst\ebl.nsf")
	
	selection = |Form="Erfassung"|
	
	Set coll = dbAlt.Search (selection, dateTime, 0)
	
	If coll.Count = 0 Then										'Nix zu tun ...
		Exit Sub		
	End If
	
	Set docKundeAlt = coll.GetFirstDocument
	While Not (docKundeAlt Is Nothing)
		
      	'Hole die Werte aus dem alten Dokument		'Unnötig ....
		'HKT =docKundeAlt.HKT
		'Produkt1 = docKundeAlt.TxtProd1
		
		'Wenn in Produkt1 ein Produkt vorhanden ist,
		If docKundeAlt.TxtProd1 (0)  <> "" Then
		'bewege dich durch alle Produkte
			Forall Prod In docKundeAlt.TxtProd1
				
				Select Case Instr (Ucase (CARDPRODUCTS), Ucase (Prod) & "~~")
					
				Case 0: 
					'Erstelle Dein Nicht-Kartenprodukt-Dokument
					'Kundendokument anlegen und Felder füllen
					Set docKundeNeu = New NotesDocument (dbNeu)
					docKundeNeu.Form = "Produkt"
					docKundeNeu.HKT = docKundeAlt.HKT
					'docKundeNeu.Produkt = docKundeAlt.TxtProd1		Ist das denn richtig ? Muss es nicht heissen:
					docKundeNeu.Produkt = Prod
					'Sichere das Kundendokument
					Call docKundeNeu.Save(True, True)
					
				Case Else
					'Erstelle Dein Kartenprodukt-Dokument
					
				End Select
				
			End Forall
		End If
		
		Set docKundeAlt = coll.GetNextDocument (docKundeAlt)
	Wend
Exit Sub

HTH,
Bernhard

Offline Maverick

  • Aktives Mitglied
  • ***
  • Beiträge: 150
  • Geschlecht: Männlich
  • New day - same shit
Re: erase dutt nett :-(
« Antwort #11 am: 18.01.05 - 11:40:25 »
Autsch,

da hab ich mir beim Kniefall fast die Patella rausgefetzt.

Danke Dir, das ist die elegante Lösung, von der ich sprach.

Eigentlich hatte ich schon alles fertig. Dir zu Ehren kommt jetzt trotzdem Deine Lösung zum Tragen.

Ich bin ja gar nicht so.  ;D

Grüße
Paul

PS: Du hast Dein Arbeitsplatz echt am Chiemsee? Ihr sucht nicht gerade Leute, oder?
eben war's noch da

Paul    (Server: ja, Clients: zu viele)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz