USE / DbUseArea() : VIA [erledigt]

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

Moderator: Moderatoren

Antworten
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

USE / DbUseArea() : VIA [erledigt]

Beitrag von AUGE_OHR »

moin,

ich habe ein Problem mit dem VIA in DbUseArea() gemäss der Beschreibung von Alaska ...
DbUseArea( [<lNewArea>] , ;
[<cDBE>|<oSession>] , ;
<cFileName> , ;
[<cAlias>] , ;
[<lShared>] , ;
[<lReadonly>] ) --> NIL

<cDBE>
Mit <cDBE> kann optional die Database-Engine (DBE) bestimmt werden, die die Dateien in der gewünschten Workarea verwalten soll. Es ist eine Zeichenkette, die den Namen der DBE enthält. Falls <cDBE> nicht angegeben ist, wird die DBE verwendet, die durch DbeSetDefault() als Standard-DBE definiert worden ist.
wenn ich keine externe DBESYS verwende sagt DbeSetDefault() -> "DBFNTX", oder :?:
in einer externe DBESYS hätte ich diese DbeBuild(), oder :?:

Code: Alles auswählen

   IF !DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
   IF !DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
die Befehle müssten dann so sein, oder :?:

Code: Alles auswählen

   DbeSetDefault("DBFNTX")
   DbeSetDefault("FOXCDX")
nun habe ich diesen funktionsfähigen Code

Code: Alles auswählen

   IF cDBE = "FOXDBE"
      USE &(cDbf) SHARED VIA "FOXCDX"
   ELSE
      USE &(cDbf) SHARED VIA "DBFNTX"
   ENDIF
   SET INDEX TO &(cCDX)
daraus ergibt sich diese PPO

Code: Alles auswählen

      IF cDBE = "FOXDBE"
         dbUseArea( .F., "FOXCDX", (cDbf), , iif(.T. .or. .F., !.F., NIL), .F.)  
      ELSE
         dbUseArea( .F., "DBFNTX", (cDbf), , iif(.T. .or. .F., !.F., NIL), .F.)  
      ENDIF
      ordListClear() ;ordListAdd( (cCDX) ) 
Frage : USE / DbUseArea()
USE [ <cFileName> ;
...
[ VIA <cDbeName> | (<oSession>) ] ;


DbUseArea( [<lNewArea>] , ;
...
[<cDBE>|<oSession>] , ;
wie auch im Beispiel c:\ALASKA\XPPW32\SOURCE\samples\basics\GuiBrow\DBBROWSE.prg
wird der DBE "Name" angegeben ...

Code: Alles auswählen

   bError := ErrorBlock( {|oErr| Break( oErr ) } )
   cDBE   := "DBFDBE"          // falsch ? müsste DBFNTX sein ?
   FOR i:=1 TO 2
      BEGIN SEQUENCE
         DbUseArea( .T., cDBE, name )
      RECOVER
         IF i== 1
            cDBE := "FOXDBE"   // falsch ? müsste FOXCDX sein ?
            LOOP
         ENDIF
      ENDSEQUENCE
      EXIT
   NEXT
   ErrorBlock( bError )
   IF cDBE = "FOXDBE"
      SET INDEX TO &(cCDX) // <- hier knallt er
   ENDIF
aber damit erhalte ich
oError:args :
-> VALTYPE: C VALUE: d:\ALASKA\WMP\WM9MARK.CDX
oError:canDefault : N
oError:canRetry : J
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Operation wird durch DBE nicht unterstützt
oError:filename :
oError:genCode : 58
oError:operation : OrdListAdd
oError:osCode : 0
oError:severity : 2
oError:subCode : 8015
oError:subSystem : BASE
oError:thread : 1
oError:tries : 2
mir ist das bislang nicht aufgefallen weil ich USE statt DbUseArea() wie das Alaska Beispiel verwende.
aber wenn das Beispiel nicht funktioniert ist auch die Beschreibung von Alaska falsch (!), oder :?:

p.s. natürlich habe c:\ALASKA\XPPW32\SOURCE\samples\basics\GuiBrow\DBBROWSE.prg erweitert um DBESYS.
Dateianhänge
DBBROWSE.ZIP
geändeter Source
(2.22 KiB) 256-mal heruntergeladen
Zuletzt geändert von AUGE_OHR am Do, 06. Okt 2016 19:09, insgesamt 2-mal geändert.
gruss by OHR
Jimmy
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: USE / DbUseArea() : VIA

Beitrag von brandelh »

DbeSetDefault("DBFNTX") // nun ist DBFNTX default
DbeSetDefault("FOXCDX") // nun ist FOXCDX default


es kann nur einen default geben, dabei überschreibt der letzte Aufruf den anderen ;-)
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: USE / DbUseArea() : VIA

Beitrag von AUGE_OHR »

brandelh hat geschrieben:es kann nur einen default geben, dabei überschreibt der letzte Aufruf den anderen ;-)
klar ... es ging NUR um die Syntax !

das was bei DbeSetDefault() raus kommt, also "DBFNTX" oder "FOXCDX" gehören in DbUseArea() und nicht das was Alaska in den Demo Beispielen hat, oder :?:
gruss by OHR
Jimmy
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: USE / DbUseArea() : VIA

Beitrag von brandelh »

Ich denke, dass man auch ohne Indexteil öffnen könnte, wenn man keinen braucht.
Aber dafür müsste diese z.B. DBFDBE sichtbar sein, meist (Standard) wird sie aber versteckt geladen:

Code: Alles auswählen

// FOXCDX Database-Engine erzeugen 

// Das Beispiel zeigt eine DbeSys() Prozedur bei der die 
// FOXCDX Database-Engine erzeugt wird. 
 
   PROCEDURE DbeSys() 
      IF ! DbeLoad( "FOXDBE", .T.) // versteckt, da 2. Parameter .t.
         Alert( "Database-Engine FOXDBE nicht geladen", {"OK"} ) 
      ENDIF 
    
      IF ! DbeLoad( "CDXDBE", .T.) // versteckt, da 2. Parameter .t. 
         Alert( "Database-Engine CDXDBE nicht geladen", {"OK"} ) 
      ENDIF 
 
      IF ! DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" ) 
         Alert( "FOXCDX Database-Engine;" + ; 
                "konnte nicht erzeugt werden" , {"OK"} ) 
      ENDIF 
 
      DbeSetDefault( "FOXCDX" ) 

   RETURN 
wenn du also sowohl DBFNTX als auch FOXCDX verwenden willst, dann musst du diese als Name angeben.
Gruß
Hubert
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: USE / DbUseArea() : VIA

Beitrag von brandelh »

zur Verdeutlichung, DBFDBE und NTXDBE und DBFNTX sind DBEs - die mit DBE im Namen enthalten grundlegende Komponenten, die DBFNTX ist zusammengesetzt, aber alles sind DBEs.

Hier ein Beispiel dafür, dass auch NUR die Datakomponente benutzt wird (dies habe ich mit der 2.00 erstellt und es läuft) :

Code: Alles auswählen

#include "Common.ch"

PROCEDURE DbeSys()
      IF ! DbeLoad( "DBFDBE", .F.) // sichtbar laden
         Alert( "Database-Engine FOXDBE nicht geladen", {"OK"} )
      ENDIF

      /* - Kein Index erwünscht !
      IF ! DbeLoad( "NTXDBE", .t.)
         Alert( "Database-Engine CDXDBE nicht geladen", {"OK"} )
      ENDIF
      * wenn ich nichts kombinieren will brauche ich das auch nicht
      IF ! DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
         Alert( "DBFNTX Database-Engine konnte nicht erzeugt werden" , {"OK"} )
      ENDIF

      */

      DbeSetDefault( "DBFDBE" )

   RETURN

/* This is our main procedure
 */
PROCEDURE Main

   /* we use the ansi charset by default */
   SET CHARSET TO ANSI

   /* $TODO: place your application code here */

   dbcreate("test", { { "Name","c",50,0 }} )

   use test VIA DBFDBE

   IF neterr()
      msgbox( "Neterr() - USE")
   ELSE

      append blank

      IF neterr()
         msgbox( "Neterr() - append")
      ELSE

         replace FIELD->name with "Test "+dtoc(date())

         msgbox( "Test:  " + alltrim(FIELD->name) )

      ENDIF
   ENDIF
RETURN

Natürlich darf ich nun KEINE Indexdatei verwenden.
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: USE / DbUseArea() : VIA

Beitrag von AUGE_OHR »

ok habe es kapiert :
In dem Beispiel werden zwei Component-DBEs in den Speicher geladen, die in den Dateien DBFDBE.DLL und NTXDBE.DLL gespeichert sind. Aus den beiden Component-DBEs wird anschließend eine Compound-DBE erzeugt, die den Namen "DBFNTX" hat und sowohl DBF-Dateien (DATA-Komponente) als auch NTX-Dateien (ORDER-Komponente) verwalten kann.
gruss by OHR
Jimmy
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: USE / DbUseArea() : VIA [erledigt]

Beitrag von Koverhage »

Ich benutze normalerweise DBFCDX mit DBT Memodateien.
Jetzt muss ich Daten importieren die im FOXCDX Format mit FPT Memodateien vorliegen.
Kriege das mit VIA nicht hin. Was muss ich tun ?
Habe die Struktur geändert und die Memodateien gelöscht, bekomme aber immer noch einen Fehler beim Öffnen.
Gruß
Klaus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: USE / DbUseArea() : VIA [erledigt]

Beitrag von Manfred »

hm, ich habe auch schon mal konvertiert.
machst Du das mit DBImport() oder kopieren mit Satz für Satz?
Es sollte eigentlich genügen die CDX mit dem DBFCDX zu öffnen und die FOX mit Foxcdx und dann umschaufeln.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: USE / DbUseArea() : VIA [erledigt]

Beitrag von brandelh »

welchen Fehler ? ;-)

die DBESYS muss alle sichtbar zur Verfügung stellen die du brauchst, dann beide mit VIA öffnen und hin und her kopieren.
Gruß
Hubert
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: USE / DbUseArea() : VIA [erledigt]

Beitrag von Koverhage »

Werde jetzt den Header mit einem Hex-Editor ändern, das geht für die paar Dateien schneller.
Danke.
Gruß
Klaus
Antworten