CMXKEYGOTO()
Moderator: Moderatoren
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
CMXKEYGOTO()
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
Gibt es diese Funktion tatsächlich nicht in XBASE ??
Gruß Ecki
-
- 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()
Was macht denn CMXKeyGoto() genau?
Uli
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
Re: CMXKEYGOTO()
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
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
-
- 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()
Mitkann man in xBase einen Scope setzen.
Mitkannst Du dann obigen Befehl nachbilden .
Uli
Code: Alles auswählen
DbSetScope( <nScope>, <xValue> )
Mit
Code: Alles auswählen
DbGoTop() ; DbSkip( 21 )
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
Re: CMXKEYGOTO()
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 ;-(
Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
UliTs hat geschrieben:Mitkann man in xBase einen Scope setzen.Code: Alles auswählen
DbSetScope( <nScope>, <xValue> )
Mitkannst Du dann obigen Befehl nachbilden .Code: Alles auswählen
DbGoTop() ; DbSkip( 21 )
Uli
-
- 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()
Warum?Eckhard Sallermann hat geschrieben:Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
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
Mitglied XuG Cologne
Mitglied XuG Osnabrück
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
Re: CMXKEYGOTO()
LOL, schön wär´s
UliTs hat geschrieben:Warum?Eckhard Sallermann hat geschrieben:Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
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
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
Hi,
wenn ich das richtig verstehe, willst du auf den 21. Satz der deinem Suchbegriff im Index entspricht ?
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.
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 ;-)
scope arbeitet z.b. einwandfrei wenn man alle Rechnungen eines Kunden möchte und den scope auf die Kundennummer (eindeutig) setzt.
Gruß
Hubert
Hubert
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
Re: CMXKEYGOTO()
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
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 ?
ein scope würde die letzte Abfrage sparen, aber man muss aufpassen, bei Teilbegriffen hat man schnell EOF() statt der erwarteten DatenCode: 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 ;-)
scope arbeitet z.b. einwandfrei wenn man alle Rechnungen eines Kunden möchte und den scope auf die Kundennummer (eindeutig) setzt.
-
- 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()
Ok, ich habe mir die Mühe gemacht und ein Testprogramm für 100000 Datensätze geschrieben. Ergebnis:Eckhard Sallermann hat geschrieben:LOL, schön wär´s
UliTs hat geschrieben:Warum?Eckhard Sallermann hat geschrieben:Was aber, wenn in diesem Scope 100.000 Datensätze sind ? Gestaltet sich dann etwas weniger gut ;-(
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
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
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
Was bitte ist damit gemeint ?Ich will nicht auf den Satz der einem Suchbegriff entspricht, sondern auf exakt einen, der der Indexnummer entspricht
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
Hubert
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Re: CMXKEYGOTO()
Hallo,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 ??
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
Markus
Mitglied der XUG Saarland-Pfalz
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
Wenn ich einen Index benutze und darin einige hundert Datensätze durchskippe ist das nicht 'sehr langsam', solange man ein normales Netz hat.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 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
Hubert
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Re: CMXKEYGOTO()
Hubert,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.
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
Markus
Mitglied der XUG Saarland-Pfalz
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
Re: CMXKEYGOTO()
Dann erkläre ich das mal etwas genauer
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 ?
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:Was bitte ist damit gemeint ?Ich will nicht auf den Satz der einem Suchbegriff entspricht, sondern auf exakt einen, der der Indexnummer entspricht
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
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- UDF-Programmierer
- Beiträge: 88
- Registriert: Fr, 29. Jun 2007 13:32
- Wohnort: 33330 Gütersloh
- Kontaktdaten:
Re: CMXKEYGOTO()
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.
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
-
- 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()
Hallo Eckhard,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"
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.
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
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
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.
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
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: CMXKEYGOTO()
Xbase++ ist Cl*pper v5.2e "Compatible" nicht v5.3 wo erst CDX ( COMIX ) dazu kam.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 ??
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
Jimmy
-
- 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()
Jimmy,AUGE_OHR hat geschrieben:...vielmehr müsstest du "im" Scope, der einen Index hat,
mittels OrdKeyNo() "abfragen" ob es "der" betreffende Datensatz ist.
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
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: CMXKEYGOTO()
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.
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
Tom
-
- 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()
Tom, hast Du meinen Beitrag weiter oben durchgelesen?Tom hat geschrieben:Mmh. Wenn ich das richtig zusammenfasse ...
Ich denke die Lösung ist wesentlich einfacher und sicherer (...RecNo() wegschreiben... ).
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück