Relationen aktualisieren

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

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:

Beitrag 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.
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

Beitrag 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
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

evtl. BUG bei Relation / Child APPEND BLANK

Beitrag 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
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:

Beitrag 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.
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

Beitrag 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
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

Beitrag 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
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

DbRelation()

Beitrag 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
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

es scheint wohl doch Dbrlist() zu sein, was Du suchst?
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
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

Beitrag 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
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag 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.
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
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

Re: Relationen aktualisieren

Beitrag 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
Viele Grüße,
David
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Relationen aktualisieren

Beitrag 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...
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
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: Relationen aktualisieren

Beitrag 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.
gruss by OHR
Jimmy
Antworten