CMXKEYGOTO()

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

Mit der COMIX LIB kann man in Clipper mit CMXKEYGOTO() auf einen bestimmten Datensatz im Index springen, dafür habe ich nirgends eine äquivalente Funktion in XBASE gefunden.

Gibt es diese Funktion tatsächlich nicht in XBASE ??

Gruß Ecki
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

Was macht denn CMXKeyGoto() genau?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

Angenommen du hast eine Dbasedatei mit einem Index nach KundenNr
Du setzt z.B. einen Scope auf die KundenNr 3625, in diesem Scope sind nun 100 Datensätze enthalten
Mit CmxKeyGoto( 21 ) könntest du jetzt auf den 21-ten Satz innerhalb des Scopes springen
UliTs hat geschrieben:Was macht denn CMXKeyGoto() genau?

Uli
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

Mit

Code: Alles auswählen

DbSetScope( <nScope>, <xValue> )
kann man in xBase einen Scope setzen.
Mit

Code: Alles auswählen

DbGoTop() ; DbSkip( 21 )
kannst Du dann obigen Befehl nachbilden :) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

Jep, Ulli, mit der Antwort hatte ich jetzt gerechnet ;-)

Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
UliTs hat geschrieben:Mit

Code: Alles auswählen

DbSetScope( <nScope>, <xValue> )
kann man in xBase einen Scope setzen.
Mit

Code: Alles auswählen

DbGoTop() ; DbSkip( 21 )
kannst Du dann obigen Befehl nachbilden :) .

Uli
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

Eckhard Sallermann hat geschrieben:Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
Warum?
Meinst Du, dass es dann Geschwindigkeitsprobleme geben könnte?
Ohne es ausprobiert zu haben, vermute ich, dass es auch bei 100.000 Datensatzen nur ein paar milli-Sekunden dauert :-)

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

LOL, schön wär´s
UliTs hat geschrieben:
Eckhard Sallermann hat geschrieben:Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
Warum?
Meinst Du, dass es dann Geschwindigkeitsprobleme geben könnte?
Ohne es ausprobiert zu haben, vermute ich, dass es auch bei 100.000 Datensatzen nur ein paar milli-Sekunden dauert :-)

Uli
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von brandelh »

Hi,

wenn ich das richtig verstehe, willst du auf den 21. Satz der deinem Suchbegriff im Index entspricht ?

Code: Alles auswählen

cOrt := "Mannheim"
set order to WohnOrt
if dbseek(cOrt) // das ist der erste !
   dbSkip(20)
   if WohnOrt = cOrt => dies ist der 21. Satz mit gleichem Index (falls der noch gleich ist ;-) 
ein scope würde die letzte Abfrage sparen, aber man muss aufpassen, bei Teilbegriffen hat man schnell EOF() statt der erwarteten Daten ;-)
scope arbeitet z.b. einwandfrei wenn man alle Rechnungen eines Kunden möchte und den scope auf die Kundennummer (eindeutig) setzt.
Gruß
Hubert
Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

Ich will nicht auf den Satz der einem Suchbegriff entspricht, sondern auf exakt einen, der der Indexnummer entspricht

Das Skippen ist wirklich nur eine NOTLÖSUNG, da es u.U. sehr lange dauern kann

brandelh hat geschrieben:Hi,

wenn ich das richtig verstehe, willst du auf den 21. Satz der deinem Suchbegriff im Index entspricht ?

Code: Alles auswählen

cOrt := "Mannheim"
set order to WohnOrt
if dbseek(cOrt) // das ist der erste !
   dbSkip(20)
   if WohnOrt = cOrt => dies ist der 21. Satz mit gleichem Index (falls der noch gleich ist ;-) 
ein scope würde die letzte Abfrage sparen, aber man muss aufpassen, bei Teilbegriffen hat man schnell EOF() statt der erwarteten Daten ;-)
scope arbeitet z.b. einwandfrei wenn man alle Rechnungen eines Kunden möchte und den scope auf die Kundennummer (eindeutig) setzt.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

Eckhard Sallermann hat geschrieben:LOL, schön wär´s
UliTs hat geschrieben:
Eckhard Sallermann hat geschrieben:Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
Warum?
Meinst Du, dass es dann Geschwindigkeitsprobleme geben könnte?
Ohne es ausprobiert zu haben, vermute ich, dass es auch bei 100.000 Datensatzen nur ein paar milli-Sekunden dauert :-)

Uli
Ok, ich habe mir die Mühe gemacht und ein Testprogramm für 100000 Datensätze geschrieben. Ergebnis:
Direkter Zugriff auf die Tabelle: 4 Sekunden
Mittels ADS Zugriff auf die Tabelle: 1 Sekunde
Also klar mehr als ein paar Millisekunden :?
Aber 100000x den gleichen Index zu haben, ist ja nicht gerade optimal programmiert!
Kannst Du das Problem nicht durch einen intelligenteren Index umgehen?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von brandelh »

Ich will nicht auf den Satz der einem Suchbegriff entspricht, sondern auf exakt einen, der der Indexnummer entspricht
Was bitte ist damit gemeint ?

1. Eine eindeutige ID (also z.B. numerisches Feld, das nur einmal vorkommt), dann trifft dbseek(nID) sofort ...
2. Den Satz, der nach der Sortierfolge an einer bestimmten Stelle steht, dann trifft dbskip(nStelle) auch, sofern der Index passt.
3. Tatsächlich der Indexeintrag in der Indexdatei unabhängig von der Sortierung ? Was soll das sein oder bringen ?

Offensichtlich erschließt sich mir nicht die mystische Bedeutung dieses Befehls ;-)
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: CMXKEYGOTO()

Beitrag von Markus Walter »

Eckhard Sallermann hat geschrieben:Mit der COMIX LIB kann man in Clipper mit CMXKEYGOTO() auf einen bestimmten Datensatz im Index springen, dafür habe ich nirgends eine äquivalente Funktion in XBASE gefunden.
Gibt es diese Funktion tatsächlich nicht in XBASE ??
Hallo,
es gibt keine vergleichbare Funktion. Da wirst Du eine andere Lösung suchen müssen. Skippen über eine große Anzahl Datensätze ist über Netz sehr langsam. Ich habe zu Clipper-Six-Zeiten sehr häufig eine Funktion benutzt, die die Anzahl Datensätze in einem Scope ermittelt. Das ist mit Xbase auch so eine Sache. OrdKeyNo() kann sowas leisten (wenn man zuerst auf den letzten Satz im Scope springt), aber lt. Alaska ist das Ergebnis bei einem CDX-Index nicht immer verlässlich, da da eine Heuristik (so hatte Steffen das genannt) zum Einsatz kommt.
Eine Lösung ala
Scope setzen - dbskip bis eof(9 und dabei zählen ist sehr langsam.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von brandelh »

Markus Walter hat geschrieben:Da wirst Du eine andere Lösung suchen müssen. Skippen über eine große Anzahl Datensätze ist über Netz sehr langsam.
Wenn ich einen Index benutze und darin einige hundert Datensätze durchskippe ist das nicht 'sehr langsam', solange man ein normales Netz hat.
Wenn es mehr als einige hundert Datensätze sind, die ich durchsuchen muss, dann sollte ich mir Gedanken machen ob ich richtig gesucht (eingeschränkt) habe.
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: CMXKEYGOTO()

Beitrag von Markus Walter »

brandelh hat geschrieben:Wenn ich einen Index benutze und darin einige hundert Datensätze durchskippe ist das nicht 'sehr langsam', solange man ein normales Netz hat.
Wenn es mehr als einige hundert Datensätze sind, die ich durchsuchen muss, dann sollte ich mir Gedanken machen ob ich richtig gesucht (eingeschränkt) habe.
Hubert,

nimm doch das "einfache" Thema einer Fortschrittsanzeige. In meiner Anwendung kommt es durchaus vor, dass ich rd. 100.000 von 500.000 Datensätze bearbeiten (kalkulieren, auswerten) muss. Index passt. Also setze ich einen Scope. Jetzt möchte ich eine Fortschrittanzeige haben, also muss ich wissen, wieviele Datensätze der Scope umfasst. Wie komme ich in Xbase an diese Information?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

Dann erkläre ich das mal etwas genauer :wink:

Nehmen wir an, ich habe eine DBF, in der sind 2.000 Ansprechpartner eines Kunden gespeichert.
Schreibe ich einen Auftrag, so wähle ich den Ansprechpartner aus indem ich einen Scope auf alle Ansprechpartner eines Kunden setze
Aus diesem Scope, der 2.000 Sätze umfasst wähle ich den Ansprechpartner dessen logische Position des Satzzeigers
der indizierten Datenbanken 1.999 ( also nicht recno() ) enstpricht.

Diese Nummer ( 1.999 ) speichere ich dann im Auftrag in dem Felder "partner"

Wenn ich dann später z.b. diesen Auftrag suche, dann setze ich bei den Ansprechpartnern des entsprechend zum Auftrag gehörigen Kunden wieder einen
Scope auf die Kundennummer und würde dann in Clipper mit CMXKEYGOTO( auftrag->partner ) gleich auf den entsprechenden Datensatz gelangen.

Ich weiß, das ist nicht gerade eine gute Idee, das so zu machen :?

Hoffe aber, dass ich das jetzt verständlich machen konnte ?

brandelh hat geschrieben:
Ich will nicht auf den Satz der einem Suchbegriff entspricht, sondern auf exakt einen, der der Indexnummer entspricht
Was bitte ist damit gemeint ?

1. Eine eindeutige ID (also z.B. numerisches Feld, das nur einmal vorkommt), dann trifft dbseek(nID) sofort ...
2. Den Satz, der nach der Sortierfolge an einer bestimmten Stelle steht, dann trifft dbskip(nStelle) auch, sofern der Index passt.
3. Tatsächlich der Indexeintrag in der Indexdatei unabhängig von der Sortierung ? Was soll das sein oder bringen ?

Offensichtlich erschließt sich mir nicht die mystische Bedeutung dieses Befehls ;-)
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Jan »

Eckhard,

sicher würde das ein gewisses Code-Umschreiben erfordern. Aber warum speicherst Du nicht die eindeutige Ansprechpartner-Nummer? Und machst dann ein DbSeek() nur genau darauf? Das wär dann noch schneller als die CMXKEYGOTO()-Geschichte.

Abgesehen davon halte ich das bisherige Verfahren für gefährlich. Was, wenn der 1995. Ansprechpartner gelöscht wurde? Dann ist der Gesuchte nicht mehr der 1999., sondern der 1998. und wird nicht mehr korrekt gefunden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Koverhage »

Genau und als Index Key
Kundenummer+Ansprechpartner
Gruß
Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Jan »

Klaus,

ich meinte das anders. Jetzt wird die Position im Index gespeichert. Stattdessen eine eindeutige Ansprechpartnernummer speichern. um die Suchsystematik behalten zu können.

Dein Vorschlag könnte den Nachteil haben, wenn der Mitarbeiter seinen Namen ändernt (Hochzeit z. B.). Dann stimmt der Suchvorgang eventuell nicht mehr.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Eckhard Sallermann
UDF-Programmierer
UDF-Programmierer
Beiträge: 88
Registriert: Fr, 29. Jun 2007 13:32
Wohnort: 33330 Gütersloh
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Eckhard Sallermann »

Jan, das hat sich ziemlich am Anfang meiner Clipperzeit ergeben, mir ist klar, dass das nicht wirklich "gesund" ist :(

Ein Ansprechpartner kann in meiner App nicht gelöscht werden, dennoch kann es da Probleme geben, wenn die DBF bzw. der Index mal defekt ist.

Heute würde ich es eher so machen, dass ich den Ansprechpartner ( also den Namen ) direkt als Text mit in der Auftragsdatenbank speichere, damit umgehe ich
alle Probleme, d.h. der Name kann in der Ansprechpartnerdatei geändert werden und man hat dennoch zum Auftrag den Originalnamen, auch kann ich dann
in der Ansprechpartnerdatei Datensätze löschen.

Jan hat geschrieben:Eckhard,

sicher würde das ein gewisses Code-Umschreiben erfordern. Aber warum speicherst Du nicht die eindeutige Ansprechpartner-Nummer? Und machst dann ein DbSeek() nur genau darauf? Das wär dann noch schneller als die CMXKEYGOTO()-Geschichte.

Abgesehen davon halte ich das bisherige Verfahren für gefährlich. Was, wenn der 1995. Ansprechpartner gelöscht wurde? Dann ist der Gesuchte nicht mehr der 1999., sondern der 1998. und wird nicht mehr korrekt gefunden.

Jan
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

Eckhard Sallermann hat geschrieben:Nehmen wir an, ich habe eine DBF, in der sind 2.000 Ansprechpartner eines Kunden gespeichert.
Schreibe ich einen Auftrag, so wähle ich den Ansprechpartner aus indem ich einen Scope auf alle Ansprechpartner eines Kunden setze
Aus diesem Scope, der 2.000 Sätze umfasst wähle ich den Ansprechpartner dessen logische Position des Satzzeigers
der indizierten Datenbanken 1.999 ( also nicht recno() ) enstpricht.

Diese Nummer ( 1.999 ) speichere ich dann im Auftrag in dem Felder "partner"
Hallo Eckhard,
das Hauptproblem ist sicher, das Du die logische Position im Feld Partner in der Auftragstabelle (und vielleicht auch noch in weiteren Tabellen) speicherst. :!:

Vielleicht ist eine Umstellung relativ einfach, indem Du in der Ansprechpartnertabelle ein zusätzliches Feld "APNr" = Ansprechpartnernummer einführst und hier die logische Position speicherst. Also APNr fängt für jeden Kunden bei 1 an. Kunden-Nr + APNr sind dann eindeutig.
Die APNr rückwirkend mit dem richtigen Wert zu belegen, ist einfach, ebenso beim Anlegen neuer Ansprechpartner. :D
Und bei einem geeigneten Index (z.B. str(KundenNr,10)+str(APNr,10)) unschlagbar schnell (selbst bei Zugriff ohne ADS!). :!:

Was hältst Du davon?

Uli

Edit: Die Lösung hätte den Vorteil, das auch alte Programme kompatibel dazu sind (außer das bei Neuanlegen von Ansprechpartnern die APNr nicht eingetragen wird, aber auch dafür gibt es eine einfache Lösung für das nachträgliche Eintragen :-) )
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von brandelh »

Mit DbPosition() kann man innerhalb des Index die Prozentposition erfragen, natürlich nicht innerhalb eines scope oder filters.
Ob aber die genannte Indexnummer tatsächlich unveränderlich auf diesen Datensatz verweißt, da bin ich mir nicht sicher.
Was passiert nach einem Reindex oder Indexneuaufbau, insbesondere wenn einige neue Kunden dazukommen und andere gelöscht werden !

Wie ich gerade sehe hat Uli auch gerade geantwortet und ich kann ihm nur zustimmen.
Wenn es für einen Kunden 2000 Ansprechpartner gibt und diese alle seine Kundennummer als Verweis haben (was OK ist!)
dann muss es zusätzlich noch eine eindeutige Nummer für einen Ansprechpartner als solchen geben.
Insbesondere bei der Umstellung auf SQL Datenbanken muss jeder Datensatz eindeutig zu identifizieren sein.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: CMXKEYGOTO()

Beitrag von AUGE_OHR »

Eckhard Sallermann hat geschrieben:Mit der COMIX LIB kann man in Clipper mit CMXKEYGOTO() auf einen bestimmten Datensatz im Index springen, dafür habe ich nirgends eine äquivalente Funktion in XBASE gefunden.

Gibt es diese Funktion tatsächlich nicht in XBASE ??
Xbase++ ist Cl*pper v5.2e "Compatible" nicht v5.3 wo erst CDX ( COMIX ) dazu kam.

Es gibt kein OrdKeyCount() was einem die Anzahl der Sätze, z.b. für einen Scrollbar, im Scope gibt
Es gibt auch kein OrdKeyGoto() oder ähnliches, vielmehr müsstest du "im" Scope, der einen Index hat,
mittels OrdKeyNo() "abfragen" ob es "der" betreffende Datensatz ist.
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

AUGE_OHR hat geschrieben:...vielmehr müsstest du "im" Scope, der einen Index hat,
mittels OrdKeyNo() "abfragen" ob es "der" betreffende Datensatz ist.
Jimmy,
es geht um die andere Richtung: anhand einer vorgegebenen logischen Position innerhalb des SCOPE den zugehörigen Datensatz zu finden.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von Tom »

Mmh. Wenn ich das richtig zusammenfasse, gibt es eine Ansprechpartnerdatenbank, die einen Index der Kundennummer führt. Sobald ein Ansprechpartner gewählt wird, wird dessen logische Position im Scope in die Auftragsdatei geschrieben. Um ihn dort anzeigen zu können, soll wieder ein Scope auf die Ansprechpartnerdatenbank gesetzt und zur logischen Position gesprungen werden. In der Ansprechpartnerdatenbank kann nicht gelöscht werden. Wozu dann beim Anzeigen überhaupt der Quatsch mit dem Scope? Warum nicht einfach direkt die RecNo() speichern und zu dieser springen? Die bleibt ja schließlich auch eindeutig, solange nicht gelöscht und gepackt wird? Notfalls könnte man auch noch beim Anlegen eines Ansprechpartners die zu diesem Zeitpunkt aktuelle RecNo() in der Ansprechpartnerdatei (!) wegspeichern und dieses Spiegelfeld per Index referenzieren.

Das Problem scheint darin zu bestehen, dass die bisherigen Daten schon für diese Systematik vorliegen. Dann sollte man diese Tabelle einmal mit dem hier vorgeschlagenen Weg (Scope, DbSkip) durchwackeln und die RecNo() wegspeichern, feddisch.

Wirklich elegant ist das alles aber nicht. Für derlei legt man eigentlich in der Kopfdatei (Kunden) einen Zähler an, der inkrementiert wird, sobald ein Ansprechpartner hinzugefügt wird. Dessen eindeutige ID ergibt sich dann aus Kundennummer+Ansprechpartner-ID. Ein DbSeek hierauf fördert immer den richtigen Datensatz zutage, ganz egal, was mit der Tabelle bis dahin passiert ist. Und in dieser Topologie kann dann auch gelöscht werden.
Herzlich,
Tom
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: CMXKEYGOTO()

Beitrag von UliTs »

Tom hat geschrieben:Mmh. Wenn ich das richtig zusammenfasse ...
Tom, hast Du meinen Beitrag weiter oben durchgelesen? ;-)
Ich denke die Lösung ist wesentlich einfacher und sicherer (...RecNo() wegschreiben... :angry7: ).

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten