Autor Thema: neu Nummerierung in einer Maske  (Gelesen 14337 mal)

7Stein

  • Gast
neu Nummerierung in einer Maske
« am: 27.08.04 - 09:44:44 »
Habe eine Bestellung, kann einen Artikel aus der Bestellung löschen, und danach sollen halt die Positionsnummern der Bestellung neu durchgezählt werden.
Was ist an diesem Codebeispiel falsch?
Code
   thisDoc.LastDetailPos= collection.count
   Call thisdoc.Save(True, True)
         If thisDoc.LastDetailPos(0) > 1 Then         
   For i = 1 To collection.count
      Set docdetail = collection.GetNthDocument(i)
      docDetail.Pos = i
      Call docDetail.Save( True, True )
   Next
            thisDoc.LastDetailPos = collection.count
Else
   thisDoc.LastDetailPos = 0            
End If         
   
   
   
   Call viewForRefresh.Refresh()
   Call uiDoc.Refresh()
End If


Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Woher sollen wir das denn ohne genaue Fehlerbeschreibung ...
« Antwort #1 am: 27.08.04 - 09:48:41 »
wissen? Auf den erste nschnellen Blick schaut der doch brauchbar aus.

Bitte, wie beim letzten Mal such dir erst einmal die Bücher vom Herdt Verlag raus, mach die Kurse durch und fang dann das Entwickeln an.

Thomas
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

7Stein

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #2 am: 27.08.04 - 09:50:27 »
na da kommt ja keine Fehlermeldung, er macht es einfach nicht!

P.S. Habe mir ein Buch bestellt, ist aber noch nicht da, und wenn es da ist, werde ich euch hier nicht mehr "belästigen"!!!!!

Glombi

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #3 am: 27.08.04 - 09:58:11 »
Das Script ist ok, wenn auch nicht besonders performant bei vielen Positionen (aber das ist ein anderes Thema).

Ist das jetzt nur ein Beispiel oder ein Auszug aus dem richtigen Code. Es fehlt ja wohl der Anfang, wo die Collection aufgebaut wird.

Gibt es die Felder Pos und LastDetailPos?

Was sagt der Debugger?

Andreas

7Stein

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #4 am: 27.08.04 - 10:06:46 »
der Debugger sagt :
Zitat
Script debugger cannot debug the current object in a dialog.Script debugger will be disabled until dialog is closed.
/quote]
Der komplette Code für dei Action"Artikel löschen" sieht so aus:
Code
Sub Click(Source As Button)
   Dim collection As NotesDocumentCollection
   Dim docDetail As NotesDocument      
   Dim viewForRefresh As NotesView   
   Dim strPos As String   
   
   Dim i As Integer
   
   Set viewForRefresh = db.GetView( "(BestellPositionen)" )
   Set view2 = db.GetView( "(BestellPositionenByKey)")
   Call view2.Refresh()
   Set collection = view2.GetAllDocumentsByKey(thisDoc.UniversalID)
   
   Select Case collection.Count
   Case 0:
      Msgbox "Keine Position vorhanden.", 48, db.title   
   Case 1:   
      Set docDetail = collection.GetFirstDocument
      Call docDetail.Remove (True)
   Case Else:
      strPos = Inputbox$( "Welche Position löschen?", "Position löschen", "1" )
      If strPos <> "" Then 
         Call view2.Refresh()
         Set docDetail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + strPos )
         Call docDetail.Remove( True)   
      End If
   End Select      
   
   REM Positionen neu durchnummerieren
   Set collection = db.Search( |Form = "BestandsabfrageDetail" & ParentUNID = "| + thisDoc.UniversalID + |"|, Nothing, 0 )
   thisDoc.LastDetailPos= collection.count
   Call thisdoc.Save(True, True)
   If thisDoc.LastDetailPos(0) > 1 Then         
      For i = 1 To collection.count
         Set docdetail = collection.GetNthDocument(i)
         docDetail.Pos = i
         Call docDetail.Save( True, True )
      Next
      thisDoc.LastDetailPos = collection.count
   Else
      thisDoc.LastDetailPos = 0            
   End If         
   
   
   
   Call viewForRefresh.Refresh()
   Call uiDoc.Refresh()
   
End Sub

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re:neu Nummerierung in einer Maske
« Antwort #5 am: 27.08.04 - 10:25:37 »
Hi,

auf den ersten Blick sieht das Script ganz ok aus. Da der Debugger sich weigert, solltest du dir an den entsprechenden Stellen des Scrptes Messageboxen einbauen um die Variablen so zu kontrollieren.

Andere Alternative wäre den Code in eine Ansichtenaktion zu packen und in dann auszuführen, denn damit lässt sich der Debugger zur Zusammenarbeit überreden.

 
Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Glombi

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #6 am: 27.08.04 - 10:35:22 »
Man bekommt ja kaum Infos !
Welcher case Fall wird denn ausgeführt  ???

Select Case collection.Count
   Case 0:
      Msgbox "Keine Position vorhanden.", 48, db.title  
   Case 1:  
      Set docDetail = collection.GetFirstDocument
      Call docDetail.Remove (True)
   Case Else:
      strPos = Inputbox$( "Welche Position löschen?", "Position löschen", "1" )
      If strPos <> "" Then
         Call view2.Refresh()
         Set docDetail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + strPos )
         Call docDetail.Remove( True)  
      End If
   End Select      

7Stein

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #7 am: 27.08.04 - 10:44:58 »
der case else Fall.
Es sind mehrere Positionen vorhanden, eine davon soll gelöscht werden und dann sollen die Positionsnummern wieder neu durchnummeriert werden, also bei z.B. 6 Positionen wird Pos 3 gelöscht, und dann sollen die Positionen nicht 1,2,4,5,6 lauten, sonern 1,2,3,4,5.

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re:neu Nummerierung in einer Maske
« Antwort #8 am: 27.08.04 - 10:55:52 »
Hi,

wo klemmt's denn genau?   ???

Werden die Dokumente gelöscht oder geht nur die Neunumerierung nicht? Ohne genauere Infos können wir hier nur sehr schwer helfen.

Wie gesagt, versuch doch mal mit Messagebox - Anweisungen den Programmablauf zu analysieren.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

7Stein

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #9 am: 27.08.04 - 10:58:50 »
Dokumente werden gelöscht, sind in der Anzeige nicht mehr zu sehen, aber die Nummerierung funktioniert dann eben nicht.

Bin noch bei dem Test mit Messageboxen.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:neu Nummerierung in einer Maske
« Antwort #10 am: 27.08.04 - 11:00:35 »
Wenn wir helfen sollen, brauchen wir endlich Infos von Dir. Was sagt der Debugger (nachdem Du den Code in eine Aktion gepackt hast), oder: Wie sind entscheidendem Moment die Variablen belegt. Usw. usf.

Und: Du hast ein prinzipielles Problem, was mit Notes nix zu tun hat: Der Ansatz Deiner Positionsnummern-Lösung ist falsch.
1. Die Sache ist extrem inperformant.
2. Wenn schon diese Lösung - Warum numerierst Du alles neu um anstatt sich die gelöschte PosNo zu merken und dann alle höheren vorhanden Nummern um eins zu dekrementieren ?
3. Deine PosNos sind durch Dein Verfahren sowieso wertlos. Da Du alles umnumerierst und die Collection Dir keine bestimmte Reihenfolge garantiert, kann es sein, dass Du so mal aus der Nummer 1 die Nummer 6 machst und aus dieser bei der nächsten Aktion die Nummer 3. Warum speicherst Du dann überhaupt die Nummern in den Dokumenten und berechnest diese nicht nur für die Anzeige ?

Diese prinzipielle Problematik halte ich für gravierender als Deine aktuell vorhandenen Schwierigkeiten mit der Notes-Programmierung.

Bernhard

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re:neu Nummerierung in einer Maske
« Antwort #11 am: 27.08.04 - 11:02:07 »
Ok da ist ein massiver Fehler drin und dann noch ein Menge Folgefehler:
Wo wird denn bitteschön Thisdoc definiert?
Daraus ergeben sich Etliche Folgefehler. Ich hab mal alles was mir Spanisch vorkommt GROSSGESCHRIEBEN.

Sub Click(Source As Button)
   Dim collection As NotesDocumentCollection
   Dim docDetail As NotesDocument    
   Dim viewForRefresh As NotesView  
   Dim strPos As String
   
   Dim i As Integer
   
   Set viewForRefresh = db.GetView( "(BestellPositionen)" )
   Set view2 = db.GetView( "(BestellPositionenByKey)")
HIER SIND LAUFZEITPROBLEME BEI VIELEN DOKUMENTEN IN DER DATENBANK ZU ERWARTEN
   Call view2.Refresh()
HIER HAST DU DEINEN KARDINALFEHLER
   Set collection = view2.GetAllDocumentsByKey(thisDoc.UniversalID)
   
DAS HIER KANN NICHT LAUFEN WEIL ER GAR KEINE COLLECTION HABEN KANN SIEHE OBEN
   Select Case collection.Count
   Case 0:
      Msgbox "Keine Position vorhanden.", 48, db.title
   Case 1:
      Set docDetail = collection.GetFirstDocument
      Call docDetail.Remove (True)
   Case Else:
      strPos = Inputbox$( "Welche Position löschen?", "Position löschen", "1" )
      If strPos <> "" Then
         Call view2.Refresh()
         Set docDetail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + strPos )
         Call docDetail.Remove( True)  
      End If
   End Select      
   
   REM Positionen neu durchnummerieren
LOGIKFEHLER, WIESO BAUST DU DIE COLLECTION ÜBER EINEN DB.SEARCH NEU AUF DIE GIBT ES DOCH SCHON.
LAUFZEITPROBLEME GIBT ES DA UNTER UMSTÄNDEN AUCH

   Set collection = db.Search( |Form = "BestandsabfrageDetail" & ParentUNID = "| + thisDoc.UniversalID + |"|, Nothing, 0 )
NETT ABER WARUM SPEICHERST DU DAS HIER AB?
   thisDoc.LastDetailPos= collection.count
   Call thisdoc.Save(True, True)
WENN DU ES HIER DIREKT VERGLEICHEN KÖNNTEST!
   If thisDoc.LastDetailPos(0) > 1 Then        
      For i = 1 To collection.count
         Set docdetail = collection.GetNthDocument(i)
         docDetail.Pos = i
         Call docDetail.Save( True, True )
      Next
ACH JA UND DAS HIER IST AUCH IDIOTISCH, WARUM SETZT DU EINEN WERT DEN DU SCHON GESETZT HAST IMMER WIEDER?
      thisDoc.LastDetailPos = collection.count
DER FOLGENDE ZWEIG IST ABSOLUT UNSINNIG. ENTWEDER HAT DEINE COLLECTION EINEN WERT VON NULL ZURÜCKGELIEFERT ODER NICHT. WENN SIE 1 ZURÜCKGELIEFET HAT HAST DU AUF EINMAL DA NULL DRINSTEHEN. WIE SOLL DAS DENN GEHEN. DU HAST NOCH EINE POSITION UND BEHAUPTEST DU HÄTTEST GAR KEINE MEHR. LOGIKFEHLER IM SCRIPT.
   Else
      thisDoc.LastDetailPos = 0            
   End If        
   
   
   
   Call viewForRefresh.Refresh()
   Call uiDoc.Refresh()
   
End Sub


Das Problem ist übrigens nicht das du fragst, sondern die Art wie. Du gibst uns einfach zu wenig und dann meistens noch die falschen Informationen. Jede Anwendung, jede Sprache hat Ihre Syntax und wenn du dieses Fachchinesisch nicht (noch) sprichst, dann haben die Leute die Tiefer drinstecken in der Materie ein Problem mit dem was du willst.

Thomas
« Letzte Änderung: 27.08.04 - 11:15:45 von Thomas Schulte »
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

7Stein

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #12 am: 27.08.04 - 11:43:40 »
thisDoc ist global deklariert.

Wieso ist das ein Kardinalfehler?
Wenn ich GetAllDocumentsByKey aufrufe, bekomme ich laut designerhilfe doch ein Array aller Werte zurück.

Das ganze läuft ja schon in einer Action, aber die views sind embedded views. Geht das deswegen nicht?

Gelöscht wird das Dokument.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:neu Nummerierung in einer Maske
« Antwort #13 am: 27.08.04 - 11:52:47 »
Ich fasse es nicht ... Du willst partout nicht begreifen ... Du beantwortest keiner unserer Fragen, gibst uns nicht alle Infos ("thisDoc ist global deklariert." Ach ja ?!?), aber stellst schon wieder neue.

Schon in der DesignerHelp kann man sich schlau machen, was es mit einer embedded view und einem View-Zugriff über's Backend auf sich hat.
Offensichtlich bist Du einfach zu faul, selber zu lesen und dann vor allem zu DENKEN.

Bernhard

7Stein

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #14 am: 27.08.04 - 12:04:10 »
DANKE FÜR DIE BLUMEN!!!!!!!


In der Variable

thisDoc.LastDetailPos steht eine 0 drin.

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re:neu Nummerierung in einer Maske
« Antwort #15 am: 27.08.04 - 12:08:44 »
thisDoc ist global deklariert.

Genau das meine ich mit zu wenig und auch noch die falschen Informationen. Das gehört einfach dazu.

So und was deine Neuberechnung der Positionen angeht:

  Dim collection As NotesDocumentCollection
  Dim docDetail As NotesDocument  
  Dim olddocdetail as notesdocument
  Dim viewForRefresh As NotesView
  dim view2 as NotesView
  Dim strPos As String
 
  Dim i As Integer
 
  Set viewForRefresh = db.GetView( "(BestellPositionen)" )
  Set view2 = db.GetView( "(BestellPositionenByKey)")
HIER SIND LAUFZEITPROBLEME BEI VIELEN DOKUMENTEN IN DER DATENBANK ZU ERWARTEN
  Call view2.Refresh()
  Set collection = view2.GetAllDocumentsByKey(thisDoc.UniversalID)
 
  Select Case collection.Count
  Case 0:
      Msgbox "Keine Position vorhanden.", 48, db.title

  Case 1:
      Set docDetail = collection.GetFirstDocument
      Call docDetail.Remove (True)
      Thisdoc.LastDetailPos = 0
      Call thisdoc.Save(True,False)

  Case Else:
      strPos = Inputbox$( "Welche Position löschen?", "Position löschen", "1" )
      If strPos <> "" Then
        Call view2.Refresh()
        Set docDetail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + strPos )
        Call docDetail.Remove( True)
      End If
      set docdetail = collection.getfirstdocument()
      do while not docdetail is nothing
         set olddocdetail = docdetail
         UMWANDELN WENN KEIN STRING ->
         if docdetail.pos(0) > StrPos
           Docdetail.pos = docdetail.pos(0) -1
        end if
        set docdetail = collection.getnextdocument(olddocdetail)
      Enddo
      UND WENN DU PARTOUT DIE ANZAHL DER POSITIONEN SPEICHERN WILLST
      Thisdoc.LastDetailPos = ThisDoc.LastDetailPos(0) - 1
      DANN DAS THISDOC APSPEICHERN WEIL ES JA BACKEND IST
      Call ThisDoc.Save(True,False)

  End Select      

Und hier musst du nur noch das UIdoc wieder in den Voerdergrund holen. Du hast ja schließlich im Backend gearbeitet.




Damit ist das sauber strukturiert und kein überflüssiger Code drin.

wobei es immer noch Performance Probleme geben wird wenn du einige Tausend Dokumente in der Datenbank drin hast.

Für die Blumen brauchst du dich nicht bedanken, in diesem Fall hast du sie verdient. So resistent gegenüber Aufforderungen sich klarer auszudrücken war bis jetzt noch niemand.

Thomas
« Letzte Änderung: 27.08.04 - 12:12:28 von Thomas Schulte »
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:neu Nummerierung in einer Maske
« Antwort #16 am: 27.08.04 - 12:10:30 »
Also, ich geb's auf. Da helfen auch keine Baldriantropfen mehr, und für eine Bolusinjektion Whiskey ist es noch zu früh am Tag.

Bernhard

klaussal

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #17 am: 27.08.04 - 12:12:06 »
.... wer wird denn gleich in die Luft gehen......

Marinero Atlántico

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #18 am: 27.08.04 - 12:26:35 »
nach meiner bescheidenen Meinung find das 7_Stein bashen n bischen übertrieben.
7_Stein ist doch ganz offensichtlich nicht Ed Brill.

@7_Stein: Solche "Sortieralgorythmen" bringen nix gutes.
Die Funktionalität von 1 bis x sauber durchgezählten Dokumenten hat sehr hohe Performance-Kosten.

Stell dir vor es sind 1000 Dokumente in der Ansicht. Anwender A will ein neues Dokument unter Nummer 2 speichern. Dann müssen die Dokumente mit dem Nümmerschen 2'vorher bis 1000'vorher alle neu abgespeichert werden? Das kann nicht sein, oder?

Datenbanken haben es an sich, dass da immer mehr Dokumente reinkommen.
Die Kosten für die Speicherung erhöhen sich also tendentiell mit der Zeit.
Ich hatte mal einen Fall, wo aufgrund eines solchen Sortierungsdesigns das Abspeichern eines Dokuments über 1 Stunde dauerte.
Ich bin damals so vorgegangen:
Jede Nacht lief ein Agent durch die Datenbank, der zwischen den Nummern Lücken schuf, d.h. er ging alle Dokumente durch und vergab neue Nummern mit jedesmal frischen 10er Abständen. Wenn die dann ein Dokument zwischen 10 und 20 legen wollten, nahmen die eben 13 oder 14 oder 17.

Es ist nämlich in aller Regel nicht wichtig, dass bei den Nümmerschen auf 7 die Nummer 8 folgt. Wichtig ist, dass es die Möglichkeit gibt die Dokumente in eine gewisse Reihenfolge einzusortieren.

Hoffe es hilft.

Gruß Axel

klaussal

  • Gast
Re:neu Nummerierung in einer Maske
« Antwort #19 am: 27.08.04 - 12:43:34 »
@thomas
Code
So resistent gegenüber Aufforderungen sich klarer auszudrücken war bis jetzt noch niemand.
Wenn Frauen versprechen, sich zu ändern, dann überlege, ob du weiterhin mit Ihnen zusammenarbeiten willst....

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz