Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: 7Stein am 27.08.04 - 09:44:44

Titel: neu Nummerierung in einer Maske
Beitrag von: 7Stein 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

Titel: Woher sollen wir das denn ohne genaue Fehlerbeschreibung ...
Beitrag von: Thomas Schulte 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein 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"!!!!!
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Glombi 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Axel 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Glombi 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      
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein 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.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Axel 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein 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.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: koehlerbv 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein 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.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: koehlerbv 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein am 27.08.04 - 12:04:10
DANKE FÜR DIE BLUMEN!!!!!!!


In der Variable

thisDoc.LastDetailPos steht eine 0 drin.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: koehlerbv 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: klaussal am 27.08.04 - 12:12:06
.... wer wird denn gleich in die Luft gehen......
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Marinero Atlántico 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
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: klaussal 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....
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte am 27.08.04 - 12:53:44
7_Stein ist doch ganz offensichtlich nicht Ed Brill.

Ich weis ja nicht was du gegen Ed hast? Auf welchen Zeh ist er dir denn mal gelatscht?

Aber wer gegen erste zarte und dann immer deutlicher werdende Hinweise, das an seiner (ihrer) Art um Hilfe zu bitten eigentlich nichts einzuwenden wäre, wenn, ja wenn, die entsprechenden Informationen mit rüberwachsen würden, immun ist, der braucht sich nicht wundern das er hier etwas härter angegangen wird. Guck doch mal in deine geliebten JAVA Foren und überleg was diese Art der Fragestellung dort ausgelöst hätte. Dagegen ist das hier milde.

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

Full ACK

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.

Hier irrt der Weise. Zwar nicht in der Sache generell, da hat er recht, aber im Speziellen. Es geht hier nicht um N-Tausend Dokumente, sondern "nur" um Bestellpositionen unterhalb eines Bestellkopfes. Da wirst du es selten erleben, das da ein paar tausend Dokumente zum neusortieren zusammenkommen.

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.

Das solltest du mal einigen Institutionen wie z.B. einer Finanzbuchhaltung,  einer Revision oder der Steuerfahndung erklären. Die werden dich diesbezüglich erst An-, dann Auslachen und anschließend zu Ihrem Tagesgeschäft mit der fortlaufenden Belegnummerierung zurückkehren.

Thomas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Marinero Atlántico am 27.08.04 - 13:12:56
Das solltest du mal einigen Institutionen wie z.B. einer Finanzbuchhaltung,  einer Revision oder der Steuerfahndung erklären. Die werden dich diesbezüglich erst An-, dann Auslachen und anschließend zu Ihrem Tagesgeschäft mit der fortlaufenden Belegnummerierung zurückkehren.

Falls es dafür keine ökonomisch begründbaren Intentionen gibt:
Alles eine Frage des Evolutionsdrucks. Der wird hierzulande in den nächsten Jahren sowieso zunehmen. ;D  
Irgendwann wird der Druck dann so stark, dass die Deutschländer immer mehr Würsteleien aufgeben.
As simple as that.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: 7Stein am 27.08.04 - 13:15:40
Ich versuche eine Frage so zu formulieren, dass sie jeder versteht.
Ich hatte schonmal erwähnt, dass ich von der relationalen db Seite komme.
Ich versuche mich an die Vorgaben von Notes zu gewöhnen.
Ich habe hier ein "fertiges Programm", dass ich überarbeiten muss.
Ich werde versuchen meine Fragen demnächst so zu stellen, dass ich in den Formulierungen keine Fehler mehr mache.

Aber hier so nieder gemacht zu werden, nur weil man sich vielleicht zu umständlich oder zu missverständlich ausdrückt, finde ich echt eine Sauerei.

Ich ignoriere übrigens keine Hinweise.

Danke trotzdm an @Thomas für die Hilfe
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Glombi am 27.08.04 - 13:32:38
@7Stein: Eine generelle Anmerkung:
Es würde uns die Hilfe wesentlich erleichtern, ja eigentlich erst ermöglichen, wenn Du uns folgendes sagst:
1. Was für ein Ergebnis erwartest Du, wenn das Script läuft.
2. Wenn das Ergebnis nicht eintritt - und das wird ja der Grund einer Frage hier sein : Was passiert stattdessen GENAU?
3. Bitte beantworte Fragen - am besten mit
Zitat
...
.
Die Frage nach LastDetailPos hatte ich bereits am Anfang gestellt und dann hätte man sich einiges sparen können.

In dem o.g. Script werden einige Messageboxen bzw. Inputboxen aufgerufen. Es wäre gut zu wissen, ob der Code bis dahin kommt und welche Meldung kommt (gut, das wissen wir jetzt).
Dann werden Felder gesetzt - Pos und LastEditPos. Wie ist der Wert der Felder VOR dem Scriptlauf und NACH dem Scriptlauf.

Es hakt eigentlich nicht an den Formulierungen, sondern an Detailinformationen. Daher gibt es hier die starken Reaktionen.

Ein Tipp für das "Debuggen", wenn der Debugger nicht geht (wg. Dialogbox). Baue der Messageboxen ein, die den Wert anzeigen.
Z.B. mache ich das so:

dim searchstring as string
searchstring = |Form = "BestandsabfrageDetail" & ParentUNID = "| + thisDoc.UniversalID + |"|

msgbox searchstring
Set collection = db.Search( searchstring, Nothing, 0 )

Dann siehst Du, welcher Suchstring ausgeführt wird.
Als nächstes
msgbox collection.Count

Dann siehst Du, wieviele Dokumente das Script gefunden hat.

Zitat
thisDoc.LastDetailPos steht eine 0 drin.
heisst, das Script findet KEINE Dokumente! Also wird nichts weiter gemacht. Es wäre jetzt zu untersuchen, warum keine Dokumente gefunden werden und dazu ist o.g. Messagebox gedacht.

Andreas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte am 27.08.04 - 13:46:17
Und noch eine Anmerkung zum Thema Debuggen

Was in Script immer funktioniert, auch wenn ein Agent auf dem Server läuft, ist eine
Print " Hierkommt was von meinem Agent "+ Variable
Anweisung einzubauen. Damit kann man in der Statuszeile direkt und beim Server im Log nachvollziehen was das Teil gerade gemacht hat.

Und willkommen im Club 7Steinchen, auch wenn du warscheinlich nicht wie deine Namensgebering mit Zauberkräften gesegnet bist.

Warte mal ab wie du so in einem Jahr drauf bist wenn du das Licht der Erleuchtung mit tragen wirst. (ha war das schwülstig)

Thomas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte am 27.08.04 - 13:52:29
Falls es dafür keine ökonomisch begründbaren Intentionen gibt:
Jetzt machst du es dir zu einfach. Diesen Druck gibt es tatsächlich, z.b. von Seiten der Finanzbehörden. Die verlangen eine lückenlose Verfolgung der Eingangsbelege. und das erreichst du nur über fortlaufende Nummern. Wenn da etwas nicht stimmt fängt die Außenprüfung an zu bohren und dann viel Spaß.

Thomas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: y20frank am 27.08.04 - 14:34:37
Falls es dafür keine ökonomisch begründbaren Intentionen gibt:
und das erreichst du nur über fortlaufende Nummern. Wenn da etwas nicht stimmt fängt die Außenprüfung an zu bohren und dann viel Spaß.

stimmt vollkommen! ich selbst wurde erst vor ein paar tagen dafür ausgelacht (in einem anderen forum ;->), weil ich in einer SQL-Datenbank den Auto_Increment-Wert wieder auf eine bestimmte Position zurücksetzen wollte (MUSSTE), damit eine lückenlose Zahlenfolge in der Tabelle generiert wird. Hat auch niemand so recht(lich) verstanden... isch liebe die finanzeämta! ;-) :P
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Marinero Atlántico am 27.08.04 - 14:47:14
Man kann ja eine stored procedure schreiben, die dann angetriggered wird, wenn die/der an der Pforte 4 mal pfeift.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte am 27.08.04 - 15:05:38
Man kann ja eine stored procedure schreiben, die dann angetriggered wird, wenn die/der an der Pforte 4 mal pfeift.
Mit automatischer Türblockierung, Ohh tut mir leid da klemmt was, solange die Prozedur noch nicht fertig ist.
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Axel am 27.08.04 - 15:11:22

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.



@Thomas

So ganz kann ich deiner Aussage aber nicht zustimmen. Sauber strukturiert - ja, aber überflüssiger Code - na ja.  

      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

Meines Erachtes ist das unnötig. Wenn innerhalb so einer Schleife das Dokument gelöscht wird, ist das zwingend notwendig, aber hier.   ???

Zum zweiten ist mir beim Überfliegen des Code auch noch ein anderer Fehler aufgefallen.

Relativ weit oben im Code füllst du die collection mit den Positionsdokumenten.

...
  Set collection = view2.GetAllDocumentsByKey(thisDoc.UniversalID)
...

Weiter unten wird ein Positionsdok. gelöscht und dann sollen die restlichen neu nummeriert werden. Dafür wird jedes Dokument in der collection durchlaufen, aber...
In der collection ist auch noch der Verweis auf das gelöschte Dokument drin. Meines Erachtens knallts hier. Oder liege ich da falsch.

Richtigerweise müsste man die collection erst im CASE ELSE - Zweig füllen wenn das Positionsdokument bereits gelöscht ist.


Axel  

 
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: y20frank am 27.08.04 - 15:12:45
ich finde, die sollten sich über eine (natürlich) notes-basierte datenbank offiziell anmelden (aber lesen dürfen nur die ihre anmeldung), wobei dann aber tortzdem ein kleiner süßer agent so ziemlich alles in diversen db's rechnungsprüfer-konform ummodelt. hey, hat nicht vielleicht jemand eine solche anwendung... oh, ich suche mal im tool-bereich...  ;D
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Glombi am 27.08.04 - 15:27:21
Der Thread wird langsam unübersichtlich  ::)
Und 7 Stein sagt gar nix mehr !?
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte am 27.08.04 - 15:50:18
@Atlantischer Seemann
Der Code erhebt keinen Anspruch auf alleingültige Richtigkeit, Vollständigkeit oder Fehlerfreiheit. Wenn du davon redest, dann fehlt da sowieso noch was, nämlich der docdetail.save damit die veränderte positionsnummer auch abgespeichert wird und dann ist das mit dem Olddoc aber wieder richtig.

Und nein da sollte es eigentlich nicht knallen. sobald du ein Dokument veränderst fliegt es nämlich aus der Collection raus, sonst wäre der Zirkus mit dem Olddoc nicht immer wieder notwendig.

Selbst wenn das Dokument nicht aus der Collection rausfliegen würde müsste das trotzdem noch so funktionieren.

Thomas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Thomas Schulte am 27.08.04 - 15:52:27
@glombi
Eben jetzt macht es richtig Spass.

@7Stein, könntest du den Thread bitte auf erledigt setzen, sonst machen wir hier nämlich noch ewig weiter.

Auch wenn das jetzt ein blöder Eintrag ist ist es trotzdem Eine Runde Zahl, darauf geh ich jetzt eine Apfesaftschorle schlürfen.

Thomas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Glombi am 27.08.04 - 15:55:06
Na denn Prost Y  ;)

Andreas
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: Axel am 27.08.04 - 21:18:30
@Atlantischer Seemann

 ??? Ich glaube du verwechselst mit mit dem anderen Axel (dem Marinero Atlántico). Ist aber nicht weiter tragisch. Ich bin der Andere  ;)  ;D

... nämlich der docdetail.save damit die veränderte positionsnummer auch abgespeichert wird und dann ist das mit dem Olddoc aber wieder richtig.
Und nein da sollte es eigentlich nicht knallen. sobald du ein Dokument veränderst fliegt es nämlich aus der Collection raus, sonst wäre der Zirkus mit dem Olddoc nicht immer wieder notwendig. ...

Also ich hab' schon öfter's Dokumente innerhalb einer Collection geändert und die sind dabei nicht rausgeflogen. Mit Ausnahme wenn ich Docs aus einer Collection lösche, hab ich den Zirkus mit olddoc nie gebraucht. Deswegen kann ich deine Aussagen nicht so ganz nachvollziehen. Aber sei's drum. Ich will hier keine Grundsatzdiskussion von Zaun brechen. Dieser Thread hat sowieso schon die Gemüter erhitzt. Das bin ich in diesem Forum gar nicht gewöhnt.

Ein schönes Wochenende

Axel

PS: Ich fahr jetzt erstmal in den Urlaub. Notes-freie Zone  ;) ;D


Titel: Re:neu Nummerierung in einer Maske
Beitrag von: y20frank am 27.08.04 - 21:27:54
Ich fahr jetzt erstmal in den Urlaub. Notes-freie Zone  ;) ;D
toll, alle fahren weg... thailand, indien... ok, und ich versuch' mich derweil an dem 7'er server, admin, client, designer...  :'( viel spaß dir aber wohin auch immer   ;)
Titel: Re:neu Nummerierung in einer Maske
Beitrag von: koehlerbv am 27.08.04 - 23:47:15
Aber hier so nieder gemacht zu werden, nur weil man sich vielleicht zu umständlich oder zu missverständlich ausdrückt, finde ich echt eine Sauerei.

Letzter Versuch:
Hier findet keine "Sauerei" statt, sondern der Versuch, Dich auf den richtigen Weg zu bringen. Immer wieder wurde von meist extrem hochkarätigen Leuten versucht, Dir klar zu machen, dass DU zunächst mal Nabelschau (sprich Selbsterkenntnis) betreibst, was Du bisher vollkommen ignoriert hat.
Dein Problem ist auch nicht Lotus Notes / Domino, sondern die Programmiererei an sich (und das ist bekanntermassen nicht nur Coding, sondern auch und vor allem das allgemeine Problemverständnis).

Wir helfen hier im Forum alle gerne und sind zudem extrem tolerant. Bedenke aber bitte (und das unbedingt): Jedes Posting hier geht irgendwie von unserer Zeit für andere Dinge ab, mit denen wir entweder unsere Familien ernähren müssen und / oder die Zeit mit unseren Familien verbringen könnten.
Akzeptiere also bitte unbedingt folgendes:
- Wir helfen hier gerne, aber veralbere uns nicht (aus welchen Gründen auch immer)
- Akzeptiere bitte, dass Du momentan noch (!) keine Ahnung von Programmentwicklung hast - völlig unabhängig von Lotus Notes / Domino (das haben Deine Postings eindeutig gezeigt)
- In diesem Zusammenhang: Verstehe unseren Idealismus in der Art, dass wir wissen, dass wir auch alle mal angefangen haben, aber dass es auch für uns noch ein Leben neben der Arbeit und dem Forum gibt
- Beantworte jede (!!) unserer Fragen ausführlich - streng' Dich an.
- DENKE !
- Und vor allem: Trete Deinem / Deinen Chef(s) realistisch und selbstbewusst gegenüber: Diese können von Dir auch nicht erwarten, dass Du morgen mit einem Führerschein der Klasse B den Firmenjet fliegst. Und komm' jetzt ja nicht damit, dass Eure Firma keinen Firmenjet hat, sondern DENKE !

Bernhard