Neuigkeiten:

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

Mobiles Hauptmenü

Doppelte Werte im String löschen und sortieren

Begonnen von Torsten., Februar 10, 2016, 11:00:58

⏪ vorheriges - nächstes ⏩

Torsten.

Hallo zusammen,
bin bei der Suche im Form nicht fündig geworden, darum bitte ich um Eure Hilfe:
Es geht um eine Tabelle die u.a. die Spalte Modell hat. Der Inhalt ist in der Regel wie folgt:

1.0 TSI, 1.2 TSI, 1.4 TSI, 1.4 TSI, 1.6, 1.0 TSI, 1.2 TSI, 1.4 TSI, 1.8 TSI, 1.6 TDI, 2.0 TDI, 1.2 TFSI, 1.4 TFSI, 1.8 TFSI, 1.6 TDI

Wie zu ersehen sind einige Werte doppelt enthalten - 1.0 TSI, 1.2 TSI, 1.4 TSI...
Gibt es eine Möglichkeit diese doppelten Werte zu löschen und den String sortiert aufsteigend anzuzeigen?

Beste Grüße Torsten

MzKlMu

Hallo,
das wird ziemlich aufwendig. Du musst die einzelnen Werte in ein Array einlesen und dieses Array sortieren, anschließend was doppelt ist entfernen.
In einer Datenbank sind solche Felder nicht vorgesehen, daher gibt es da kein fertige Lösung, das muss selbst programmiert werden.
Eine korrekt aufgebaute Datenbank enthält in einem Feld immer nur einen Wert (atomare Inhalte > 1.Normalform).

Wie kommt dieses falsche Datenmodell zu Stande, wird das importiert ?
Die zutreffenden Modell sollten als Datensätze in einer extra Tabelle vorliegen.
Kann das noch geändert werden ?
Gruß Klaus

Torsten.

Hallo Klaus,
anbei eine Demo-DB die den Vorgang darstellt.
Aus der Tabelle 04_tbl... ist der String zu meiner Anfrage
Die Module sind nicht von mir, das Verständnis dafür habe ich leider nicht. Sie wurden mit Eure Hilfe in der Vergangenheit erstellt.

Gruß Torsten

DF6GL

Hallo,


die Zip-Datei ist (von mir) nicht zu öffnen...
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,
versuche es bitte mit .7z, habe die Endung in zip geändert, da man 7z nicht hochladen kann.

Du wirst Deinen Code sicherlich wieder erkennen ;-)

Gruß Torsten

MaggieMay

Hallo,

der Aufbau ist falsch, das wurde ja bereits gesagt. So wird es immer wieder zu Fehlern und Korrekturbedarf kommen, das wird also kein einmaliger Vorgang sein. Solche Listen erzeugt man zur Anzeige, gespeichert werden die Modellzuordnungen aber "atomar", d.h. jede in einem einzelnen Datensatz. Dazu legst du eine neue Tabelle mit Artikelnr. und Modellspalte und einem eindeutigen Mehrfelderindex über Artikel und Modell an, liest die "04_tbl..." per VBA in einer Recordset-Schleife aus, trennst die Modellspalte mit Hilfe der Split-Funktion in einen Array auf, und fügst die einzelnen Elemente in einer Schleife in die neue Tabelle ein. Dabei ignorierst du einfach den Fehler der bei doppelten Einträgen auftritt.

Zur Erzeugung der Auflistung zur Anzeige in Formularen und Berichten kannst du die Funktion SQLListe aus dem dbWiki einsetzen.
Freundliche Grüße
MaggieMay

DF6GL

Hallo,

7z:  das solltest Du gleich sagen...


ja, ich kann mich dunkel erinnern, aber beim String-Zusammenbau in einem Feld war es nicht die Intension, diese Strings weiter zu bearbeiten.  Das war lediglich für die Anzeige (z. B. in einem Bericht) gedacht...

Ansonsten siehe Beitrag von Klaus.

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.

#7
So ich habe mich Erholt ;-)
Ich versuche Eure Erklärung zu verstehen:
ZitatSolche Listen erzeugt man zur Anzeige, gespeichert werden die Modellzuordnungen aber "atomar", d.h. jede in einem einzelnen Datensatz.
Wenn ich das richtig verstehe: Das ist in der Tabelle 03_tbl... so vorhanden.

Könnt Ihr bitte nochmal schauen?

Beste Grüße Torsten

ProVBA

Hallo Torsten,
ich habe mir deine DB etwas angesehen und bin vielleicht noch auf einen weiteren Lösungsweg gekommen.
Du liest die Datensätze aus 03_tbl... Feld Fahrzeug aus und entfernst dabei die doppelten Einträge anschließend als String aneinander fügen und in 04_tbl... das Feld Fahrzeug überschreiben.

Das gleiche machst du mit dem Feld Modell.
Vielleicht wäre das noch eine weitere Möglichkeit, ist ja auch schnell gemacht...

Gruß

Torsten.

Hallo ProVBA,
während ich den letzten Post geschrieben habe kam Deine Nachricht rein.
Vielen Dank das Du Dich auch mit meinem Problem beschäftigst, ich werde gleich nachher beigehen und es ausprobieren.

Gruß Torsten

Torsten.

@ ProVBA und @ all
Wenn ich Dich richtig verstanden habe, habe ich das mit

Modell: sqlliste("select distinct [color=red]modell[/color] from 02_tbl_~~~~~_aktuell where artikel_nr ='" & [artikel_nr] & "'")
bereits versucht.

Das Ergebnis (mein Problem warum ich den Thread eröffnet habe) ist aber nicht 100% richtig, denn es wird "nur" der gesamte String geprüft. Es müßte aber der Inhalt des Strings verglichen werden.

Am Beispiel 1.0 TSI kann man es nachvollziehen: Kommt 3 mal (Datensatz 1-3 in 02_tbl_...) vor und wird 2mal statt 1mal aufgelistet.

Zitat1.0 TSI, 1.2 TSI, 1.4 TSI, 1.4 TSI, 1.6, 1.0 TSI, 1.2 TSI, 1.4 TSI, 1.8 TSI, 1.6 TDI, 2.0 TDI, 1.2 TFSI, 1.4 TFSI, 1.8 TFSI, 1.6 TDI

Ich hoffe ich konnte mich verständlich rüberbringen.

MaggieMay

Hallo,

das macht ja schon deshalb keinen Sinn, weil bereits in "02_tbl_..." (ebenso wie in "01_tbl_...") in der Spalte Modell eine Auflistung steht.

Wenn das Problem (bzw. die DB) schon ein Vorgeschichte hat, hättest du evtl. im alten Thread bleiben sollen oder zumindest darauf verweisen. Oder du solltest dein Anliegen und den ganzen Zusammenhang etwas ausführlicher schildern.

ZitatEs müßte aber der Inhalt des Strings verglichen werden.
Womit und zu welchem Zweck?
Freundliche Grüße
MaggieMay

Torsten.

Mmmmh, etwas ausführlicher?
Mehr als die DB offen legen und sagen was ich möchte kann ich eigentlich nicht.
ZitatWenn das Problem (bzw. die DB) schon ein Vorgeschichte hat, hättest du evtl. im alten Thread bleiben sollen oder zumindest darauf verweisen. Oder du solltest dein Anliegen und den ganzen Zusammenhang etwas ausführlicher schildern.
Die DB hat keine Vorgeschichte, sie wurde zwar von einer früheren kopiert und angepaßt, aber das Ergebnis muß jetzt anders sein - ohne doppelte Werte im String.

Zu Deiner Frage:
ZitatWomit und zu welchem Zweck?
Damit im String
Zitat1.0 TSI, 1.2 TSI, 1.4 TSI, 1.4 TSI, 1.6,||| 1.0 TSI, 1.2 TSI, 1.4 TSI, 1.8 TSI, 1.6 TDI, 2.0 TDI,||| 1.2 TFSI, 1.4 TFSI, 1.8 TFSI, 1.6 TDI
die rot hinterlegten Modelle nicht mehr aufgelistet bzw. gelöscht und der Rest aufsteigend sortiert werden.

Um beim Beispiel 1.0 TSI zu bleiben: Einer von den 3 Stringwerten (der 2. oder 3.) wurde ja gelöscht, aber eben nicht der 2. (siehe 02_tbl_...) weil der String im 2. und 3. Datensatz im ganzen identisch ist.

Bis zum 1. ||| = String aus 1. Datensatz
Bis zum 2. ||| = String aus 2. + 3. Datensatz
Danach = String aus 4. + 5. Datensatz
Es wird bei der Prüfung im String nicht auf die Werte jeweils bis zum Komma geprüft sondern nur der gesamte.

Ich hoffe es ist jetzt nicht zu verwirrend beschrieben.

DF6GL

#13
Hallo,

unabhängig von fragwürdigem DB-Konzept und Tabellenstruktur, hier ein SQL(Tabellen)-VBA-gemischtes Beispiel, um in einem Komma-getrennten Wertelisten-String Doubletten zu entfernen und die Einzelwerte zu sortieren.. 

Function DDASA(strStr As String) As String

' Funktion DeleteDoubletsAndSortAsc
Dim a, db As Database, i As Long, strErg As String, rs As DAO.Recordset

Set db = CurrentDb
On Error Resume Next
db.Execute "delete * from tblTemp"
db.Execute " Create Table tblTemp  (strItem Text(50) Primary Key)"
On Error GoTo myErr

a = Split(strStr, ",")
For i = LBound(a) To UBound(a)
  db.Execute "insert into tblTemp (strItem) Values ('" & a(i) & "')"
Next

Set rs = db.OpenRecordset("select * from tblTemp order by strItem", dbOpenSnapshot)
Do Until rs.EOF
  strErg = strErg & ", " & Trim(rs(0))
  rs.MoveNext
Loop

If Len(strErg) > 1 Then
   DDASA = Mid(strErg, 3)
Else
   DDASA = ""
End If

Exit_F:
If Not rs Is Nothing Then rs.Close: Set rs = Nothing
Set db = Nothing
Exit Function

myErr:
MsgBox Err.Number & ": " & Err.Description
Resume Exit_F
End Function

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.

Guten Morgen Franz,
ich habe mich gefreut das Du Dir nochmals Gedanken gemacht hast.
Bitte helfe mir noch wie ich das in der Abfrage umsetzen muß - meine Versuche brachten kein Erfolg.

Gruß Torsten