use - keine Variablen?
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
use - keine Variablen?
Wieso erkennt use eigentlich keine Variablen?
Ich versuche USE cname alias Diffexcel new zu starten. In cname steht der vollständige Dateiname ohne Endung. Dann kommt die Fehlermeldung das die Datei cname nicht gefunden werden konnte, obwohl die Excelverbindung vorher klappt. cname wird durch einen Filedialog bestimmt und vor der Abfrage, der Dateiname von den Pfadangaben und der Dateiendung abgetrennt.
Ich versuche USE cname alias Diffexcel new zu starten. In cname steht der vollständige Dateiname ohne Endung. Dann kommt die Fehlermeldung das die Datei cname nicht gefunden werden konnte, obwohl die Excelverbindung vorher klappt. cname wird durch einen Filedialog bestimmt und vor der Abfrage, der Dateiname von den Pfadangaben und der Dateiendung abgetrennt.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Hi,
weil das von dBase (Interpreter) her schon so war
Bei Variablen in Befehlen (Funktionen gehen immer mit Variablen) muss man die in Klammern setzen. So funktioniert es:
weil das von dBase (Interpreter) her schon so war
Bei Variablen in Befehlen (Funktionen gehen immer mit Variablen) muss man die in Klammern setzen. So funktioniert es:
Code: Alles auswählen
local cFile := "XYZ.DBF" // oder auch ohne Endung
use (cFile)
if neterr() // immer abfragen !
Gruß
Hubert
Hubert
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
- 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
hi,
Operator) in diesem Zusammenhang zu lesen.
Sollte man wiederrum eine Cl*pper Application nach Xbase++ migieren
so sind die "Klammer" oft die Lösung:
gruss by OHR
Jimmy
Hintergrund: Es wäre zu empfehlen das Kapitel "&Operator" ( Makro-stevie hat geschrieben: Ok, lag daran das ich bisher ohne Klammern geschrieben habe.
Wenn man die Variable mit dem Dateinamen in Klammern schreibt, gehts.
Also: use (cname) alias ...
Operator) in diesem Zusammenhang zu lesen.
Sollte man wiederrum eine Cl*pper Application nach Xbase++ migieren
so sind die "Klammer" oft die Lösung:
Code: Alles auswählen
Cl*pper : USE &cName
Xbase++ : USE (cName)
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Da kann ich froh sein, das ich clipper niemals lernen werde.AUGE_OHR hat geschrieben:hi,
Hintergrund: Es wäre zu empfehlen das Kapitel "&Operator" ( Makro-
Operator) in diesem Zusammenhang zu lesen.
Sollte man wiederrum eine Cl*pper Application nach Xbase++ migieren
so sind die "Klammer" oft die Lösung:Code: Alles auswählen
Cl*pper : USE &cName Xbase++ : USE (cName)
- 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
hi,
... und das ist beim migieren oft das Problem wenn man "PARAMETER"
von S87 Funktionen nach v5.x/Xbase++ "umwandelt" dann werden die
Variabeln ja LOCAL sodas unter Xbase++ der &-Makro Operator nicht
mehr funktioniert. In beiden Fällen arbeitete die LOCAL aber mit "(...)".
das Kapitel &-Makro ist aber auch wegen Codeblock zu empfehlen und
deshalb nicht Cl*pper abhängig.
gruss by OHR
Jimmy
JA ... aber nur wenn "cName" PRIVATE istTom hat geschrieben: Cl*pper : USE &cName
Xbase++ : USE (cName)
Xbase++ kann beides!
... und das ist beim migieren oft das Problem wenn man "PARAMETER"
von S87 Funktionen nach v5.x/Xbase++ "umwandelt" dann werden die
Variabeln ja LOCAL sodas unter Xbase++ der &-Makro Operator nicht
mehr funktioniert. In beiden Fällen arbeitete die LOCAL aber mit "(...)".
das Kapitel &-Makro ist aber auch wegen Codeblock zu empfehlen und
deshalb nicht Cl*pper abhängig.
gruss by OHR
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Eigentlich können beide beides !Tom hat geschrieben:Cl*pper : USE &cName
Xbase++ : USE (cName)
Xbase++ kann beides!
Clipper 5.x führte die LOCAL Variablen ein (ich denke mal dass ich mich richtig erinnere). PRIVATE Variablen kann man mit &MyPrivateVar interpretieren bei LOCAL geht das nicht. Egal ob Xbase++ oder Clipper 5.x.
Auf jeden Fall macht aber eine Macro + Private dem Rechner mehr Arbeit als eine Klammer + Local, also einfach Klammern und locale Variablen nutzen. Privates und Public nur verwenden wenn es unbedingt sein muss !
Gruß
Hubert
Hubert
Soory Hubert,
Aber du sagst, dass dies gar nicht gehen könnte. Bei mir geht es doch aber .
Grüße Rolf
das irritiert mich ich verwende mit Xbass++ oft Funktionen mitbrandelh hat geschrieben:PRIVATE Variablen kann man mit &MyPrivateVar interpretieren bei LOCAL geht das nicht. Egal ob Xbase++ oder Clipper 5.x.
Code: Alles auswählen
LOCAL cDbf := "test.dbf"
use &cDbf
Grüße Rolf
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Hi,
jetzt bin ich aber irritiert. Wenn es bei dir geht, ist meine Aussage nicht ganz richtig. Alles hängt mit der Frage des Zustandes zur Ausführungszeit zusammen.
use (cFile) und use &cFile
machen ja nichts anderes als den Textinhalt in der Befehlszeile zu übergeben. So wie du schreibst ist also die einfache Verwendung identisch.
Weiterhin nimmt man den & Macrooperator um Codeblöcke oder komplexe IF Bedingungen zu erstellen. HIER liegt der Unterschied von LOCAL zu PRIVATE Variablen:
daher musste man folgenden Code verwenden:
so aus dem Gedächtnis ...
jetzt bin ich aber irritiert. Wenn es bei dir geht, ist meine Aussage nicht ganz richtig. Alles hängt mit der Frage des Zustandes zur Ausführungszeit zusammen.
use (cFile) und use &cFile
machen ja nichts anderes als den Textinhalt in der Befehlszeile zu übergeben. So wie du schreibst ist also die einfache Verwendung identisch.
Weiterhin nimmt man den & Macrooperator um Codeblöcke oder komplexe IF Bedingungen zu erstellen. HIER liegt der Unterschied von LOCAL zu PRIVATE Variablen:
Code: Alles auswählen
PRIVATE cName := "Hubert"
private cSuchstring := "field->Name = cName"
If &cSuchstring ... funktioniert, da die private Variable cName zur Laufzeit bekannt ist.
Code: Alles auswählen
LOCAL cName := "Hubert"
LOCAL cSuchstring := "field->Name = cName"
If &cSuchstring ... geht nicht, da die locale Variable cName zur Laufzeit nicht mehr den Namen cName hat, sondern nur noch eine Speicheradresse ist.
Code: Alles auswählen
LOCAL cName := "Hubert"
LOCAL cSuchstring := "field->Name = '"+cName+"'"
If &cSuchstring ... geht, da die locale Variable cName zur Compilierzeit aufgelöst wird.
Gruß
Hubert
Hubert
Ok, in der XBase-Hile steht dazu
Grüße Rolf
Ich mach auch solche Sachen und die gehen bisher auch.XBase++ Hilfe hat geschrieben:Der Makro-Operator in Befehlen
Der Makro-Operator kann keine Xbase++ Befehle interpretieren, da diese durch den Präprozessor zu Funktionsaufrufen übersetzt werden. Bei Befehlsargumenten kann der Operator dagegen verwendet werden. Als Beispiel folgende Zeilen:
PRIVATE cFileName := "KUNDEN.DBF"
USE Kunden // USE mit Literal
USE (cFileName) // USE mit Klammern
USE &cFileName // USE mit Makro-Operator
In dem Beispiel ist der Befehl USE in drei verschiedenen Formen angegeben. Der Dateiname kann bei dem Befehl optional als Literal oder als geklammerter Zeichenausdruck angegeben werden. Wenn das Argument mit dem Makro-Operator angegeben ist, wird der Operator vom Präprozessor ignoriert und das Argument wird so behandelt, als ob es in ()-Klammern eingeschlossen ist.
Code: Alles auswählen
//-- Datenbank anlegen falls sie nicht existiert
if !file(cDbf)
dbcreate(cDbf,adbf)
use
endif
//-- Indexdatei anlegen falls sie nicht existiert
if !FILE(cNtx)
use &cDbf
if !neterr()
index on NR to &cNtx
endif
use
endif
//-- Öffnen
use &cDbf shared
- 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
hi,
gruss by OHR
Jimmy
aber da steht doch PRIVATE ?!Rolf hat geschrieben:Ok, in der XBase-Hile steht dazuXBase++ Hilfe hat geschrieben:Der Makro-Operator in Befehlen
PRIVATE cFileName := "KUNDEN.DBF"
USE Kunden // USE mit Literal
USE (cFileName) // USE mit Klammern
USE &cFileName // USE mit Makro-Operator
gruss by OHR
Jimmy
- 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
hi,
tatsächlich scheinen LOCAL auch mit Markos zu gehen ... ?!
noch nicht funktionieren?
Meine NET_USE hatte ich für Xbase++ extra so abgeändert :
wie man sieht verwende ich hier __XPP__ damit ich den Code sowohl
unter Cl*pper als auch Xbase++ verwenden kann.
da aber die "()" bei beiden funktionieren hab ich versucht das "&" möglist
wenig zu verwenden und die "()" zu nehmen.
gruss by OHR
Jimmy
so nun hab ich mir das ganze noch mal angesehen und bin verwundert ...Rolf hat geschrieben: Ich mach auch solche Sachen und die gehen bisher auch.Code: Alles auswählen
//-- Datenbank anlegen falls sie nicht existiert if !file(cDbf) dbcreate(cDbf,adbf) use endif //-- Indexdatei anlegen falls sie nicht existiert if !FILE(cNtx) use &cDbf if !neterr() index on NR to &cNtx endif use endif //-- Öffnen use &cDbf shared
tatsächlich scheinen LOCAL auch mit Markos zu gehen ... ?!
Ist da was geändert worden (in der v1.9x) den danach dürfte es immerHelp file hat geschrieben: Eine Zeichenkette, die Namen für LOCAL- bzw. STATIC-Variablen oder STATIC Funktionen enthält, kann vom Makro-Operator nicht interpretiert werden, da die entsprechenden Symbolreferenzen zur Compile-Zeit aufgelöst werden und zur Laufzeit nicht mehr existieren.
noch nicht funktionieren?
Meine NET_USE hatte ich für Xbase++ extra so abgeändert :
Code: Alles auswählen
DO WHILE .T.
IF FILE( file_dbf )
DO WHILE m_dauer > 0
IF ex_use
#IFDEF __XPP__
IF lNewAlias
USE (file_dbf) EXCLUSIVE ALIAS (myalias)
ELSE
USE (file_dbf) EXCLUSIVE
ENDIF
#ELSE
IF lNewAlias
USE &file_dbf EXCLUSIVE ALIAS &myalias
ELSE
USE &file_dbf EXCLUSIVE
ENDIF
#ENDIF
ELSE
#IFDEF __XPP__
IF lNewAlias
USE (file_dbf) ALIAS (myalias)
ELSE
USE (file_dbf)
ENDIF
#ELSE
IF lNewAlias
USE &file_dbf ALIAS &myalias
ELSE
USE &file_dbf
ENDIF
#ENDIF
ENDIF
IF .NOT. NETERR()
unter Cl*pper als auch Xbase++ verwenden kann.
da aber die "()" bei beiden funktionieren hab ich versucht das "&" möglist
wenig zu verwenden und die "()" zu nehmen.
gruss by OHR
Jimmy
Hallo Jimmy
Das ging auch schon mit der 1.72 von der haben wir gerade auf die 1.90 umgestellt auch ohne Probleme in dem Bereich.
Das Augenmerk ist wahrscheinlich auf den letzten Satz zu setzen.
Das ging auch schon mit der 1.72 von der haben wir gerade auf die 1.90 umgestellt auch ohne Probleme in dem Bereich.
Das Augenmerk ist wahrscheinlich auf den letzten Satz zu setzen.
Grüße RolfXBase++ Hilfe hat geschrieben:Wenn das Argument mit dem Makro-Operator angegeben ist, wird der Operator vom Präprozessor ignoriert und das Argument wird so behandelt, als ob es in ()-Klammern eingeschlossen ist.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Hi,
nein der Knackpunkt liegt darin, dass die Namen von LOCAL oder STATIC Variablen nicht in einem String von dem Macrooperator bearbeitet werden. Texte oder Feldnamen dagegen schon.
Wie oben ausgeführt geht das:
&"Name = 'Hubert'" // wobei NAME ein DBF-Feld ist.
&"Name = cName" // solange cName eine private oder public ist.
aber cName darf keine LOCAL sein. Denn zur Laufzeit versucht Xbase++ eine Variable oder ein Feld NAME und cNAME zu finden. Felder und privates / publics sind per Namen zur Laufzeit bekannt. Local und Statics nicht mehr. Bei letzteren hat der Compiler die Namen in Speicheradressen getauscht, was auch ein Grund für die schnellere Verarbeitung ist.
nein der Knackpunkt liegt darin, dass die Namen von LOCAL oder STATIC Variablen nicht in einem String von dem Macrooperator bearbeitet werden. Texte oder Feldnamen dagegen schon.
Wie oben ausgeführt geht das:
&"Name = 'Hubert'" // wobei NAME ein DBF-Feld ist.
&"Name = cName" // solange cName eine private oder public ist.
aber cName darf keine LOCAL sein. Denn zur Laufzeit versucht Xbase++ eine Variable oder ein Feld NAME und cNAME zu finden. Felder und privates / publics sind per Namen zur Laufzeit bekannt. Local und Statics nicht mehr. Bei letzteren hat der Compiler die Namen in Speicheradressen getauscht, was auch ein Grund für die schnellere Verarbeitung ist.
Gruß
Hubert
Hubert
Hm,
Ich hab nun mal mit dem Compilierflag die *.ppo erzeugt die übersetzt das dann von
nach übersetzt
Mit DbUseArea() scheint das dann auch mit einer Local zu gehen.
Grüße Rolf
Ich hab nun mal mit dem Compilierflag die *.ppo erzeugt die übersetzt das dann von
Code: Alles auswählen
LOCAL cDbf := "Test.dbf"
nSeconds1 := Seconds()
FOR iPos = 1 to 20000
use &cDbf
use
NEXT
nSeconds2 := Seconds()
Msgbox( Alltrim(str(nSeconds2-nSeconds1)) )
Code: Alles auswählen
LOCAL cDbf := "Test.dbf"
nSeconds1 := Seconds()
FOR iPos = 1 to 20000
dbUseArea( .F., , cDbf, , iif(.F. .or. .F., !.F., NIL), .F.)
dbCloseArea()
NEXT
nSeconds2 := Seconds()
Grüße Rolf