USE / DbUseArea() : VIA [erledigt]

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

Moderator: Moderatoren

USE / DbUseArea() : VIA [erledigt]

Beitragvon AUGE_OHR » Do, 06. Okt 2016 10:05

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) 7-mal heruntergeladen
Zuletzt geändert von AUGE_OHR am Do, 06. Okt 2016 18:09, insgesamt 2-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: USE / DbUseArea() : VIA

Beitragvon brandelh » Do, 06. Okt 2016 10:18

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: USE / DbUseArea() : VIA

Beitragvon AUGE_OHR » Do, 06. Okt 2016 10:26

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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: USE / DbUseArea() : VIA

Beitragvon brandelh » Do, 06. Okt 2016 11:40

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: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: USE / DbUseArea() : VIA

Beitragvon brandelh » Do, 06. Okt 2016 14:29

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: USE / DbUseArea() : VIA

Beitragvon AUGE_OHR » Do, 06. Okt 2016 18:08

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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg


Zurück zu Daten und Tabellen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste