Seite 2 von 2

Verfasst: So, 09. Jul 2006 1:56
von brandelh
Hallo Manfred,

ich habe nahezu ausschließlich entweder Auswahllisten in Listboxen oder selten in QuickBrowse Arrays.

Mehrere Dateien, welche 1:n (ein Stammsatz, mehrere Kinddatensätze) verbunden sind würde ich nie in einem Browser anzeigen, sondern kombiniert wie schon vorgeschlagen wurde:

Listbox oder Browser mit Hauptbegriff (z.B. DB1) plus
2. Browser für Kinddatensätze (z.B. DB2) dieser steuert
3. Browser für Kinder der Kinddatensätze (z.B. DB3)

Ändert sich die Position im 1. Browser, (stablecodeblock oder select...), dann wird entweder mit seek oder scope der 2. und daraus dann der 3. positioniert.
Ändert sich die Position nur im 2. Browser, einfach nur den 3. nachziehen.

etc.

Verfasst: So, 09. Jul 2006 4:41
von AUGE_OHR
hi,
Manfred hat geschrieben: wie löst ihr denn dann das Problem in einem Browsefenster?
Dort kann doch nicht jedesmal ein Dbseek abgeschickt werden,
wenn mehrere "verknüpfte" Tabellen angezeigt werden sollen, oder?
na klar geht das, du musst bloss den "richtigen" Moment "abwarten".
hier mal der (Cl*pper) Code für 2 Browser

Code: Alles auswählen

   // set up browse and display it
   aoBrowse[1] := ABZU1Browse(ozeile,ospalte,uzeile,uspalte)
   DispBrowse(aoBrowse[1])

   // set up browse and display it
   aoBrowse[2] := ABZU2Browse(ozeile,ospalte,uzeile,uspalte)
   aoBrowse[2]:goTop()
   DispBrowse(aoBrowse[2])

   DISPEND()                // end display buffering
   nCursSave := SETCURSOR(SC_NONE)
   // set browse pointer to first browse defined
   nBP := 1
   DispBrowse(aoBrowse[nBP])

   lMore := .T.
   DO WHILE lMore
      nKey := 0
      DISPBEGIN()
      DO WHILE (nKey := INKEY()) == 0
         IF aoBrowse[nBP]:stabilize()
            EXIT
         ENDIF
      ENDDO
      DISPEND()

      IF aoBrowse[nBP]:stable

         IF aoBrowse[nBP]:hitTop .OR. aoBrowse[nBP]:hitBottom
            TONE(125, 0)
         ENDIF

         // update other browse screens in case relations are set
*         IF !EMPTY(DBRELATION(1))
         IF nBP = 1
            cREFNO := ARTQUALI->QNUMMER+ARTQUALI->QARTNR
            SELECT ABZU
#IFDEF __XPP__
            SET SCOPE TO cREFNO
#ELSE
            SET FILTER TO ABZU->ABZUREF+ABZU->ABZUNR = cREFNO
#ENDIF

            oCol := aoBrowse[2]:getColumn(fix_posi)
oCol:FOOTING := EVAL( TOTAL(ABZU->ABZUMENGE,ABZU->ABZUMODUS='AUS') ,;
                {|| ABZU->ABZUREF+ABZU->ABZUNR = cREFNO } ,;
                    ABZU->ABZUREF+ABZU->ABZUNR = cREFNO )
            aoBrowse[2]:setColumn(fix_posi, oCol)

            SELECT ARTQUALI
            DrawAll(aoBrowse, nBP)
         ENDIF

         aoBrowse[nBP]:hilite()

         nKey := TB_INKEY(300)                  // max 300 sec
      ENDIF

      DO CASE                                   // Apply the key to the browse

gruss by OHR
Jimmy

evtl. BUG bei Relation / Child APPEND BLANK

Verfasst: Fr, 28. Jul 2006 3:54
von AUGE_OHR
hi,

hat jemand folgende "Construktion" am laufen :

Code: Alles auswählen

SELECT 1
USE MAIN
...
SELECT 2
USE CHILD
SET INDEX TO ...
...
SELECT 1
SET RELATION TO MAIN->blabla INTO CHILD
...
SELECT 2
APPEND BLANK
also ich bin in der "Child", welche in Relation ist und versuche
eine leeren Datensatz anzuhängen und es "crasht" ...

geht das nicht ? (hab es noch nicht mit Cl*pper versucht ...)

gruss by OHR
Jimmy

Verfasst: Fr, 28. Jul 2006 7:59
von brandelh
Hallo Jimmy,

ich meine mich erinnern zu können sowas mal unter VO mit einer selectiven Relation gemacht zu haben. Da war das Problem, dass immer nach dem Append Blank der Datensatz sofort verschwunden ist, da ja der Suchbegriff nicht identisch war. Bei einer 'normalen' Relation dürfte das aber nicht vorkommen.

Ich habe damals die DBF ein 2. Mal ohne Relation geöffnet, append blank und replace Suchbegriff gemacht und wieder geschlossen. Danach die child DBF refreshed und den neuen Satz gespeichert.

Verfasst: Fr, 28. Jul 2006 18:05
von AUGE_OHR
hi,
brandelh hat geschrieben: ich meine mich erinnern zu können sowas mal unter VO mit einer selectiven Relation gemacht zu haben.
... aber unter Xbase++ "scheint" das einen Absturz zu geben.
klar kann man eine "workaround" machen, aber wenn es ein
BUG ist muss ich davon ein sample machen und es Alaska
schicken.

also kann jemand unter Xbase++ (v1.9.331ff) an einen "related"
Child eine APPEND BLANK machen ?

gruss by OHR
Jimmy

Verfasst: Fr, 28. Jul 2006 21:23
von AUGE_OHR
hi,
AUGE_OHR hat geschrieben: also kann jemand unter Xbase++ (v1.9.331ff) an einen "related"
Child eine APPEND BLANK machen ?
also in dem Demo was ich gerade gemacht habe funktioniert es ..:(
... muss was anderes gewesen sein ...

gruss by OHR
Jimmy

DbRelation()

Verfasst: Mi, 17. Jan 2007 0:23
von AUGE_OHR
hi,

weil es wohl zu diesem Thread passt.

Frage : wie bekomme ich raus "wohin" eine Relation führt ?

Code: Alles auswählen

SET RELATION TO KundNr INTO Kund , ; 
                      TO ArtNr  INTO Art 
 
      ? Alias()                          // Ergebnis: RECH 
      ? DbRelation(1)                // Ergebnis: KundNr 
      ? DbRelation(2)                // Ergebnis: ArtikelNr 
wie am an dem Beispiel sieht bekomme ich zwar den "Ausdruck" der
Relation aber das "INTO ..." fehlt mir nun ???

Zweck : Save/Restore von kompletter WorkSpaceList

Die "Anzahl" der Relationen, für eine FOR/NEXT, hab ich gefunden. Man
kann dazu DbInfo(DBO_RELATIONS) benutzen. Überhaupt scheinen die
DBO_ die wichtigsten Infos für die DBF´s zu haben.

gruss by OHR
Jimmy

Verfasst: Mi, 17. Jan 2007 7:11
von Manfred
Hi Jimmy,

es scheint wohl doch Dbrlist() zu sein, was Du suchst?

Verfasst: Mi, 17. Jan 2007 11:45
von AUGE_OHR
hi,
Manfred hat geschrieben: Kann man eigentlich einzelne Relationen beenden? Ich meine, wenn ich jetzt folgendes habe:
db1 relation in Db2
Db1 relation in Db3
db1 realtion in db4
mit deiner letzten Antwort hast du auch die Lösung für eine eigene Frage
gegeben :

Code: Alles auswählen

...
FUNCTION  ADDRELA()
LOCAL i, iMax := DbInfo(DBO_RELATIONS)
LOCAL RETVAR  := {}
   FOR i = 1 TO iMax
      AADD(RETVAR,{ DBRelation(i),ALIAS(DbRSelect(i)) } )
   NEXT
RETURN RETVAR
...
   FOR ...
         // DBRelation()
         cRela    := aRela[1]

         // DbRSelect()
         cChild   := aRela[2]

         SET RELATION TO &(cRela) INTO &(cChild) ADDITIVE
   NEXT 
somit kann man ge"saved" Relationen wiederherstellen.
Manfred hat geschrieben: Was ist wenn ich nur noch db3 und db4 benötige, wie bekomme ich die
relation in db2 weg? Alles trennen
"trennen" musst du auf jeden Fall, aber wenn du die vorher "save"est
kann du ja einfach vor dem "restore" die Elemente aus dem Array löschen

gruss by OHR
Jimmy

Verfasst: Mi, 17. Jan 2007 11:54
von Manfred
Hi,

ich denke einmal, Du meinst jetzt alles löschen und dann den Rest wieder neu verbinden und somit das Gefühl haben, man hätte nur eine Verbindung, oder so entfernt?

Aber wie schon oben von Till erwähnt, scheint es wohl irgendwann auch offiziell zu gehen.

PS: Mittlerweile bin ich sehr weit weg von den Relationen. Ich finde die händische Verbindung über Seek irgendwie interessanter und flexibler, zumindest wenn ich nicht browse, sondern einfach nur so eine Verbindung brauche. Keinen Streß mehr mit Löschen, oder merken von Relationen usw. Da hätte ich auch eher drauf kommen können.

Re: Relationen aktualisieren

Verfasst: Di, 23. Okt 2018 16:42
von dtmackenzie
Dankeschön Jimmy!

Das war für mich sehr hilfreich.
Ich habe den Fall, dass ich eine Tabelle, die 2 Fensterebenen darüber offen ist, zur Auswahl wieder anzeigen muss.
Eine offene Relation war ein Problem...
Dein Code habe ich leicht modifiziert mit DBCLEARRELATION() benutzt um die aktuelle Relation(en) zeitweilig außer Kraft zu setzen (s. unten).
Eine Frage hätte ich, nur aus Neugier: Wirkt DBSETRELATION() "ADDITIVE" oder nicht?
Hätte ich lieber benutzt statt SET RELATION, aber zumindest in meiner Xbase++-Version gibt es nur "lSelektive", kein "lAdditive" als Parameter.

Code: Alles auswählen

FUNC SaveRelations()
// Save and clear relations for the current work-area
LOCAL i, iMax:=DbInfo(DBO_RELATIONS), aRelations:={}

FOR i = 1 TO iMax
    AADD(aRelations, {ALIAS(DbRSelect(i)), DBRelation(i)})
NEXT

DBCLEARRELATION()

RETURN aRelations


***************
PROC RestoreRelations(aRelations)
// Clear and restore relations for the current work-area
LOCAL i, iMax:=Len(aRelations), cAlias:="", cRelation:=""

DBCLEARRELATION()

FOR i = 1 TO iMax
    cAlias := aRelations[i][1]
    cRelation := aRelations[i][2]
    SET RELATION TO &(cRelation) INTO &(cAlias) ADDITIVE
NEXT

RETURN

Re: Relationen aktualisieren

Verfasst: Di, 23. Okt 2018 17:02
von Manfred
Hi David,
soweit ich weiß, geht (immer noch) nur eine Relation. Etwas dazu addieren klappt nicht. Soll aber auf der Agenda von Alaska stehen. irgendwann mal.
Ich hoffe wir meinen beide das gleiche...

Re: Relationen aktualisieren

Verfasst: Di, 23. Okt 2018 17:53
von AUGE_OHR
dtmackenzie hat geschrieben: Di, 23. Okt 2018 16:42 Eine Frage hätte ich, nur aus Neugier: Wirkt DBSETRELATION() "ADDITIVE" oder nicht?
Hätte ich lieber benutzt statt SET RELATION, aber zumindest in meiner Xbase++-Version gibt es nur "lSelektive", kein "lAdditive" als Parameter.
im Help File steht

Code: Alles auswählen

SET RELATION TO [<cRelation1> | <xRecordID1> INTO <cAlias1> ; 
           [TAG  <cTag1>] ] ; 
         [, [TO] <cRelation2> | <xRecordID2> INTO <cAlias2> ; 
           [TAG  <cTag2>]...] ; 
         [ADDITIVE] [SELECT[IVE]] 
also mal den PPO Code ansehen was er daraus macht.