empty( OrdKey() ) -> .T.

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

empty( OrdKey() ) -> .T.

Beitrag von Wonderer »

Hallo,

im Programm an dem ich derzeit Änderungen vornehme steht am Anfang der Bereich der für die Indexierung zuständig ist:

Code: Alles auswählen

select 103
set default to (Mcurdir+"\FOLDER")
if .not. file ("DB_TBL.DBF")
  //snip
endif
Fnet_use ("DB_TBL")
Fsperrfile()
 erase ("IDX1.NTX")
 index on upper(name) to IDX1
 erase ("IDX2.NTX")
 index on gruppe TO IDX2 UNIQUE
set index to IDX1, IDX2
if bNetuse
	unlock
endif
MyDbSetOrder( 1 )
MyDbSetOrder habe ich geschrieben zur Überprüfung ob der gewählte Index vorhanden ist:

Code: Alles auswählen

procedure MyDbSetOrder( nOrderNo )

	SET ORDER TO nOrderNo
	if empty( OrdKey() )
		MsgBox( "Area ("+ltrim(str(select()))+") Order "+ltrim(str(nOrderNo))+" enthaelt keinen Index!"+chr(13)+"ORDKEY -> '"+OrdKey()+"'" )
	endif
return
An der Stelle am Anfang des Programmes bekomme ich diese MessageBox von MyDbSetOrder() nicht angezeigt.

Dann im Bereich den ich selbst programmiert habe - habe ich dann das hier stehen:

Code: Alles auswählen

 		SELECT 103
 		/*
        erase ("IDX1.NTX")
        index on upper(name) to IDX1
        erase ("IDX2.NTX")
        index on gruppe TO IDX2 UNIQUE
        set index to IDX1, IDX2
        */
		MyDbSetOrder( 1 )
Hier erscheint dann die Meldung, dass der Index nichts enthält also keine Sortierung vorgegeben wird.

Was wird da irgendwo im Quellcode zwischen dem Anfang und meiner Routine als Befehle stehen, dass dieser gesetzte Index verlorengeht?

Ich möchte jetzt ungern jedes mal den Index neu aufbauen wenn ich SET ORDER TO verwenden will.
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: empty( OrdKey() ) -> .T.

Beitrag von brandelh »

wenn ein geöffneter Index nicht mehr gefunden wird, kann ...

* der SELECT Bereich gewechselt worden sein
* ein neues USE
* CLOSE
* SET INDEX TO
* der Index geschlossen worden sein (dbClearIndex() etc.)
* ... habe ich was vergessen ... :?

ABER von alleine verschwindet er nicht ;-)
Gruß
Hubert
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: empty( OrdKey() ) -> .T.

Beitrag von Wonderer »

Im Moment habe ich eh das Gefühl hier versucht sich jmd. einzubringen in meine Entwicklung - als Rache was ich als Jugendlicher mal mit einem Freund gemacht habe.

Aber so etwas macht man ja auch nicht. Ein DOS-Hilfstool zum entpacken von ARJ-Files entwickeln, dass aber nach ein paar mal der Nutzung 2 der notwendigen System-Files von Windows von der Platte löscht.
Wie nennt man ein Programm das noch was anderes tut als der veröffentlichte Zweck?
Man darf sich ebend nich so sehr beeinflussen lassen von seiner Umgebung. Vielleicht fand ich das lustig weil Streiche spielen eh IN war in der Schule und der Clique. Keine Ahnung. Idee gehabt und gemacht. Ob sich was ändert wenn ich das Opfer versuche ausfindig zu machen und mich entschuldige?!?

es gibt Dinge die werden manche niemals verzeihen und ihre Pläne entsprechend ausrichten... :cry:
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: empty( OrdKey() ) -> .T.

Beitrag von Jan »

... nur mal ein kleiner Tipp: Trenn Dich dringendst von Nummern der Select- und Order-Bereiche! Nimm stattdessen die Namen bzw. Aliasse. Wenn Du dann eine dbf (nennen wir den Alias mal cAlias) öffnest, die dazugehörigen Indizee (nennen wir die mal einfach cIndex1, cIndex2) öffnest, dann kannst Du damit direkt arbeiten:

Code: Alles auswählen

Select cAlias
Set Index to cIndex1
cAlias->(OrdName()) -> gibt "cIndex1" zurück
Du wirst sehen, das Du Dir das Leben ganz wesentlich einfacher machst.

Du must das ja nicht gleich komplett überall so machen. Aber immer da, wo Du sowieso den Code Durcharbeitest, eben sowas regeln.

Ebenso wichtig und hilfreich: Bei allen Dateioperationen mit dem Alias arbeiten. Also nicht einfach nur ein sondern ein

Code: Alles auswählen

cAlias->(DbSkip())
Nicht ein

Code: Alles auswählen

adressnr := 12
sondern ein

Code: Alles auswählen

adres->adressnr := 12
Das ist einerseits immer eindeutig und geht auf die korrekte dbf, egal was Du vorher mit select geändert hast. Und andererseits ist das Code lesen ungemein einfacher - Du weißt immer ganz genau, auf welcher dbf Du da gerade arbeitest. Mußt nicht nach oben scrollen was denn nun gerade aktuell ist. Und wenn Du Daten zwischen zwei dbf kopierst ist ein

Code: Alles auswählen

rechnung->adressnr := adress->adressnr
wesentlich einfacher als ein

Code: Alles auswählen

select adress
nAdressnr := adresssnr
select rechnung
adressnr := nAdressnr
Fehler finden ist so viel einfacher.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: empty( OrdKey() ) -> .T.

Beitrag von Wonderer »

Danke Jan, ich werde das sicher noch so umbauen.
Lesbarkeit ist ein Riesenvorteil wenn man nicht so nen großén Kopf hat wie ein Pferd. :)
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: empty( OrdKey() ) -> .T.

Beitrag von brandelh »

Ich empfehle, nutze die Select() Werte, aber nicht fix (also 1 = Kunden etc.) ...

Code: Alles auswählen

USE kunden NEW *** nutzt eine freie
if neterr()
   Fehlermeldung()
else
   nKunden := select() 
   ...
   (nKunden)->Name
Der Alias ist zwar fast immer gleichwertig (in Variablen oder direkt), aber Alias->(used()) kann eine Fehlermeldung "unbekannter Alias" geben,
ein (nKunden)->(used()) gibt nie eine Fehlermeldung solange nKunden einmal numerisch zugewiesen wurde.

Jedes GUI-Fenster erhält seine Dateien in iVars des Fensters
Gruß
Hubert
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: empty( OrdKey() ) -> .T.

Beitrag von Wonderer »

vielen Dank, das mach ich am besten jetzt gleich mal
-> dann kann sich auch mein Chef später besser in den Code und die Änderungen im Programm einlesen... :)
Antworten