Seite 1 von 2

Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 12:31
von mini990
Hallo,
ich habe bei einem Programm folgendes Problem:

DBSelectArea( "DATEINAME" )
--> ergibt Fehlermeldung
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: C VALUE: DATEINAME
oError:canDefault : Y
oError:canRetry : N
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Unknown/Invalid symbol for alias
oError:filename :
oError:genCode : 66
oError:operation : dbSelectArea
oError:osCode : 0
oError:severity : 2
oError:subCode : 8022
oError:subSystem : BASE
oError:thread : 3
oError:tries : 0
------------------------------------------------------------------------------

Die Datei ist aber geöffnet.
Wähle ich die Datei mit Select ( nDateinummer ) kann ich mit Alias() den Namen abfragen

nutze ich den Befehl DBSelectArea( nDateinummer ) funktioniert alles.

Kennt jemand das Problem????

Gruß Stefan

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 12:44
von Tom
Wenn "Dateiname" eine Variable ist, die den Alias enthält, wäre DbSelectArea(Dateiname) korrekt. Wenn die Datei tatsächlich "Dateiname" heißt, wäre Deine Nomenklatur richtig. Aber so heißt sie nicht, oder?

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 12:47
von mini990
Dateiname ist nur ein Beispiel.
use Dateiname
? Alias() --> Dateiname

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 12:55
von ramses
Welche DBE verwendest du? Bei der ADSDBE sind als Dateiname max. 8 Zeichen erlaubt.... Wie ist dein Dateiname bezw. Alias, ist eine Ziffer am Anfang?

Gruss Carlo

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 13:22
von Tom
Was macht die Befehlsvariante (SELECT DATEINAME)? Was ist der Alias()-Rückgabewert, wenn Du mit der Nummer selektiert hast? Funktioniert sowas

Code: Alles auswählen

? dateiname->(FieldGet(1))

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 14:27
von DelUser01
Hallo Stefan
mini990 hat geschrieben: Fr, 24. Nov 2017 12:31DBSelectArea( "DATEINAME" )
...
Wähle ich die Datei mit Select ( nDateinummer ) kann ich mit Alias() den Namen abfragen
nutze ich den Befehl DBSelectArea( nDateinummer ) funktioniert alles.
Wie Tom schon geschrieben hat musst Du den von Xbase++ vergebenen Alias herausfinden.

Deine Angabe "nDateinummer" ist eigentlich nicht korrekt, es ist die Area-Nummer, eine Dateinummer gibt es nicht.

Du vermutlich so vorgegangen:

Code: Alles auswählen

cDateiname = "C:\meinVerzeichnis\meineDatenbank.dbf"
select( 0 )
use ( cDateiname )
nDateinummer := Select()
Dann Prüfe mit
? Alias()
wie der richtige Alias ist den Du dann verwenden kannst
cDateinummer := Alias()
DbSelectArea( cDateinummer )

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 14:57
von georg
Hallo, Stefan -


passiert der Abbruch in einem Thread, d.h. öffnest Du die Datei in einem Thread, startest dann einen anderen und versuchst, auf die offene Datei zuzugreifen?

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 15:02
von Tom
@Georg: Dann würde auch das DbSelectArea() mit einem numerischen Wert scheitern. Vermutlich hat die Engine einen anderen alphanumerischen Alias als den erwarteten vergeben. Das passiert, wenn man dieselbe Datei mehrfach öffnet, ohne einen eigenen Alias anzugeben.

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 15:27
von georg
Hallo, Tom -


grundsätzlich betrachte ich alle in Frage kommenden Möglichkeiten, und Stefan hat nicht geschrieben, dass er an der gleichen Stelle im Code den Test gemacht hat.

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 17:38
von Tom
Anyway. Alias() und WorkspaceList() sind die Funktionen, die Stefan zeigen werden, was sein Fehler ist. Ich vermute ein mehrfaches Öffnen derselben Tabelle - aber die Version, die den erwarteten Alias hatte, ist zu.

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:07
von mini990
Der Alias ist < 8 Zeichen
Die Datei ist definitv geöffnet

Alias() ---> Rückgabe Name der Datei ( "XYZ" )

Select XYZ --> Fehler
DBselectarea( "XYZ" ) --> Fehler
nDatei := Select()
Select ( nDatei ) --> funktioniert
DBSelectArea( nDatei ) --> funktioniert

Aber:
Ich öffne meine Dateien in einem Thread und starte von dort aus andere Threads bei denen ich auf diese Dateien zugreife.

Gruß Stefan
PS: Ich teste momentan mit der 2.0 da der Umstieg demnächst geplant ist...

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:12
von mini990
Dateisystem ist dbfntx

Tom...
wo soll da ein Fehler sein?

Vereinfacht....
Use Datei shared new alias XYZ
Select XYZ oder DBselectArea( "XYZ" )

Das ist Standard seit ich damals mit Clipper angefangen habe (Version Winter 85)

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:17
von Jan
Stgefan,

und was passiert bei

Code: Alles auswählen

LOCAL cAlias := Alias()
DbSelectArea(cAlias)
?

Ich tippe darauf, das Tom Recht hat.

Jan

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:17
von AUGE_OHR
mini990 hat geschrieben: Fr, 24. Nov 2017 19:07 Aber:
Ich öffne meine Dateien in einem Thread und starte von dort aus andere Threads bei denen ich auf diese Dateien zugreife.
jeder Thread hat seine eigene Workspacelist() und da kommt man "so" nicht einfach ran [-X

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:25
von Martin Altmann
Richtig! Da musst Du mit dem Zerospace arbeiten - schau Dir mal DbRelease() und DbRequest() an.

Viele Grüße,
Martin

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:27
von mini990
Sorry... die Bezeichnung Thread stimmt ja net...

Ablauf ist rudimentär so:

Code: Alles auswählen

Procedure main()

OpenDat()
TueWas()

Return

Function Opendat()
use datei1 shared new
use datei2 shared new
Return
Function Tuewas()
Select.....

Return

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:28
von Martin Altmann
Und? Hast Du da zwei Dateien, die in den ersten acht Zeichen gleich heißen?

Viele Grüße,
Martin

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 19:52
von mini990
Nein Martin,
das hat schon zu Clipperzeiten nicht funktioniert....

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 20:00
von Martin Altmann
Das ist richtig - aber es könnte ja sein, dass Du jetzt eine Art Mandantenfähigkeit dazugenommen hast und die selben Datei(namen) in verschiedenen Verzeichnissen nutzt.
Wenn Du dann Dateien aus verschiedenen Verzeichnissen öffnen willst...

Viele Grüße,
Martin

Re: Alias() Problem.....

Verfasst: Fr, 24. Nov 2017 23:27
von UliTs
Jan hat geschrieben: Fr, 24. Nov 2017 19:17 Stefan,
und was passiert bei

Code: Alles auswählen

LOCAL cAlias := Alias()
DbSelectArea(cAlias)
?
...
Stefan, probiere doch bitte Jan's Vorschlag aus. Mich interessiert sehr, ob das funktioniert.

Uli

Re: Alias() Problem.....

Verfasst: Sa, 25. Nov 2017 9:59
von mini990
Ich schmeiss jetzt das Zeug aus dem Fenster......

Code in diesem Bereich NICHT verändert !
Neu compiliert
und es geht jetzt!!!!!!

Das sind die Momente wo man sich fragt........

Gruß Stefan

Re: Alias() Problem.....

Verfasst: Sa, 25. Nov 2017 10:28
von mini990
...und weiter geht es:

erneut compiliert und der Fehler tritt wieder auf......

uli:

Code: Alles auswählen

LOCAL cAlias := Alias()
DbSelectArea(cAlias)
geht auch nicht!

Habe das nun temporär so gelöst:

Code: Alles auswählen

for nCount = 1 to 20
select( nCount)
		If UPPER( Alias() ) = "Datei1"
				nDatei := nCount
				Exit
		Endif
next nCount
If nDatei > 0
		Select( nDatei )
Else
		RETURN .F.
Endif

Re: Alias() Problem.....

Verfasst: Sa, 25. Nov 2017 10:49
von Werner_Bayern
Servus Stefan,

2 Gedanken dazu:
  • Kannst Du das Problem - ähnlich Deinem Beispiel - in einem extra Testprogramm nachvollziehen?
  • Kann es sein, dass der Dateiname - aus irgendwelchen Gründen auch immer - ein (unerlaubtes) Sonderzeichen hat, das nicht sichtbar ist?

Re: Alias() Problem.....

Verfasst: Sa, 25. Nov 2017 12:35
von Tom
Oh je.

Alias() gibt Dir den (alphanumerischen) Alias der aktuell selektierten Tabelle:

Code: Alles auswählen

USE KUNDEN NEW
? Alias() // Antwort: "KUNDEN"
USE PRODUKTE NEW
? Alias() // Antwort: "PRODUKTE"
SELECT KUNDEN
? Alias() // Antwort: "KUNDEN"
DbSelectArea("PRODUKTE")
? Alias() // Antwort: "PRODUKTE"
WorkSpaceList() liefert Dir ein eindimensionales Array mit allen Aliasen:

Code: Alles auswählen

? WorkSpaceList() // Antwort: {"KUNDEN","PRODUKTE"}
Du kannst Aliase auch selbst wählen:

Code: Alles auswählen

USE KUNDEN ALIAS KD NEW
? Alias() // Antwort: "KD"
Außerdem sehr hilfreich ist die Funktion DbInfo(). Die liefert auf Wunsch z.B. den vollständigen Dateinamen der aktuell selektierten Tabelle, aber u.a. auch ihren Alias.

Schlechter Code wird übrigens dadurch keinen Deut besser, dass man ihn in Funktionen auslagert. :wink:

Das hier:

Code: Alles auswählen

If UPPER( Alias() ) = "Datei1"
ist nie wahr.

Re: Alias() Problem.....

Verfasst: Sa, 25. Nov 2017 12:44
von Jan
mini990 hat geschrieben: Sa, 25. Nov 2017 10:28

Code: Alles auswählen

LOCAL cAlias := Alias()
DbSelectArea(cAlias)
geht auch nicht!
Stefan,

WENN da eine dbf offen ist KANN das nicht sein! Schau DIr im Debugger mal an, welchen Wert cAlias hat nach der Zuweisung. Entweder da steht der Alias der gerade aktiven dbf drin, oder das ist ein Leerstring - dann ist gar keine dbf offen.

Jan