Mehrere Tags erzeugen klappt nicht [Erledigt]

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Mehrere Tags erzeugen klappt nicht [Erledigt]

Beitrag von Jan »

Hallo,

ich versuche aus dem Programm heraus mehrere Tags in einem Index zu erzeugen. Und da gibt es irgend ein Problem bei. Das ist der Code:

Code: Alles auswählen

            FOR i := 1 TO Len(aIndex)
                IF Len(aIndexSchluessel) >= i
                   oStatic := XbpStatic():new(, , {15, 45}, {670, 45})                          // Static und oFortschritt hier erstellen, sonst sind die immer sichtbar, auch ohne Indexerstellung
                   oStatic:type := XBPSTATIC_TYPE_GROUPBOX
                   oStatic:caption := "Indexfortschritt"
                   oStatic:create()

                   oFortschritt := XbpProgressBar():New(oStatic, , {5, 5}, {660, 20})
                   oFortschritt:UseVisualStyle := .T.
                   oFortschritt:Create()

                   oFortschritt:minimum := 0
                   oFortschritt:maximum := Max(LastRec(), 1)
                   oFortschritt:setIncrement(1)

                   IF Len(aIndexSchluessel[i]) > 3                                              // FOR-Klausel
                      OrdCondSet(aIndexSchluessel[i][4], {|| aIndexSchluessel[i][4]}, , , ,  , RECNO(), , , , , , , )
                   ENDIF
                   IF MEMVAR->oSession <> NIL .OR. (MEMVAR->oSession == NIL .AND. cDbe == "FOXCDX")
                      OrdCreate(cDbf, ;
                                aIndexSchluessel[i][2], ;
                                aIndexSchluessel[i][1] , ;
                                {|| Indexfortschritt(@oFortschritt, oStatic, aIndexSchluessel[i]), &(aIndexSchluessel[i][1])}, ;
                                IIf(Len(aIndexSchluessel[i]) > 2, ;                             // Wenn es einen 3. Eintrag im Array gibt: Unique
                                    aIndexSchluessel[i][3], ;
                                    .F.))
                     ELSE
                      OrdCreate(cPfad + aIndexSchluessel[i][2], ;
                                , ;
                                aIndexSchluessel[i][1], ;
                                {|| Indexfortschritt(@oFortschritt, oStatic, aIndexSchluessel[i]), &(aIndexSchluessel[i][1])}, ;
                                IIf(Len(aIndexSchluessel[i]) > 2, ;                             // Wenn es einen 3. Eintrag im Array gibt: Unique
                                    aIndexSchluessel[i][3], ;
                                    .F.))
                   ENDIF
                   IF Len(aIndexSchluessel[i]) > 3                                              // FOR-Klausel
                      OrdCondSet()                                                              // FOR-Klausel wieder zurücksetzen
                   ENDIF
                   oStatic:destroy()
                   oStatic := NIL
                ENDIF
            NEXT
Der erste zu erzeugende Tag wird immer sauber erzeugt. Aber beim zweiten kommt dann die Fehlermeldung

Code: Alles auswählen

oError:args         :
oError:canDefault   : .T.
oError:canRetry     : .F.
oError:canSubstitute: .F.
oError:cargo        : {NIL, 5089, "Error 5089:  The operation is not valid for the auto-open index.  Can't close an autoopen index."}
oError:description  : D
oError:filename     : 
oError:genCode      : 8999
oError:operation    : DbCloseArea
oError:osCode       : 0
oError:severity     : 2
oError:subCode      : 0
oError:subSystem    : BASE
oError:thread       : 1
oError:tries        : 0
Ich schließe doch aber nirgends irgendwas. Oder doch?

Ich kann also immer einen Tag erzeugen, Programm nach Fehlermeldung schließen, neu starten, nächsten Tag erzeugen. Etwas mühselig und wenig bedienfreundlich ...

Nachtrag: Der Fehler tritt genau dann auf, wenn das zweite OrdCreate() aufgerufen wird.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Mehrere Tags erzeugen klappt nicht

Beitrag von Jan »

Gefunden.

In OrdCreate() gibt es einen sechsten Parameter. Den ich nie beachtet hatte, der mir immer vollkommen egal war.
Alaski-Hilfe hat geschrieben:<lAdditive>
Durch <lAdditive> wird bestimmt, ob bestehende Index-Dateien in der Workarea bei der neuen Index-Generierung geöffnet bleiben sollen. Der Standardwert ist .F. (falsch), d.h. bestehende Index-Dateien werden geschlossen, bevor der neue Index erzeugt wird. Bei Angabe von .T. (wahr) bleiben Index-Dateien in der Workarea geöffnet.
Wenn ich den auf .T. setze, dann klappt das. ADS ist da wohl anders gestrickt als die normale FOXCDX ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Mehrere Tags erzeugen klappt nicht

Beitrag von brandelh »

Ich habe mal die betreffenden Zeilen untereinander stellt, damit man die Paramter besser vergleichen kann ...

Code: Alles auswählen

OrdCreate( <cIndexFile> , [<cTagName>], <cIndexKey>  , [<bIndexKey>] , [<lUnique>]   ,    [<lAdditive>]   ) --> NIL 

OrdCreate(cDbf,                         aIndexSchluessel[i][2], aIndexSchluessel[i][1], {|| Indexfortschritt(@oFortschritt, oStatic, aIndexSchluessel[i]), &(aIndexSchluessel[i][1])}, IIf(Len(aIndexSchluessel[i]) > 2, aIndexSchluessel[i][3], .F.))
OrdCreate(cPfad+aIndexSchluessel[i][2],                       , aIndexSchluessel[i][1], {|| Indexfortschritt(@oFortschritt, oStatic, aIndexSchluessel[i]), &(aIndexSchluessel[i][1])}, IIf(Len(aIndexSchluessel[i]) > 2, aIndexSchluessel[i][3], .F.))
wenn ich zwei Indexe in einer CDX angelegt habe, habe ich beim zweiten Index den ersten Parameter NIL gelassen, aber den zweiten immer ausgefüllt.
Ob das bei dir und der ADS anders sein kann, weiß ich nicht, aber eine CDX mit mehreren Indexen OHNE TAG-Name macht für mich keinen Sinn.
Ob der letzte Parameter richtig gesetzt ist, kann man hier nicht erkennen, da der Inhalt der Arrays nicht bekannt ist.

Der Versuch eine NEU Indexdatei in einer schon geöffneten Datei mit falschem 5. oder 1. Parameter anzulegen, sollte in einem "Zugriff verweigert" Fehler enden, was gut passen würde ;-)
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: Mehrere Tags erzeugen klappt nicht

Beitrag von brandelh »

Jan hat geschrieben:Gefunden.
In OrdCreate() gibt es einen fünften Parameter. Den ich nie beachtet hatte, der mir immer vollkommen egal war ...
Wenn ich den auf .T. setze, dann klappt das. ADS ist da wohl anders gestrickt als die normale FOXCDX ...
Jan
Ich sehe oben den Code als 5. Parameter:
IIf(Len(aIndexSchluessel) > 2, aIndexSchluessel[3], .F.)
Beachtet hast du ihn also, aber ich denke dass dies so nicht richtig ist, was der FOXCDX wohl egal war:

Beim ersten Index der in einer Datei erzeugt wird muss der 5. auf .f. sitzen,
bei den restlichen (der erste bleibt offen) auf .t. ... ich meine dann auch den Dateinamen auf NIL lassen.

Deine IIF() Abfrage gibt immer .t. aus, wenn 2 Indexe erzeugt werden sollen.
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: Mehrere Tags erzeugen klappt nicht [Erledigt]

Beitrag von brandelh »

Wobei entgegen meiner .t. / .f. Anmerkung dieser code fehlerfrei funktioniert (die CDXDBE scheint sehr flexibel zu sein):

Code: Alles auswählen

                   use (cDBF) EXCLUSIVE NEW alias INDEXOKMAIN
                   if netErr()
                      ErrBox( NETZFEHLEREXCL, "Fehler bei Datei: "+aDBF[x]+".DBF",oOwner )
                      lFehler := .t.
                   else
                      do case
                         case upper(aDBF[x]) == "UNFALL"
                              bAktion := {|| INDEXOKMAIN->(OrdCreate(cCDX,"AZ","AZ")),;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"PA_ID","PA_ID")),;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"UNFDAT","UNFDAT")) }
                         case upper(aDBF[x]) == "PATIENT"
                              bAktion := {|| INDEXOKMAIN->(OrdCreate(cCDX,"PA_ID","PA_ID")),;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"GEBDAT","GEBDAT")) }
                         case upper(aDBF[x]) == "DIAGNOSEN"
                              bAktion := {|| INDEXOKMAIN->(OrdCreate(cCDX,"DI_ID","DI_ID")),;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"AZ","AZ")) }
                         case upper(aDBF[x]) == "TERMINE"
                              bAktion := {|| INDEXOKMAIN->(OrdCreate(cCDX,"TE_ID","TE_ID")) ,;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"AZ","AZ"))       ,;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"SB_ID","SB_ID"))  ,;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"TE_DAT","TE_DAT")) }
                         case upper(aDBF[x]) == "VOR_KOMP"
                              bAktion := {|| INDEXOKMAIN->(OrdCreate(cCDX,"ID","ID"))  ,;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"DI_ID","DI_ID")),;
                                             INDEXOKMAIN->(OrdCreate(cCDX,"AZ","AZ")) }
                      endcase

                      WaitBox( "Index "+aDBF[x]+OrdBagExt()+" erstellen ...",bAktion )

                      close INDEXOKMAIN         //  schließen nicht vergessen !
WaitBox zeigt eine Infos an und ruft dann Eval(bAktion) auf, also hier wird der 5. komplett ignoriert und es geht doch.
In einem anderen Beispiel habe ich alles auf .t. schließe aber die Indexdatei dazwischen immer und auch das geht.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Mehrere Tags erzeugen klappt nicht [Erledigt]

Beitrag von Jan »

Hubert,

stimmt, es ist natürlich der sechste Parameter. Hab das mal in dem betreffenden Beitrag von mir korrigiert, falls jemand das später mal lesen sollte.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Mehrere Tags erzeugen klappt nicht [Erledigt]

Beitrag von brandelh »

Jan hat geschrieben:Hubert,
stimmt, es ist natürlich der sechste Parameter. Hab das mal in dem betreffenden Beitrag von mir korrigiert, falls jemand das später mal lesen sollte.
Jan
huch, das habe ich auch überlesen, ich ging nach deiner Erläuterung davon aus, dass das IFF() für den letzten Parameter gedacht ist und habe nicht geprüft wieviele es tatsächlich sind. ;-)
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: Mehrere Tags erzeugen klappt nicht [Erledigt]

Beitrag von brandelh »

und hier habe ich noch ein Beispiel gefunden, bei dem ich immer den 6. Parameter auf .t. habe, obwohl ich den Index jeweils schließe, auch das Programm arbeitet seit Jahren problemlos:

Code: Alles auswählen

         ::UseDB(.T.)                      // rekursiv aufrufen. Ein möglicher Fehler wird das Programm beenden
         (::nUD)->(OrdCreate( ::cUvDiag ,;
                    "OrdVKVA",;          
                    "VK+VA",;
                    { || field->VK+field->VA } ,;
                    .f.,;                // Unique ?
                    .t. ))
         (::nUD)->(OrdListClear())

         (::nUD)->(OrdCreate( ::cUvDiag ,;
                    "OrdKEY",;        
                    "KEY+VK+VA",;
                    { || field->KEY+field->VK+field->VA } ,;
                    .f.,;                // Unique ?
                    .t. ))
         (::UD)->(OrdListClear())

         if ! File(::cIND)               // Index fehlt immer noch
            errbox("Die Indexdateien konnten nicht erzeugt werden !"+CRLF+;
                   "Läuft das Programm etwa schon ?"+CRLF+;
                   "Programm wird beendet !")
            AppQuit(.t.)
         endif

         (::UD)->(dbclosearea())      // Exclusive Öffnung beenden !
Das ist schon seltsam ;-)
Gruß
Hubert
Antworten