Verknüpfung meherer Tabellen

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

Moderator: Moderatoren

Antworten
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

Verknüpfung meherer Tabellen

Beitrag von Manfred »

So, damit Martin nicht traurig ist, weil hier so wenig los ist.

Moin Martin....

jetzt mache ich es einmal andersherum. Bisher habe ich immer gebrütet und nachgedacht über ein Problem, habe mich dann nach langer Zeit dazu entschlossen doch jemanden zu fragen und es ergab dann, dass es eine blöde Frage war, oder das ich das Ergebnis kurz danach selbst gefunden habe.

Jetzt frage ich gleich zu Anfang:

Ich "verbinde" etliche DB miteinander über Relationen, oder Scope, oder wie auch immer und erziele ein Ergebnis, welches ich Browsen möchte. So weit so gut. Jetzt sieht es aber so aus, dass die Tabellen selbst sortiert sind, nur sobald eine Verknüpfung stattfindet leider keine Sortierung mehr vorliegt, weil jede DB einen anderen Schlüssel hat, der nur für die Db selbst gilt.
Beispiel:

Ich habe einen Stamm, der von mir aus Sequentiell durchsucht wird. Dieser Stamm hat eine Verbindung über seine Recno() in eine andere Tabelle, in der steht, welcher weitere Satz zum Stamm paßt. Hier ist es einmal ein Filmstamm, der dann über eine Verknüpfungsdb seinen Titel, oder Darsteller zugeteilt bekommt. Die Liste wird auch richtig angezeigt, aber Titel und darsteller sind natürlich unsortiert. Jeweils einer, Titel oder Darsteller, sollten sortiert angezeigt werden. Ich denke mal, dass ich ohne eine weitere DB in die das Ergebnis jeweils geschrieben wird, oder ein zusätzliches Array, ist da wohl nichts zu machen? Oder gibt es einen Trick, den Index irgendwie dazu zu bewegen, das er den Titel/Darsteller mit einbezieht?
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: 16501
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,
wenn es nicht zu viele Sätze sind, würde ich sie der Einfachheit halber in einem Array zwischenparken und das entsprechend vor der Anzeige sortieren.
Aber das Thema hatten wir doch schon mal? Ich weiß noch, das Tom mit mir geschimpft hatte und sagte, ich sei bescheuert das in Arrays zu machen (waren zwar nicht seine Worte, ...)
Ich suche mal nach dem Thread...

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: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

das Thema hatte wir schon mal, das stimmt. Ich wollte aber wissen, ob es auch einen anderen Weg gibt. Das mit dem Array, oder einer weiteren temporären Datei habe ich bisher genommen. Ich finde aber das es recht umständlich ist, zumal ich beim meinem Browsen die Möglichkeit habe eine variable Feldmaske vorzugeben, was mir jetzt auf den 1.Blick bei der temp Methode nicht so gelingt.

Bei Array oder Tempdatei muß halt vorher selektiert werden und das kann dauern. Ich habe zwar einen Hinweis mit Zähler am Bildschirm, aber trotzdem sieht es recht blöde aus, wenn das PRg bis 1000 oder noch mehr hochzählt und dann anzeigt.

Naja, wenn es aber nicht anders geht. SQL geht ja genauso und da meckert auch keiner.
Zuletzt geändert von Manfred am Do, 29. Jun 2006 8:05, insgesamt 1-mal geändert.
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: 16501
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,
ja - den Thread damals hattest Du auch angeschubst, habe ihn gerade gefunden...
Was meinst Du mit "variable Feldmaske"?

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: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

variable Feldmaske ist etwas unglücklich gewählt als Ausruck.

Ich lege eine Datei ab, in die die Felder mit Überschrift und Breite und Reihenfolge der Anzeige usw. geschrieben steht. So kann ich später einen Maskengenerator bauen, mit dem sich jeder entsprechend die Browsemasken zusammenbauen kann.

PS: Welcher Thread war das nochmal? Ist es das gleiche Thema gewesen?
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: 16501
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,
Bei Relationen sortieren heißt der andere Thread.

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: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Ja stimmt, das war genau das Thema.

Verflixt, das mit den Normalformen ist ja nicht schlecht, aber der Aufwand, der dann danach kommt, der hat es teilweise wieder in sich.
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
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,

wenn du in einem Browse mehrere Tabellen vermischst, dann müssen die doch 1:1 Verbindungen sein oder ? Jede dieser Tabellen hat einen eindeutigen Schlüsselbegriff der zur anderen reicht. Um nun nach einzelnen Spalten zu sortieren, mußt du nur eine Routine haben, die in etwa so vorgeht (und natürlich eine Auswahl z.B. compobox für die aktivierbare Sortierspalte):

1. Sortierbegriff auswählen
2. Browseraktualisierung abschalten (weis nicht ob das bei Xbase++ geht)
3. alle Relationen löschen - besser sowieso als scope, dann also scope löschen
4. Sortierfeld (indexfeld in einer der Dateien) DBF mit DBSEEK positionieren (eventuell + scope ?)
5. Abhängige Dateien über den Schlüsselbegriff scopen
6. Browser complett refreshen lassen
7. über das Ergebnis staunen. ;-)

PS ein SQL Server gibt immer eine Art von Array zurück (ResultSet ...), daher wäre eine Arraybildung und dann ein Browse sicherlich keine 'unanständige' Technik. Das Sortieren der angezeigten Daten wäre auch sicher schneller als das dauernde Suchen in der DBF, allerdings wird dann NUR das gleiche Ergebnis sortiert, während oben das Ergebnis sehr von der DBF Struktur abhängig ist. Was im Einzelfall gewünscht ist, muss man im Einzelfall entscheiden.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

Ich verstehe das Problem nicht ganz, um ehrlich zu sein. Deiner Ausgangsnachricht entnehme ich - so in etwa -, daß Du es zwar schaffst, Tabellen zu verknüpfen, Dir dann aber die Sortierung der verknüpften Tabellen fehlt. Dafür sind kombinierte Indexausdrücke m.E. die richtige Lösung, nötigenfalls mehrere:

USE Darsteller
INDEX ON Str(id,8,0)+Upper(Name) to Darsteller1
INDEX ON Str(id,8,0)+Upper(Filmtitel) to Darsteller2

usw.

Scoping funktioniert trotzdem, und die Untermenge ist sortiert. Nötigenfalls den führenden Index wechseln. Oder habe ich die Frage so falsch verstanden?
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Tom,
die Antwort lag mir auch erst auf der Zunge - bringt aber leider nichts!
Schließlich hat ja jeder Darsteller eine andere ID - und Dein Index ist nach ID aufsteigend sortiert und bei gleicher ID (was nicht sein kann!) nach Namen.
Sobald ein neuer Darsteller eingegeben wird, bekommt er die höchste ID - auch wenn er im Alphabet ganz vorne käme...
Das gleiche gilt latürnich analog für die Titel-Datenbank...

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: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom

das mit dem Index, das hatte ich irgendwie im Kopf, aber kriege es nicht hin, oder es klappt nicht in meiner Konfiguration.

also hier nochmal ganz kurz:

Es gibt eine Titeldatei und eine Interpretendatei. Beide haben jeweils eine eigene ID.
Die Verknüpfung der beiden Dateien zu ihren "Stammdaten" (genannt Stamm) erledigt eine 1:n Datei. Beispiel: TitelStamm, DarstStamm in den beiden Dateien steht jeweils einmal unter einem Index die ID der Titel/Darstellerdatei und des jeweiligen Stammsatzes.

Finde ich jetzt einen Titel, dann wird über die TitelStamm die Verbindung zum jeweiligen Stammsatz geknüpft und über den so gefunden Stammsatz wird wiederum über die DarstStamm eine Verbindung zum Interpreten gefunden.

Die Titeldatei ist ja sortiert nach Titel. Die gefundenen Stammsätze, sind sortiert nach ID der Stammsatzdatei.

titel->id in Titelstamm->idtitel
TitelStamm->idstamm in stamm->id

Wenn ich jetzt über den gefundenen Stamm die Interpreten anzeigen lasse, dann geschieht das über die DarstStamm auf die DarstDatei

stamm->id in DarstStamm->idstamm
DarstStamm->iddarst in Darst->id

Jetzt liegen die Darsteller aber nicht namesortiert, sondern IDsortiert vor. Lasse ich jetzt alle anzeigen, die zu dem Stamm über die DarstStamm gefunden wurden, dann sind die kreuz und quer durcheinander.

Das Ergebnis zeigt dann die Felder der einzelnen DB in einer Zeile an.

vereinfacht dargestellt

Do while darststamm->idstamm = stamm->id
? titel + darst + wasweisich
darststamm->(DBSKIP())
enddo

Da soll es jetzt klappen, dass ich darauf einen Index setzen kann, der 2 DB anpackt?, Oder wie habe ich das zu verstehen?

Ich hoffe ich kriege das hier verständlich rübergebracht, es ist immer so schwer anderen seine Ideen zu vermitteln.
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: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Egal,

die Frage war doppelt gemoppelt. Es bleibt dabei:

1) Anfrage starten,
2) Ergbnis in "ZwischenSpeicher" schieben
3) Ergebnis auswerten.
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: stamm->id in DarstStamm->idstamm
DarstStamm->iddarst in Darst->id

Jetzt liegen die Darsteller aber nicht namesortiert, sondern IDsortiert vor. Lasse ich jetzt alle anzeigen, die zu dem Stamm über die DarstStamm gefunden wurden, dann sind die kreuz und quer durcheinander.
ok, aber was spricht dagegen nachdem du die ID gefunden hast
auf einen anderen Index umzuschalten und die ID als Bedingung zu nehmen ?

Code: Alles auswählen

cSUCH := "blabla"
SEEK(cSUCH)
IF FOUND()
    bIDblock := Darst->id
    Set Index to Interpretsortierung
    obrowse  := TBROWSEDB(x1,y1,x2,y2  )
    obrowse:SKIPBLOCK := {|x| GONEXT (X, {|| Darst->id = bIDblock
} ) }
    obrowse:GOTOPBLOCK:= {|| GOTOP  (   {|| Darst->id = bIDblock } ) }
    obrowse:GOBOTTOMBLOCK := {||  GOBOTTOM(   {|| Darst->id = bIDblock} ) }

...
FUNCTION gonext(ntoskip, bwhilecond )
LOCAL nskipped := 0, ndirection
   ndirection := IIF(ntoskip > 0, 1, -1)
   DO WHILE nskipped != ntoskip .AND. EVAL(bwhilecond) .AND. ;
         !EOF() .AND. !BOF()
      SKIP ndirection
      nskipped += ndirection
   ENDDO
   IF EOF()
      SKIP -1
      nskipped--
   ELSEIF BOF()
      GOTO RECNO()
      nskipped++
   ELSEIF !EVAL(bwhilecond)
      SKIP -ndirection
      nskipped += -ndirection
   ENDIF
   RETURN nskipped
wenn du die Bedingung nicht brauchst übergib nur .T.

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 »

Das geht doch gar nicht!?

Ich habe zu dem Zeitpunkt den Titel, der mir sagt welcher Stamm. Der Stamm, der mir sagt welcher Interpret und das bei jedem Stammsatz, der zum Titel gehört, neu. Es kann also sein, dass es 1 Titel gibt, aber unterschiedliche Interpreten. Nimm mal das Beispiel Greatest Hits, da gibt es ohne Ende verschiedene Interpreten zu.

-------------------------------
Hast Du einen Avatar eingebunden? Es erscheint beim Anzeigen immer kurz der Fleck, auf dem er erscheinen sollte, dann ist aber der Fleck wieder weg. So als ob was gesucht, aber nicht gefunden würde.
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: Das geht doch gar nicht!?
Ich habe zu dem Zeitpunkt den Titel, der mir sagt welcher Stamm. Der Stamm, der mir sagt welcher Interpret und das bei jedem Stammsatz, der zum Titel gehört, neu. Es kann also sein, dass es 1 Titel gibt, aber unterschiedliche Interpreten. Nimm mal das Beispiel Greatest Hits, da gibt es ohne Ende verschiedene Interpreten zu.
hm ... "Greatest Hits" ist aber eigendlich kein Titel sondern das Album ?
ist Stamm = Album bei dir ? wieso kannst du beim Titel nicht direkt auf
den Interpreten sondern musst erst durch den "Stamm" ?

du wolltest doch jetzt den Interpret sortiert haben.
... die Frage hierzu wäre : zeigst du alle in einem Browse ?

Titel AA1 -> Stamm AA2 ->Interpret AA3
Titel AA1 -> Stamm AB2 ->Interpret AB3

ich dachte an 2x Browser (die optisch aussehen wie einer)

1.) Titel AA1 -> Stamm AA2 in Relation (eindeutig)
Titel AA1 -> Stamm AB2

2.) Stamm AA2 ->Interpret AA3 mit Bedingung (mehrere)
Stamm AB2 ->Interpret AB3

was mich allerdings etwas verwirrt : wieso musst du alles aufteilen
(Titel, Stamm, Interpret). Du brauchst doch pro Relation mindest 1 Feld
für die Relation die dann "doppelt" ist ? ist es nicht "einfacher" alles in
einer DBF zu haben ?

-------------------------------
Hast Du einen Avatar eingebunden? Es erscheint beim Anzeigen immer kurz der Fleck, auf dem er erscheinen sollte, dann ist aber der Fleck wieder weg. So als ob was gesucht, aber nicht gefunden würde.
ja, hab die Msg von Hubert gelesen. Mein Avatar liegt nicht auf einem Webserver ...

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,

jetzt muß ich erstmal sortieren:

Also, Greatest Hits ist ein Album, genau, das kann natürlich x Interpreten zugeordnet werden.
Im Stamm steht, wie teuer, wann erschienen, sprich die Daten, die zum jeweiligen Album gehören. Dazu wird dann ein Interpret zugeordnet.

Hm, warum ordne ich den Interpreten, bzw den Titel dem Stamm zu?
Eigentlich läuft es ganu so herum:

Ich suche den EAN-13, der ist einem Stamm zugeordnet und dann sehe ich vom Stamm aus die restlichen Daten:

1) System
2) genre
3) Titel
4) Interpret
usw.
usw.

Irgendwo/wer muß der "Vater" sein.

Im Browse zeige ich das Ergebnis mit den entsprechenden Verknüpfungen, so wie Du unter 1) schreibst.

2x Browser, fände ich auch schick, aber das kann ich noch nicht programmieren. (Leider :-( )

Alles in einer DBF? Das entspricht nicht der Normalform. Hatte ich früher mal. Zum Stamm kommt nämlich der eigentliche Träger nochmal hinzu. Titel, Internpret, Stamm besagen nur, dass es diesen Titel gibt, nicht das er vorhanden ist. Erst wenn dem Stamm ein Objekt zugeordnet wurde, ist garantiert, dass die CD (nenne wir sie mal so) auch vorhanden ist mechanisch. SQL DB arbeiten doch auch alle über Schlüssel. Genau so habe ich es auch gelöst. Nichts doppelt. Wird irgendwo etwas verbundenes geändert, ist alles automatisch angepaßt. Keine Redundanzen.
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

Ich wiederhole mich, glaube ich, aber Du solltest Dir wirklich mal das eXpress++ von Roger Donnay anschauen. Das ist ein Tool, mit dem man wirklich schnell zu GUI-Ergebnissen kommt, also z.B. Browser baut, für deren Gestaltung nur vier, fünf Zeilen nötig sind, und seine Beispielbibliothek zeigt u.a., wie man voneinander abhängige Browser ziemlich easy hinkriegt. Es gibt eine Demo, und einen kostenlosen 30-Tage-Trial:

http://www.donnay-software.com

Davon abgesehen, jetzt mal zusammengefaßt:

Du hast Alben, jedes Album hat eine ID, zum Beispiel die ASIN.
Du hast Titel, jeder Titel hat eine ID, die Du vergibst.
Du hast Interpreten, jeder Interpret hat eine ID, die Du ebenfalls vergibst.

Ein Album hat also eine Untermenge von Titeln. Jeder Titel kann auf mehreren Alben sein. Jeden Titel kann es von mehreren Interpreten geben. Jeder Interpret hat mehrere Titel und kann auf verschiedenen Alben vertreten sein. Soweit richtig?

Jetzt mal ins Blaue gedacht. Ein Album hat einen Namen, ein Erscheinungsjahr, eine Plattenfirma, einen Verlag usw. Das wäre ein Kopfeintrag - nebst ID - in einer Alben-Tabelle. Dann müßte es eine weitere Tabelle geben, die Titel mit Alben verknüpft, also die ID des Albums und des Titels enthält. Diese Verknüpfungstabelle könnte zusätzlich die Information enthalten, an welcher Position auf diesem Album sich der Titel befindet. Zusätzlich sollte sie die ID des Interpreten enthalten.
Die Titeldatei enthält nur den Titel selbst, zum Beispiel "Piano Man". In einer weiteren Verknüpfungsdatei sind Titel und Interpreten miteinander verbunden, also ID des Titels und ID des Interpreten. Damit haben wir eine Version des Titels. Hier kann es dann weitere Informationen wie Genre, Produktionsjahr usw. geben.
Schließlich die Interpreten. Alles über sie steht in einer Tabelle. Über ihre ID sind sie mit den Titeln und zusätzlich mit den Alben verknüpft. Wir haben also insgesamt diese fünf Tabellen:

1. Albenköpfe
2. Verknüpfung Alben <-> Titel (1:n) <-> Interpreten (1:1/n:1)
3. Titel
4. Verknüpfung Titel <-> Interpreten (n:m)
5. Interpreten
(Verknüfungsdatei siehe Alben)

Jetzt suchst Du zum Beispiel nach einem Titel. Über 2. erhälst Du sofort alle Alben (bei entsprechendem Index auch alphabetisch), aber auch alle Interpreten. Undsoweiter. Datenmäßig voneinander abhängige Browses scheinen mir hier die beste Lösung zu sein (man nennt das "One-To-Many").

Ich verstehe immer noch nicht, was eigentlich Dein Problem ist. <kopfkratz>
Herzlich,
Tom
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 Tom,

mein Problem ist, dass ich immer der Meinung bin eine einfache leichte Frage gestellt zu haben und später feststelle, was ich angerichtet habe. :lol:

Titel pro Album sind noch nicht in der Mache, werden wohl auch nicht benötigt werden.

Es ist wie verhext. Ich grübel und grübel über eine Lösung und finde sie nicht. nach einer Zeit X frage ich dann endlich und plötzlich sehe ich, wo ich den Bockmist gebaut, oder falsch gedacht habe. Dann ist die Lawine aber schon losgetreten.

Das habe ich doch alles nicht gewollt. :cry:

Sorry, aber ihr alle seid immer so eifrig bei der Sache, das es mir nachher schon wieder fast peinlich ist so blöde Fragen gestellt zu haben.

Ich habe mich in diesem Fall hier erstmal entschieden, eine TempDatei aufzumachen, in die das Ergebnis geschrieben und dann angezeigt wird.

Ich glaube das mit dem express++ muß ich mir wirklich einmal angucken.

PS: Außerdem wird jetzt gefeiert. Ich sehe gerade, ich habe 800....
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Huhu, Manfred.
Das habe ich doch alles nicht gewollt.
Ich find's spannend. Man macht sich - zumindest geht es mir so - bei diesen Fragen viele Gedanken über den eigenen Code, über die Spaghettiprogrammierung, die hier und da noch steckt, über die Datennormalisierungen, die man auch in der anderen Ecke da noch hätte vornehmen sollen usw. Ist ein gemeinsamer Lernprozeß. Mir macht das Spaß. :D
Herzlich,
Tom
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 Tom,

ich sehe es genauso. Was ich hier in diesem Forum, durch dieses Forum in den letzten Monaten dazugelernt habe.....

...das habe ich in den letzten 10 Jahren nicht gelernt.

Auch durch meine etwas merkwüdrigen Fragen teilweise. Wenn ich aber wiederum die Klingelglöckchen vor den einzelnen Beiträgen sehe, dann muß ich zu meiner Freude feststellen, das doch etliche meiner Beiträge (Fragen sind es wohl mehr) von höherem Interesse waren/sind, sodass ich wieder aufatme und sage: So schlimm waren die Fragen dann doch wieder nicht.
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 »

moin,
Manfred hat geschrieben: 2x Browser, fände ich auch schick, aber das kann ich noch nicht programmieren. (Leider :-( )
mal eine andere Idee / Frage und auch als Einstieg in den 2st Browser :

nutzt du den oBrowse:stable (TBrowse) bzw. oBrowse:stableblock
(Xbpbrowse) ? Diesen könnte man z.b. dazu nutzen um ein Achoice,
XbpListbox oder den 2st Browse mit den Interpreten aufzubauen.

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,

nein benutze ich nicht. Ich habe mir das Teil irgendwie zusammengebaut, bis es lief. Wenn ich ehrlich bin weiß ich noch nicht so recht wie es läuft. (xbpbrowse, xbpquickbrowse) :(

Also auch hier noch einiges an Nachholbedarf.
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:nein benutze ich nicht. Ich habe mir das Teil irgendwie zusammengebaut, bis es lief. Wenn ich ehrlich bin weiß ich noch nicht so recht wie es läuft. (xbpbrowse, xbpquickbrowse) :(
ich denke das es für dein Problem wohl die "einfachste" Lösung wäre
die Interpreten "on the fly" zu sortieren.

also baue neben deinen Browser als "dritte Spalte" eine leer Xbplistbox.

wenn du nun in deinem Browse navigierst wird der Zustand "stable"
erreicht und oBrowse:stableblock ausgeführt.

Als Codeblock gibst du nun deine Funktion an die das Array erstellt und
damit die XbpListbox "füllt". Wenn du zum Interpreten auch noch die
RECNO() in das Array nimmst wäre sogar eine "rückwärtz suche"
möglich da du durch einen doppel click in der XbpListbox eine neue
Suche auslösen könntest.

Ich kam vorhin auf die Idee als ich etwas ähnliches machen musste und
an dein Problem dachte. Nun konnte ich mir all die Varianten sparen die
wir hier schon diskutiert und verworfen hatten ... also Zeit "gespart" :)

gruss by OHR
Jimmy
Antworten