Database Engines

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

Moderator: Moderatoren

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:Nachdem die Indexdatei erzeugt wurde, verläßt das PRG die Begin Seq und kommt zum RETURN und beendet sich.
oh Mann! Das EXIT habe ich ja völlig übersehen!
Manfred hat geschrieben:Es ist spät und ........
Oh jaa.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo!

Ich meine, das das Problem liegt an der Variable: shared := .T.

Die Datenbank wird nach dem Code "shared" geoffnet. Bei der Indizierung wird die Index-Datei im "non shared" -Modus geöffnet.

Wenn also bei Öffnen der Datenbank die Datenbank samt Index-Datei shared geöffnet und anschließend ein INDEX ON durchgeführt wird, führt dies zu einem Laufzeitfehler. Wenn die Index Datei nicht vorhanden ist, wird diese auch nicht shared geöffnet und die Datei kann im "exclusisive Modus" erzeugt werden.

Setze "shared := .F." und es sollte eigentlich funktionieren.

Gruß, Olaf
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Olaf,
bist Du Dir sicher? Meiner Meinung nach ist das AutoOpen eines gleichnamigen Indexes nur bei CDX-Dateien implementiert, oder?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin, Hi Olaf
Martin Altmann hat geschrieben:Olaf,
bist Du Dir sicher? Meiner Meinung nach ist das AutoOpen eines gleichnamigen Indexes nur bei CDX-Dateien implementiert, oder?
Hm, das mit dem Shared hatte/habe ich auch in Verdacht, aber es verwundert mich, dass nicht sofort eine Meldung kam/kommt. Ich hatte es anfänglich, weil unter Clipper ein Shared Indexaufbau möglich ist. Unter Xbase++ aber angeblich nicht. Diese Fehlermeldung kam aber nur als ich auf Xbase++ umgestiegen bin und ich habe sie bei diesem Programm vermißt.

So, das mit dem AutoOpen.... stimmt, daran habe ich überhaupt nicht gedacht, das ist jetzt das nächste was ich ausprobieren werde. Vor allen Dingen werde ich einmal suchen müssen, wo dass denn nun schon wieder steht in der Doku....... tsetsetse :study:

Ich melde mich gleich wieder mit einem/dem Ergebnis
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
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Martin,
über "AutoOpen" kann das automatische Öffnen von CDX-Dateien zu einer Workarea beinflußt werden. Inwieweit dies hier zum Problem "Indizierung einer NTX-Datei" gehört, ist mir nicht ganz klar ;-)

Grundsätzlich erfolgt das Öffnen von Index-Dateien immer unter dem Modus der Workarea-Datei. Ich kenne keine Möglichkeit, eine Workarea im shared-Modus zu öffenen und die Index-Dateien im "exclusive-Modus". Mal agesehen davon, welchen Sinn sollte das auch machen?

Gruß, Olaf
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Ein Aufbau einer Index-Datei (NTX) sollte auch unter Clipper nur dann möglich sein, wenn die Datenbank shared geöffnet wird und die Indexdatei noch nicht besteht.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Olaf,
er "öffnete" ja keine Indexdatei, sondern erzeugte sie jedesmal neu! Und das geht natürlich nicht, wenn die Datei in Benutzung ist!
Im übrigen ist die Indexdatei immer für alle anderen gesperrt, sobald einer schreibend darauf zugreift (also einen Eintrag hinzufügt oder ändert).
Bisher war das bei NTX-Dateien immer die komplette Indexdatei und bei CDX nur der jeweilige Satz. Dies ändert sich aber mit der neuen Version.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Olaf,

jetzt wo Du es direkt erwähnst. Ich habe nochmals in den alten Codes nachgesehen. Ich habe die Dateien vorher gelöscht.

Also nehme ich alles zurück was ich vorher behauptet habe.

Das es aus dieser Sicht Unterschiede gibt, habe ich bis vorhin NICHT gewußt. Steht das auch in der Doku und ich habe es mal wieder überlesen?

Langsam wird mir unheimlich......
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

so läuft das Teil jetzt einwandfrei durch. Und zwar so oft ich will. (5x habe ich probiert) DBESYS habe ich mir jetzt gespart, steht ja oben

Code: Alles auswählen

PROCEDURE main()
          LOCAL bSaveError := ErrorBlock()
          LOCAL oError
          LOCAL lNewArea := lShared := .T., lReadOnly := .F.
          LOCAL cDBE, cAlias, cText
          LOCAL n := 2

          DO WHILE .T.
             ErrorBlock( {|e| BREAK(e)})
             BEGIN SEQUENCE
                   IF n = 1
                      cDBE := "DBFNTX"
                      DbeSetDefault(cDBE)
                   ELSE
                      cDBE := "DBFCDX"
                      DbeSetDefault(cDBE)
                   ENDIF
                   DBUSEAREA(lNewArea,cDBE,"test",cAlias,lShared,lReadOnly)
                   IF cDBE == "DBFNTX"
                      INDEX ON UPPER(v_titel) TO testntx
                   ELSE
                      INDEX ON UPPER(v_titel) TAG titel TO testcdx
                   ENDIF
             RECOVER USING oError
                   ErrorBlock( bSaveError)
                   IF fehlerbehandlung(oError)
                      BREAK
                   ENDIF
                   LOOP
             END SEQUENCE
             ErrorBlock( bSaveError)
             EXIT
          ENDDO .T.
          RETURN
********************************************************************************
FUNCTION fehlerbehandlung(oError)
         LOCAL lSuccess := .T.
         IF oError:osCode = 32
            cTExt := "Ungültige Shareoption"
         ENDIF
         IF ! oError:canRetry
            lSuccess := .F.
         ENDIF
         RETURN(lSuccess)
Shared Modus interessiert hier wirklich nicht habe ich festgestellt. Dafür dürfte wohl Additive zuständig sein, wie ich verstanden habe. Allerdings wird der Index für CDX jedesmal größer. Auch hier die Frage: Wo steht, dass der vorher gelöscht werden muß?
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
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Martin Altmann hat geschrieben:Hallo Olaf,
er "öffnete" ja keine Indexdatei, sondern erzeugte sie jedesmal neu! Und das geht natürlich nicht, wenn die Datei in Benutzung ist!
Das ist richtig. Gleichwohl geht aus der xBase-Doku hervor, dass eine Datenbank exclusive geöffnet werden muss, um eine Index-Datei zu erzeugen.

Im Grunde beschreibst Du ein besonderes Phänomen: Wird eine Datenbank shared geöffnet und eine Indexdatei erzeugt, die zum Zeit des Aufbaus noch nicht existiert, funktioniert dies auch im shared Modus. Das liegt wohl daran, dass erst nach Fertigstellung der Index-Datei das shared-Flag betriebssystemseitig gesetzt wird.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Nönö,

da muß ich ein Veto einlegen, ich erzeuge die Datei nicht jedesmal neu. Es passiert nur beim 1.Durchlauf, danach wird nicht gelöscht, sondern einfach nur der Befehl Index on aufgerufen.

Die NTX Datei wird wohl jedesmal vom System her gelöscht, aber die CDX Datei wird wohl nicht gelöscht, sondern immer größer.
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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Manfred,
dochdoch! ;-)
Index on erzeugt immer eine Indexdatei neu!
Bei NTX bedeutet dies, das die alte Indexdatei überschrieben wird!
Bei CDX bedeutet dies, das in der alten Indexdatei ein neuer Index abgelegt wird (darum wird sie größer)!
Manfred hat geschrieben:Allerdings wird der Index für CDX jedesmal größer. Auch hier die Frage: Wo steht, dass der vorher gelöscht werden muß?
Ich hatte es aus den Alaska-Newsgroups.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Manfred hat geschrieben:Nönö,

da muß ich ein Veto einlegen, ich erzeuge die Datei nicht jedesmal neu. Es passiert nur beim 1.Durchlauf, danach wird nicht gelöscht, sondern einfach nur der Befehl Index on aufgerufen.

Die NTX Datei wird wohl jedesmal vom System her gelöscht, aber die CDX Datei wird wohl nicht gelöscht, sondern immer größer.
Die CDX-Datei wird in Deinem Beispiel wohl auch nicht geöffnet. Zumindest sehe ich kein "AutoOpen".

Solltest Du die Test-Datei vorher in einer anderen Workarea shared öffnen und auch die CDX-Datei (wie in einer Netzwerkumgebung) , wird die Indizierung nach Deinen Beispiel mit Sicherheit nicht funktionieren!


Gruß, Olaf
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

habe ich ja geschrieben: NTX wird erneuert (richtig) und CDX wird wohl angepeppt, oder wie man das nennen mag.

Es ist nur halt, ohne hier jetzt eine unendliche Geschichte heraufzubeschwören ;-) , wo hätte ich das lesen können, dass es bei CDX so ist. Für mich war die Bezeichnung CDX bekannt und was es bringen würde, aber alles andere.... naja egal, jetzt weiß ich es.
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Gleich kriege ich hier einen offenen Schakaballa,

was ist denn schon wieder AutoOpen? In der Doku finde ich nichts da drüber.
Macht mich hier nicht strubbelig.
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
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Autopen

Beitrag von Lewi »

"AutoOpen" gibt es als XBase-Befehl nicht. Entwickler, die vor Urzeiten! mit dem Comix-Treiber ( Foxpro-kompatible Datenbanken unter CLIPPER) gearbeitert haben, kennen diese Option in Verbindung mit dem automatischen Öffnen von CDX-Dateien beim Öffnen von Datenbanken.

In xBase muß diese Funktion händisch nachprogrammiert werden, in dem eine eigene Routine für das Öffenen von Datenbanken geschrieben wird, die dann wiederum feststellen muss, ob für die Datenbank eine Index-Datei gleichen Namens mit der Extention ".CDX" vorhanden ist und öffnet diese gegebenfalls.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Puh,

seit gestern stehe ich kurz vor der Verzweiflung. Irgendwie hatte ich das Gefühl ich hätte alles überlesen, was hier angesprochen wurde.

Manohman.

Ok, das klärt alles.

Danke.... 8)
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!!
olaf870
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 128
Registriert: Mi, 26. Okt 2005 18:41
Wohnort: Berlin
Kontaktdaten:

Beitrag von olaf870 »

Hallo Manfred,
zum Erzeugen eines Indexes muß die Datei excl geöffnet werden. Daß Xbase überhaupt indiziert, wenn die Datei nicht excl geöffnet ist, ist ein Bug, denn auf die erzeugte Indexdatei ist dann kein Verlass.

Eine Bemerkung noch am Rande:
Noch schlimmer sieht es bei reindex aus. Hier geschehen ab Version 1.9 ganz absonderliche Dinge bei Verwendung des NTX-Treibers . Am besten also auf reindex ganz verzichten.

Gruß
Olaf
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hallo Olaf,

hatte ich mir schon gedacht....

Das der Aufbau nicht Exclusive damals gemacht wurde, war nur ein Versehen und ist mir dann irgendwann später aufgefallen.

Und REINDEX benutze ich überhaupt nicht mehr, weil ich da gelesen hatte (ja, man höre und staune) das das eigentlich Murks ist.
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

So, das hier arbeitet nun genau so, wie ich es haben will.
cDBE wechseln und der Rest geht automatisch.
Natürlich voher immer die Indexdatei löschen ;-). Ist aber immer schon der Fall gewesen.

Code: Alles auswählen

PROCEDURE main()
          LOCAL bSaveError := ErrorBlock()
          LOCAL bIndexKey  := NIL
          LOCAL oError
          LOCAL lNewArea  := .T., lShared := .F., lReadOnly := .F.
          LOCAL lUnique   := .F.
          LOCAL lAdditive := .F.
          LOCAL cDBE := "DBFNTX", cAlias := "Test"
          LOCAL cIndexFile := "text", cTagName := "Titel"
          LOCAL cIndexKey := "UPPER(test->v_titel)"

          DO WHILE .T.
             ErrorBlock( {|e| BREAK(e)})
             BEGIN SEQUENCE
                   DBUSEAREA(lNewArea,cDBE,"test",cAlias,lShared,lReadOnly)
                   OrdCreate(cIndexFile,cTagName,cIndexKey,bIndexKey,lUnique,lAdditive)
             RECOVER USING oError
                   ErrorBlock( bSaveError)
                   IF fehlerbehandlung(oError)
                      BREAK
                   ENDIF
                   LOOP
             END SEQUENCE
             ErrorBlock( bSaveError)
             EXIT
          ENDDO .T.
          RETURN
********************************************************************************
FUNCTION fehlerbehandlung(oError)
         LOCAL lSuccess := .T.

         IF ! oError:canRetry
            lSuccess := .F.
         ENDIF
         RETURN(lSuccess)
Jetzt hoffe ich nur noch, dass das alles auch im Livesystem klappt und nicht irgendwann später Probleme bringt mit der Mischerei.

Besten Dank für eure Ausdauer....

Bis demnächst. :lol:
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!!
Antworten