Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Inhalt von Spalten einer Tabelle sortieren - geht das?

Begonnen von Torsten., Dezember 20, 2014, 15:19:04

⏪ vorheriges - nächstes ⏩

Torsten.

Hallo zusammen,
im Anhang habe ich ein Demo angehängt.
Ist es eigentlich möglich eine Tabelle nach ihren Inhalten automatisch zu sortieren?
Die Tabelle 1... ist die Ausgangssituation, die 2... ist das von mir händisch erstellte Ergebnis.

Dabei kommte es auf die ersten 4 Spalten (desc_1 bis desc_4) an:
- in desc_1 die Info ob vorn, hinten, rechts...
- in desc_2 die Info Bauart
- in desc_3 die Info Typ
- in desc_4 die Info System

Wenn bspw. wie bei art_nr 20053 keine Typ-Info vorhanden ist, sollte dieses Feld mit dem Feldinhalt der nächsten, rechten Spalte (hier: Befestigungsart:...) gefüllt werden.
Wenn allerdings System-Info vorhanden wäre, dann sollte zunächst der System-Inhalt ins Feld eingefügt werden. Also Füllung der Felder nach Reihenfolge der obigen Auflistung, erst dann mit den rechten Feldinhalten.

Noch kurz zur Info:

  • - die angehängte Tabelle hat im originalen weitere Spalten, die ich aber der Übersicht wegen in dieser Demo rausgenommen habe
    - die orig. Tabelle hat keine ID-Spalte
    - Tabelle enthält 50tsd Datensätze - daher händisch nicht mehr machbar
Ich hoffe ich konnte es so erklären, dass Ihr es verstanden habt.

Ich würde mich freuen wenn Ihr mir helfen könntet.

Gruß Torsten.

MzKlMu

Hallo,
es gibt noch einige hier, die kein Access2010 haben. Konvertiere die DB mal nach Access2003 (MDB), da gibt es mehr Helfer.
Gruß Klaus

Torsten.


daolix


MzKlMu

#4
Hallo,
ich habe nicht ganz verstanden, was Du jetzt erreichen willst, trotz Deines Beispiels. Wenn das Beispiel weniger Datensätze und Spalten hätte, wäre es sich leichter zu verstehen.
Aber eines vorweg, dass das Datenmodell für eine Datenbank völlig ungeeignet ist, ist Dir bewusst?
Das lässt sich alleine schon aus den vielen leeren Feldern und den vielen sich  wiederholenden Einträgen ableiten. In einer Datenbank gibt es im Regelfall keine redundante Daten und auch keine so viele leere Felder.
Hier liegen mehrere n:m Beziehungen vor, die mit mehreren Tabellen aufzulösen wären. Hier wirst Du mit Access nicht viel Freude haben.
Auch so etwas:
Zitatdie orig. Tabelle hat keine ID-Spalte
stimmt mich höchst bedenklich. Eine Datenbanktabelle ohne Primärschlüssel darf es eigentlich nicht geben.
Kannst Du das Datenmodell noch ändern ?



Gruß Klaus

Torsten.

Ich stelle gleich weitere Informationen zur Verfügung.
Stelle sie jetzt zusammen.
Gruß Torsten

Torsten.

Im Anhang die erweiterte DB.
Ich versuche weiter zu erklären:
Alle 4 Tabellen sind vom Inhalt her ein Auzug der kompletten Datensätze, die Spalten sind 1 zu 1 dargestellt.
Ich bekomme die Daten als CSV und importiere sie in Access und erhalte die Tbl "rohdaten".
Über Module/Prozeduren die ich mit Eurer Hilfe erstellt habe, erstelle ich die Tbl "vorsortiert".
Daraus habe ich zur Demo auszugsweise die Tbl "1_Ausgangstabelle" erstellt.

Das Ergebnis der jetzigen Tbl "vorsortiert" in angepasster Form findet Ihr im Online Shop unter http://tinyurl.com/mf46lgz. Klickt dann bitte auf Stoßdämpfer und der 1. Artikel 20114 ist ein Beispiel. In der Auflistung seht Ihr dann bspw. die einzelnen desc_*-Felder. Wenn Ihr abweichende Feldinhalte seht, bspw. StoßdämpferEinbauseite: Hinterachse und online als hinten, dann habe ich das per Replace-Befehl im Vorfeld in Access geändert (nur zur Info, ist nicht wichtig für die Ausgangsfrage).
Das zum ersehen der Zusammenhänge.

Wenn Ihr jetzt in der Tbl "vorsoriert" in der Spalte "beschrbg" schaut, seht Ihr anhand des Artikels (art_nr) 20012 sehr gut, dass die Information "vorne" erst an 4. Stelle erfolgt. Das ist das Problem.
Im Shop http://tinyurl.com/lghj3qx wird die Info "vorne" nicht zuerst angezeigt sondern erst an 2. Stelle. Zuvor: Typ Gasdruck.

Ich hoffe ich konnte verständlich machen warum ich die Feldinhalte nach dem Prinzip:

- in desc_1 die Info ob vorn, hinten, rechts...
- in desc_2 die Info Bauart
- in desc_3 die Info Typ
- in desc_4 die Info System

abändern möchte.

Habt Ihr eine Idee, kann man das überhaupt maschinell lösen?

Gruß Torsten.

DF6GL

#7
Hallo,

ich denke mal, Deine Vorgehensweise führt nicht zum Ziel...

M.E sollte der Inhalt aus Feld  beschreibg bezogen auf eine  art_nr so aufgedröselt werden, dass sich eine Tabelle mit (ähnlich) folgendem Aufbau ergibt:



tblBeschreibungen
BID (PK,Autowert)
B_art_nr  (FK, Text)    falls das nicht besser eine Zahl,Long sein könnte.
B_Item (Text)
B_Wert  (Text)

BID  B_art_nr   B_Item                                    B_Wert
1     20053       StoßdämpferEinbauseite            Hinterachse
2     20053       Stoßdämpferart                        Gasdruck
3     20053       Stoßdämpfer-Befestigungsart     oben Auge
4     20053       Stoßdämpfer-Befestigungsart     unten Auge nur paarweise austauschen


wobei ich die Struktur dieses "Beschreibungs"-Strings nicht so recht interpretieren kann.


Die Tabelle wird dann mit der Originaltabelle über das Feld art_Nr in Beziehung gesetzt.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Torsten.

Hallo Franz,
das verstehe ich jetzt erstmal nicht.
Ich werden heute Nachmittag versuchen es zu verstehen und komme dann zurück.

Gruß Torsten.

daolix

Hallo

Die Tabelle Vorsortiert unterscheidet sich jetzt aber von der ersten demodatei die du hier hochgeladen hattest. Was ist dein Ziel? die Zerlegung des Feldes "beschreibg" in einzelne Felder (wie in 1_Ausgangstabelle/2_Ergebnis)  oder willst du nur das Feld "beschreibg" in Tabelle "Vorsortiert" entsprechend sortieren?

Torsten.

Hallo daolix,
ich schrieb zuvor:
ZitatDie Tabelle Vorsortiert unterscheidet sich jetzt aber von der ersten demodatei die du hier hochgeladen hattest.
Zitat...Über Module/Prozeduren die ich mit Eurer Hilfe erstellt habe, erstelle ich die Tbl "vorsortiert".
Daraus habe ich zur Demo auszugsweise die Tbl "1_Ausgangstabelle" erstellt.
In sofern das jetzt die gesamten Spalten angezeigt werden, die Datensätze allerdings nicht 1 zu 1 sind.

Ich möchte in Tbl "vorsortiert" die Spalte "beschrbg" sortiert*** zerlegen. Jetzt ist sie ja nur 1 zu 1 zerlegt:
Inhalt bis zum 1. Komma = desc_1
Inhalt bis zum 2. Komma = desc_2
usw., das Ergebnis siehe weiter rechts desc_1 bis desc_15.

***
- in desc_1 die Info ob vorn, hinten, rechts...
- in desc_2 die Info Bauart
- in desc_3 die Info Typ
- in desc_4 die Info System

Vielen Dank zunächst das Ihr Euch überhaupt in die Situation reindenkt, ist ja ziehmlich verquert.

Gruß Torsten.

daolix

Zitat...das Ergebnis siehe weiter rechts desc_1 bis desc_15
Ahsoo, die Felder da rechts hab ich nicht geblickt.

Folgende bsp-Funktion gibt einen sortierten String zurück, welchen du dann ggf. in deine Zerlegungsfunktion einbauen/aufrufen musst:


Public Function SortBschr(ByVal s As String) As String
    Dim z() As String
    Dim r() As String
    Dim i As Long
    Dim l As Long
    z() = Split(s, ",")
    ReDim r(LBound(z()) To UBound(z()) + 3)
    For i = LBound(z()) To UBound(z())
        s = Trim$(Split(z(i), ":")(0))
        l = Switch(s = "Bauart", 1, s = "Typ", 2, s = "System", 3, i = 0, 0, Left$(s, 5) = "vorne" Or Left$(s, 6) = "hinten", 0, s <> "", 3 + i)
        r(l) = z(i)
    Next
    s = Join$(r(), ",")
    Do While InStr(s, ",,"): s = Replace(s, ",,", ","): Loop
    SortBschr = Left$(s, Len(s) - 1)
End Function

Aufruf ist z.b.
SortBschr("Typ: Gasdruck, Bauart: Federbein, System: 2-Rohr, vorne, für Fahrzeuge mit Standard Fahrwerk, Nutzlast: 1000 kg, Nutzlast: 1400 kg")
Ergebnis wäre dann:
vorne, Bauart: Federbein,Typ: Gasdruck, System: 2-Rohr, für Fahrzeuge mit Standard Fahrwerk, Nutzlast: 1000 kg, Nutzlast: 1400 k

Torsten.

Hallo daolix,
ich habe Deinen Code umgesetzt und zusätzl. die aktualisierte DB angehängt.
Denn es treten zwei Probleme auf:

1) Bei den im Modul nicht definierten Spalten
l = Switch(s = "Bauart", 1, s = "Typ", 2, s = "System", 3, i = 0, 0, Left$(s, 5) = "vorne" Or Left$(s, 6) = "hinten", 0, s <> "", 3 + i)
fehlt am Ende des Datensatzes jeweils 1 Zeichen

2) Bekomme ich beim ausführen der Abfrage die Fehlermeldung:
Laufzeitfehler '9':
Index außerhalb des gültigen Bereichs

Würdest Du da bitte nochmal schauen?

Gruß Torsten.

daolix

Hallo
zu1: Die Zeile
ReDim r(LBound(z()) To UBound(z()) + 3)
in
ReDim r(LBound(z()) To UBound(z()) + 4)
ändern

zu2. Diesen Fehler kann ich mit deinen Demodaten nicht reproduzieren. Die von dir angefügte Aktualisierungsabfrage lief bei mir ohne FM durch.


Torsten.

So, jetzt funktioniert es.
zu 1) ok
zu 2) FM kam weil in meinen Produktionsdaten in einigen Datensätzen ,, vorhanden waren und desweiteren das Wort hinten 2mal vorkam

Vielen Dank für die Hilfe, ich bin begeistert das die Situation maschinell gelöst werden kann.

Beste Grüße Torsten.