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.