OrdCreate nach Feld über Relation

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

Moderator: Moderatoren

rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

OrdCreate nach Feld über Relation

Beitrag von rschi »

Hallo zusammen

Gibt es eine Möglichkeit, eine Tabelle nach einem Feld aus einer andere Tabelle (via Relation) zu sortieren?

Zum Beispiel habe ich eine Tabelle AUFT mit Aufträgen. Darin habe ich unter anderem ein Feld KUNDE, mit der Kunden-Nummer.
Dann habe ich eine Tabelle KUNDEN, mit der Kunden-Nummer, und dem Namen.

Nun möchte ich die Tabelle AUFT nach dem Namen der Kunden sortieren.

Ist das möglich?
Hat mir jemand eine Idee?

Gruss
Robin
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: OrdCreate nach Feld über Relation

Beitrag von Dieter »

Hallo Robin,

du brauchst in der Tabelle AUFT ein zusätzliches Feld in der die Sortierreihenfolge gespeichert werden kann, so dass ein zusätzlicher Index erzeugt werden kann. Da der Kundenname alleine nicht eineindeutig ist, könnte in dem Feld UPPER(kunden->namen)+STR(kunden->nr) gespeichert werden.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von Rolf Ramacher »

Hi Robin,

m.E. kann es nur geben beide Tabellen in einer neuen Zusammenzuführen. mit dem Namen und auf diesen den Index zu setzen.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von Martin Altmann »

:?:
Warum kann man nicht mit Set Relation (bzw. DbSetRelation() ) arbeiten und dann den Index entsprechend setzen?

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

Re: OrdCreate nach Feld über Relation

Beitrag von Manfred »

Sicher,

den Rel Schlüssel nehmen und dann innerhalb dessen nach dem Kriterium untersortieren. Habe ich auch so gemacht.

key + Upper(name) oder so
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!!
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

Besten Dank für eure Antworten.

Manfred, kannst du mir sagen, wie das in meinem konkreten Beispiel aussähe?
Ich hab's mal versucht umzusetzen, es funktioniert aber nicht wirklich. :-(

Beispiel:

Kunde:
Kd-Nr | Name

Auftrag:
Auft-Nr | Kd-Nr

--> Relation über Kd-Nr

Sortierung von Auftrag nach Kunden-Name

Freundliche Grüsse
Robin
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: OrdCreate nach Feld über Relation

Beitrag von Manfred »

Hi Robin,

jetzt verstehe ich was Du meinst. Das Problem habe ich bei mir auch. Du hast also z.B. eine Auftragsdatei, in die Du nur die Kundennummer und die Artikelnummer usw. schreibst. Danach verknüpfst Du dann die Auftragsdatei über die Kundennummer mit der Kundendatei!?
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: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von Martin Altmann »

Hmm,
Relation setzen und dann
Index on Kunde->NAME + strzero( AUFTRAG->AUFT-NR, 16 )
so in der Art - würde ich denken.

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.
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

@Manfred: Genau so war mein Beispiel gemeint.

@Martin: Leider kriege ich es so nicht hin.

Mein Beispiel, welches ich genannt habe, brachte ich, um meine Problembeschreibung zu vereinfachen.

Das effektive Beispiel sieht folgendermassen aus:

AUFT:
NR | TERMIN | ...

PROPLAN: (mehrere Records pro Auftrag)
AUFTNR | ...

Relation: Von PROPLAN->AUFTNR auf AUFT(->NR)

Nun möchte ich gerne die Tabelle PROPLAN nach dem Auftrag-Termin sortieren.

Die Relation ist (meiner Meinung nach) zu dem Zeitpunkt, zu dem ich sortieren möchte bereits gesetzt.

Wenn ich nun sowas wie
INDEX ON DTOS(AUFT->TERMIN) + PROPLAN->AUFTNR TO cKeyFile
mache, bekomme ich einen Fehler. :-(

Fehlermeldung, die ich erhalte:
Fehler BASE/0
Beschreibung : D
Operation : DbCreateIndex

Hat jemand eine Idee, was ich falsch mache?

Gruss
Robin
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von Martin Altmann »

Hallo Robin,
ist PROPLAN->AUFTNR denn ein Feld vom Typ "C"?
Wenn nicht, musst Du Deinen Index anders aufbauen:

Code: Alles auswählen

INDEX ON DTOS(AUFT->TERMIN) + strzero( PROPLAN->AUFTNR, 16 ) TO cKeyFile
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: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: OrdCreate nach Feld über Relation

Beitrag von Manfred »

Moment,

steht denn in der Auftragsdatei zu jedem Satz nicht das Datum drin? Sollte doch, oder.

Dann mache doch einfach Index on (Auftragsnummer + Dtos(Auftragdsdatum)). Entsprechend umschalten und es müßte sortiert sein.

Oder verstehe ich das jetzt nicht richtig?
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!!
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

@Martin:
PROPLAN->AUFTNR ist alphanummerisch, also vom Typ "C", ja.
Somit muss ich ja nur den Termin von Datum in einen String wandeln.

@Manfred:
Doch, in der AUFT-Datei steht für jeden Auftrag der Termin.
Aber ich möchte nicht nach der Nummer sortieren, sondern lediglich (oder in erster Linie) nach dem Termin.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: OrdCreate nach Feld über Relation

Beitrag von Manfred »

Sorry,

aber ich habe mal wieder nicht richtig gelesen.

Bevor ich jetzt noch mehr Blödsinn erzähle, möchtest Du die Aufträge aller Kunden anzeigen und dann nach Datum sortiert, oder nur jeweils eines einzigen, die aber nach Datum sortiert?

Wenn es alle sind, dann ziehe ich mich ab hier zurück, da habe ich auch keine Lösung auf der Hand im Moment. Aber wenn es jeweils nur ein Kunde ist, dann müßte doch schon durch die Reihenfolge der Auftragsnummernvergabe das Datum chronologisch sein.
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!!
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

Da hast du meine beiden Beispiele gemischt. Aber das ist mein Fehler, da ich zuerst ein anderes Beispiel gebracht habe und somit ein Durcheinander versursacht habe. Sorry!

In meinem konkreten Beispiel habe ich eine Auftragsdatei mit (unter anderem) Auftragsnummer und Termin des Auftrags.
Zudem eine Datei mit Operationsschritten (verschiedene Arbeitsschritte) - mit (unter anderem) einem Feld Auftragsnummer.

Nun möchte ich die Arbeitsschritte nach dem Termin sortieren. Das heisst, ich möchte wissen, für welchen Arbeitsschritt der Termin an nächsten ist.
Das Problem ist, dass der Termin nur in der Auftragsdatei steht und nicht auf jedem Arbeitsschritt.

Die Auftragsnummern sind gemäss dem Erstelldatum chronoligisch, aber die Aufträge dauern nicht immer gleich lang, deshalb besteht kein Zusammenhang der Reihenfolge von Auftragsnummer und Termin.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von UliTs »

Hallo Robin,
rschi hat geschrieben: Das effektive Beispiel sieht folgendermassen aus:

AUFT:
NR | TERMIN | ...

PROPLAN: (mehrere Records pro Auftrag)
AUFTNR | ...

Relation: Von PROPLAN->AUFTNR auf AUFT(->NR)
INDEX ON DTOS(AUFT->TERMIN) + PROPLAN->AUFTNR TO cKeyFile
mache, bekomme ich einen Fehler. :-(
ich selbst arbeite mit solchen Indizes erfolgreich (bei DBFNTX).
So könnte der Code aussehen:

Code: Alles auswählen

use AUFT
Index on Nr to AUFT
use ProPlan
Index on AuftNr to ProPlan
set relation to AuftNr into Auft
Index on DtoS(Auft->Termin)+ProPlan->AuftNr TO ProPlanTMP
set index to ProPlan,ProPlanTmp
set order to 2
Die Indexdatei ProPlanTMP muß immer neu erzeugt werden, wenn sich der Wert von Auft->Termin in Datensätzen ändert, die in Relation zu ProPlan stehen!
-
Probier mal aus, ob Du damit eine lauffähige Demo hinbekommst. Wenn die Demo nicht läuft, kannst Du mir mal selbige zusammen mit den beiden Tabellen zuschicken.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von brandelh »

Hi,

wäre es nicht sinnvoller die 8 Byte je Datensatz zu opfern und den Termin auch in der Datei PROPLAN vorzuhalten ?
Schneller wäre es auf alle Fälle (SCOPE ...)
Gruß
Hubert
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

Hallo Uli

Besten Dank für deinen Hinweis!
Ich werde es mal so ausprobieren und mich wieder melden. Leider habe ich zur Zeit gerade einen dringenderen Fall.

@Hubert: So habe ich es mal gelöst. Aber wenn Ulis Lösungsvorschlag klappe würde, wäre das auch für andere Fälle eine universelle Lösung und wir wären bei der Sortierung sehr flexibel - wenn auch mit Performance-Einbussen für diese Sortierungen.

Gruss
Robin

PS: An dieser Stelle auch mal ein grosser Dank an alle, die mir zu diesem Fall Tipps und Hinweise gaben.
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

Hallo Uli

Leider bin ich letzte Woche nicht mehr dazu gekommen, diesem Problem weiter nachzugehen.

Nun habe ich deine Zeilen versuche, aber leider erhalte ich den selben Fehler, den ich auch schon hatte:
Fehler BASE/0
Beschreibung : D
Operation : DbCreateIndex
Thread ID : 1
Sagt dir dieser Fehler was?
Der Fehler kommt auf der Zeile

Code: Alles auswählen

Index on DtoS(Auft->Termin)+ProPlan->AuftNr TO ProPlanTMP
Gruss
Robin
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von UliTs »

Hallo Robin,
Probier mal aus, ob Du damit eine lauffähige Demo hinbekommst. Wenn die Demo nicht läuft, kannst Du mir mal selbige zusammen mit den beiden Tabellen zuschicken.

Uli
Kannst Du mir Deine DEMO mal zuschicken (PN) (mit den beiden Tabellen) oder hier veröffentlichen? Welche Version hast du von xBase++?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: OrdCreate nach Feld über Relation

Beitrag von Rolf »

ist die Datenbank den exclusiv(e) geöffnet?
Siehe auch noch mal in der Hilfe bei "INDEX" unter "Hinweise:",

Grüße Rolf
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von UliTs »

Hier meine Demo,

welche mit Robins Daten funktioniert:

Code: Alles auswählen

PROCEDURE Main
  select 1
  use AUFTRAG alias Auftrag
  Index on Nr to Auftrag
  select 2
  use ProPlan alias ProPlan
  set relation to AuftNr into Auftrag
  Index on DtoS(Auftrag->Termin)+ProPlan->AuftNr TO ProPlanTMP
  DbEdit( 1,1,24,79,{"Auftrag->Termin","AuftNr","Auftrag->Nr","ArtNr" } )
  Alert( "Fertig!" )
RETURN

PROCEDURE dbeSys()
   IF ! DbeLoad( "FOXDBE", .T.)
      Alert( "Database-Engine FOXDBE nicht geladen" , {"OK"} )
   ENDIF
   IF ! DbeLoad( "CDXDBE",.T.)
      Alert( "Database-Engine CDXDBE nicht geladen" , {"OK"} )
   ENDIF
   IF ! DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
      Alert( "FOXCDX Database-Engine;konnte nicht erzeugt werden" , {"OK"} )
   ENDIF
   DbeSetDefault( "FOXCDX" )
RETURN
Rolf, es reicht, ein Filelocking durchzuführen.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

Hallo Uli

Besten Dank für dein Demo-Programm.
Dieses funktioniert wunderbar. Aber wenn ich es in meine Applikation einbinden möchte, habe ich immer noch den selben Fehler. :(

Dein Code 1:1 einzubauen funktioniert irgendwie nicht. Da erhalte ich den selben Fehler.

Da ich die Tabellen eh schon geöffnet habe und auch Indexe erstellt habe, versuchte ich es folgendermassen:

Code: Alles auswählen

// Index auf "UPPER(NR)" setzen
AUFT->( DBSETORDER(1) )
// Index auf "AUFTNR+STR(OPORDNR,3)+STR(OPINDEX,3)+STR(JAHR,4)+STR(KW,2)" setzen
PROPLAN->( DBSETORDER(3) )

set relation to AuftNr into Auft

Index on DtoS(Auft->Termin)+ProPlan->AuftNr TO p_scratch + "SORT"+ORDBAGEXT()
...
Auf der letzten Zeile habe ich wieder den Fehler:
Fehler BASE
Beschreibung : D
Operation : DbCreateIndex
Ist denn das Problem, dass ich die Tabellen bereits geöffnet habe?
Kann ich das irgendwie umgehen?

Gruss
Robin
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von UliTs »

Hallo Robin,

binde am besten zunächst den Beispielcode zu Beginn des Programms in der Prozedur Main() ein.
Funktioniert dann das Beispiel?
Wenn nicht, muß es etwas geben, was vor der Prozedur Main() ausgeführt, welches zu den Problemen führt (z.B. in der Prozedur dbeSys()?).
Oder setzt Du vielleicht eine andere Datenbank (z.B. ADS) ein? Aber das hättest Du ja sicher schon längst erwähnt.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Re: OrdCreate nach Feld über Relation

Beitrag von rschi »

Hallo Uli

Besten Dank für deine Antwort.

Ich setze eine DBF-Datenbank mit einem ADS ein.
Wieso meinst du, dass ich das sicher schon längst erwähnt hätte?
Funktioniert es damit nicht?

Robin
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OrdCreate nach Feld über Relation

Beitrag von UliTs »

Hallo Robin,

aaaahhhhh! :blob8:
Natürlich kann es mit dem ADS nicht funktionieren! Aber damit geht es mit Hilfe von SQL-Statements ja viel leichter!
Greifst Du über ein Data Dictionary auf Deine Datenbank zu? Setzt Du ADT, DBF-CDX oder DBF-NTX Tabellen ein?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten