Ich bin mal wieder auf der Suche nach Hilfe bei einer Darstellungsfrage:
Folgende Ausgangstabelle:
ID Textfeld
1 A
1 B
2 AAA
2 BBB
3 CCC
3 DD
3 EE
Ich möchte pro ID alle Inhalte in einer Zelle vereinigen, jede ID sollte nur einmal auftreten; Ergebnis sollte wie folgt aussehen:
ID Textfeld
1 A;B
2 AAA;BBB
3 CCC;DD;EE
Kann mir jemand mit der Abfrage-Formulierung/SQL weiterhelfen?
Vielen Dank im Voraus
Anke
Hallo Anke,
du erstellst eine kleine Funktion in ein beliebiges Modul deiner DB:
Public Function SZ(ID As Long) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = "SELECT Textfeld FROM DeineTabelle WHERE ID =" & ID
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZ = SZ & "; " & rs!Textfeld
rs.MoveNext
Loop
SZ = Mid(SZ, 2, 100)
rs.Close
Set rs = Nothing
End Function
Hiermit kannst du in einer Abfrage die gewünschte Darstellung erreichen:
select ID, SZ([ID]) AS Ausgabe
from DeineTabelle
group by ID
Gruß Oma
Hallo,
klappt es oder kommst du nicht zurecht???
Gruß Oma
Es hat geklappt, vielen Dank!!! (ich musste erst herausfinden, wie man die Funktionen umsetzt, daher hat es etwas gedauert)
Viele Grüße
Anke
Hallo,
vielen Dank für dieses Skript. Leider habe ich ein Problem damit.
Ich habe eine Tabelle mit 2 Spalte, beide als Text deklariert.
In der ersten Spalte stehe Artikelnummern bestehend Buchstaben, Zahlen,Sonderzeichen.
In der zweiten Spalte stehen Druckernamen
Nun möchte die Artikelnummern gruppieren und alle entsprechenden Druckernamen in einem Feld mit ; getrennt ausgeben.
Ich denke ich habe die variablen entsprechend angepaßt. Es kommt jedes mal die Fehlermeldung Undefinierte Funktion 'SZ' in Ausdruck
Was kann das sein? Ich bin völlig ratlos.
Wäre super wenn mir jemand weiterhelfen könnte.
Danke
Hier noch mein geändertes script
Public Function SZ(ID As Long) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = "SELECT druckername FROM drucker WHERE ID =" & ID
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZ = SZ & "; " & rs!druckername
rs.MoveNext
Loop
SZ = Mid(SZ, 2, 100)
rs.Close
Set rs = Nothing
End Function
Abfrage
select ID, SZ([ID]) AS Ausgabe
from drucker
group by ID
Hallo,
WO steht diese SZ-Funktion?
Hey
Ich benutze die Funktion ebenfalls, habe aber eine etwas andere Tabellenstruktur.
tblFirmaTaetigkeit: FirmaTaetigkeitID, VertragID_F, FirmaID_F, TaetigkeitID_F
tblFirma: FirmaID, Name
tblTaetigkeit: TaetigkeitID, Nummer, Taetigkeit, Firma
Wie kann man mit der Funktion die Taetigkeit aus tblTaetigkeit als Wort und nicht nur die TaetigkeitID_F als Zahl auslesen lassen?
Danke ;)
Einfach eine Abfrage mit den nötigsten Kriterien aufbauen, Verknüpfungen einrichten, Code kopieren und schon klappt es ;D
Public Function SZ(VertragID As Long) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = " Select tblTaetigkeit.Taetigkeit FROM tblTaetigkeit INNER JOIN (tblFirma INNER JOIN (tblVertrage INNER JOIN tblFirmaTaetigkeit ON tblVertrage.VertragID = tblFirmaTaetigkeit.VertragID_F) ON tblFirma.FirmaID = tblFirmaTaetigkeit.FirmaID_F) ON (tblFirma.FirmaID = tblTaetigkeit.FirmaID) AND (tblTaetigkeit.TaetigkeitID = tblFirmaTaetigkeit.TaetigkeitID_F) where VertragID = " & VertragID
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZ = SZ & "; " & rs!Taetigkeit
rs.MoveNext
Loop
SZ = Mid(SZ, 2, 100)
rs.Close
Set rs = Nothing
End Function
Hallo, ich habe ein Problem mit einer Lösung, die früher funktioniert hat (damals und heute in Access 2002):
Ich nutze untenstehende Funktion (aus dem Beginn des alten Postings); bin jetzt in einer neuen Datenbank und erhalte nun folgende Fehlermeldung: "Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert."
Hat jemand eine Idee, wo das Problem liegen könnte?
Vielen Dank im voraus
Public Function SZ(ID As Long) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = "SELECT Textfeld FROM DeineTabelle WHERE ID =" & ID
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZ = SZ & "; " & rs!Textfeld
rs.MoveNext
Loop
SZ = Mid(SZ, 2, 100)
rs.Close
Set rs = Nothing
End Function
Hallo,
Idee hätte ich: der Verweis auf die DAO3.6-Library ist nicht gesetzt....
Sinnvollerweise könntest Du auch die Zeile nennen , die angemeckert wird...
Weiterhin: Heißt das Tabellenfeld wirklich "Textfeld" und die Tabelle "DeineTabelle" ??
Hallo,
Ich habe den Verweis auf die DAO3.6-Library gesetzt --> jetzt lässt sich das Modul ohne Fehlermeldung speichern und schliessen (Die Platzhalter für die ID/Textfeld/Tabelle habe ich natürlich entsprechend umbenannt (heissen: FilterID/EntryID/tblFilterEntry), wobei es immer sein kann, dass ich irgendwo einen Denkfehler drin habe).
Trotzdem Neues Problem: Wenn ich jetzt die Abfrage erstelle (unten entsprechend mit den richtigen Tabellen und Feldbezeichnungen), kommt die Fehlermeldung: "Undefinierte Funktion SZ im Ausdruck" ...
SELECT FilterID, SZ([FilterID]) AS Ausgabe
FROM tblFilterEntry
GROUP BY FilterID;
???? Any ideas?
Anke
Hallo,
die Funktion muss in einem STANDARD-Modul stehen , also einem Modul, das man im Navi-Bereich (Datenbankfenster) sehen und öffnen kann..
Hallo,
ich versuche diese Lösung umzusetzen. Wird auch kompiliert, aber im Abfragefeld Ausgabe steht #Fehler. Hat jemand ne Idee woran das liegen kann?
Bin für jede Hilfe dankbar.
Gruß
Bei mir hat jetzt alles geklappt, herzlichen Dank!!!!
Anke
Hallo,
ich habe das Beispiel DeineTabelle genauso eingegeben und folgender
Fehler erscheint in der Abfrage (XP/Access2010):
Laufzeitfehler '3078':
Das Microsoft Access-Datenbankmodul findet die Eingabetabelle oder Abfrage
'DeineTabelle' nicht. Stellen Sie sicher, dass sie vorhanden ist und der Name
richtig eingegeben wurde.
Im Modul ist folgendes markiert:
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Access 2010
Verweise auf:
Visual Basic for Applications
Microsoft Access 14.0 Object Library
OLE Automation
Microsoft Office 14.0 Access database engine Object Library
habe auch mal Verweis auf DA0 3.6 gesetzt (auf 14.0 rausgenommen),
Fehler erscheint trotzdem!
Gruss Torsten
Hallo,
naja..... ::) :o
Wenn die Fehlermeldung schon sagt, dass es "DeineTabelle" nicht gibt, dann setz halt dort einen Tabellennamen ein, der in Deiner DB auch vorhanden ist....
"DeineTabelle" ist doch nur ein BEISPIELNAME für die prinzipielle Lösung des Problems und muss jeweils immer an die eigene Situation angepasst werden
Hallo,
die Tabelle heist "DeineTabelle", ich habe einfach nur eine Testdatenbank mit genau
den Daten, wie am Anfang als Beispiel angeben wurde, erstellt um Schreibfehler zu
vermeiden.
Wenn ich aber dann die Abfrage ausführe erscheint die bereits beschriebene
Fehlermeldung!?!
Gruss Torsten
Hallo,
dann lad doch mal diese Beispiel-DB hier hoch (gezippt und komprimiert/repariert)
Hallo,
ich weiss nicht warum, aber nach dem letzten schliessen der Datenbank (Donnerstag)
funktionierte es nicht und als ich diese heute geöffnet hatte funktionierte es :-[ direkt!
Ich habe nun die tatsächliche Tabelle eingefügt, dabei entsteht aber beim öffnen der Abfrage
"qyrZeichen" ein Fehler, bei jedem Datensatz (waSendungsnr) erscheint in der Ausgabe
der gleiche Inhalt. Kann es sein, dass in dem Modul modSZaZeichen beim SQL-String was
geändert werden muss (waSendungsnr hat den Felddatentyp "Text")?
Ich habe mal die Datenbank angefügt.
Danke bisher für die Hilfe :)
Gruss Torsten
Hallo,
etwa so:
Public Function SZa(waSendungsnr As String) As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "select waZeichen from tblWare where waSendungsnr ='" & waSendungsnr & "'"
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZa = SZa & "; " & rs!waZeichen
rs.MoveNext
Loop
SZa = Mid(SZa, 3, 100)
rs.Close
Set rs = Nothing
End Function
Hallo,
danke für die schnelle Antwort, wenn ich jetzt =' " & waSendungsnr & " ' "
eingebe, erscheint beim öffnen der Abfrage in Feld Ausgabe gar nichts!
Gruss Torsten
Hallo,
was gibst Du WO ein?
Warum benutzt Du zusätzliche Leerzeichen um die Hochkommata?
Hallo,
ich habe den Fehler jetzt gefunden,
habe
Public Function SZa(ID As Long) As String
statt
Public Function SZa(waSendungsnr As String) As String
geschrieben (hätte den Code vom Oktober 25, 2013, 22:10:23 besser direkt
kopiert statt nur einen Teil zu ändern).
Vielen Dank für die Hilfe :)
Gruss Torsten
Hallo,
ich habe doch noch eine Frage,
kann ich in dem nachfolgenden Code auch noch eine Gruppierung einfügen,
Ergebnis:
Beispiel für Feld waZeichen
ohne Gruppierung
Test1; Test1
mit Gruppierung
Test1
Public Function SZa(waSendungsnr As String) As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "select waZeichen from tblWare where waSendungsnr ='" & waSendungsnr & "'"
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZa = SZa & "; " & rs!waZeichen
rs.MoveNext
Loop
SZa = Mid(SZa, 3, 100)
rs.Close
Set rs = Nothing
End Function
Im voraus besten Dank für eine Antwort
Gruss
Torsten
Hallo,
vielleicht:
strSQL = "select Distinct waZeichen from tblWare where waSendungsnr ='" & waSendungsnr & "'"
Hallo,
:D danke, war genau die richtige Hilfe.
Nachfolgend nochmals der gesamte Code zur Info:
Public Function SZa(waSendungsnr As String) As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "select waZeichen from tblWare where waSendungsnr ='" & waSendungsnr & "'"
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZa = SZa & "; " & rs!waZeichen
rs.MoveNext
Loop
SZa = Mid(SZa, 3, 100)
rs.Close
Set rs = Nothing
End Function
Schöne Grüße aus dem Westerwald
Torsten
Hallo, bin ganz neu hier und habe auch nicht viel Ahnung mit Access. Ich habe aus dem hier beschriebenen Vorgang eine Abfrage gestrickt die auf meine Bedürfnisse passt. Das funzt auch, leider gibt er mir mit Excel nicht alle Daten aus. Ich habe die Felder schon auf Memo gestellt. Jetzt gibt er mir 100 bzw 4000 Zeichen aus. Es sollten doch aber 65000 sein oder? Liegt es am Groupby? Kann mir bitte jemand helfen?
Danke Stefan
Hallo,
willkommen im Forum..
was sollen wir aber mit der Beschreibung anfangen? Alle unsere Glaskugeln zeigen gerade nur Nebel an. ;)
Zitat von: Stefan Bauer am Januar 20, 2020, 11:08:06
Jetzt gibt er mir 100 bzw 4000 Zeichen aus. Es sollten doch aber 65000 sein oder? Liegt es am Groupby?
Wahrscheinlich Ja. Wenn nach einem Memo-Feld gruppiert wird, wird dieses Feld gekürzt (meines Wissens auf 255 Zeichen), weil die Gruppierung eines vollständigen Memo-Feldes (bis 1GB Daten) erhebliche Performanceeinbußen bewirken würde.
Ok wie gesagt bin neu.. :-)
Hier meine Abfrage z.b. Automarken:
SELECT Dateneingang.Artnr, SZa([Artnr]) AS ktype, SZe([Artnr]) AS epid, SZb([Artnr]) AS ebaytabellen, SZc([Artnr]) AS magentotabellen, SZd([Artnr]) AS automarken
FROM Dateneingang
GROUP BY Dateneingang.Artnr;
Meine Module:
Automarken:
Public Function SZd(Artnr As String) As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT DISTINCT automarken from Dateneingang where Artnr ='" & Artnr & "'"
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZd = SZd & " " & rs!automarken
rs.MoveNext
Loop
SZd = Mid(SZd, 1)
rs.Close
Set rs = Nothing
End Function
Was muss ich ändern das er mir "Alles" ausgibt
Wenn Du Duplikate in automarken ausschließen kannst, reicht es wenn du das DISTINCT aus dem SQL entfernst.
Warum gibt es SZa, SZb, SZc etc.?
Ich habe für jede Spalte ein Modul in dem ich sage wie er die Daten zusammenfasst. So habe ich mir das ausgedacht :)
Duplikate kann ich leider in keiner Spalte ausschliessen.
Es gibt folgende Module:
automarken
ebaytabellen
epid
ktype
magentotabellen
Sorry, wenn ich ehrlich bin habe ich keine Ahnung, habe mir alles per copy und probier zusammengebaut. Wenn jemand eine andere Lösung hat wäre ich auch sehr dankbar. Bin kein Programmierer, leider schaffe ich es mit Excel nicht weil die Datenmenge zu groß ist. Habe mir letzte Woche mal Access aufgemacht und ein wenig rumgespielt.
Hallo,
keine Ahnung von Access zu haben, ist ja nichts Schlimmes...
Access ist eben nicht Excel, eher eine programmierbare und relationale Datenbankumgebung.
Um Access kennenzulernen, solltest Du zunächst Dir die Basics anhand von Büchern und Tutorials verinnerlichen . Mit C&P irgendwelcher Codeschnippsel, deren Funktion und Auswirkung Du nicht durchblickst, führt nicht zum Ziel, eher zu Frust und Ärger.
Am Anfang steht die Analyse und Zusammenfassung der vorhandenen Daten und Umsetzung in ein passendes Tabellenkonzept. Stichwort: Normalisierung. Siehe dazu u. st. Links 11, 1a und 1b.
Diese Umsetzung richtet sich auch nach der Aufgabe der DB, die sie lösen/bearbeiten soll.
Später, und wirklich erst dann, wenn das Tabellenkonzept schlüssig ist, macht man sich Gedanken um Abfragen, Formulare und Berichte. Bis hier ist selbst VBA-Code (fast) nicht nötig.
Stelle also hier deine Gedanken darüber vor, was die DB überhaupt bewältigen soll und auf welchen Grunddaten das Ganze aufbaut.
Danke für die Antwort,
mir ist das alles bewust. Meine Aufgabe ist es Daten die ich von verschiedenen Herstellern bekomme für einen Import in einen Magentoshop aufzuarbeiten. Das mache ich seit Jahren gut und zielführend.
Ich wollte mir jetzt ein "Helferlein" basteln indem ich eine Excel Liste importiere und dann wieder so wie ich Sie brauche exportiere. Das funktioniert ja auch zu 99,9%. Das Problem ist eben das in den Excel Zellen schon mehr als 255 Zeichen vorkommen und diese bei der Ausgabe sich bis zu 30 - 40 Tausend summieren. Daher Memo Felder. Daher meine Frage an das Forum.
Danke für eure Mithilfe.
Hallo,
tja....,
damit kann ich Dir keine konkreten Vorschläge machen... außer diesem: Bleib bei Excel und manipuliere dort die Daten so, wie Du sie brauchst. Excel kann auch VBA...
Danke dann bin ich hier wohl falsch. Sorry das ich eure Zeit verschwendet habe!
Guten Abend. Ich bin neu hier im Forum und habe mich angemeldet da ich seit einiger Zeit beruflich immer wieder mit Access-Datenbanken in Form von tabellarischen Auswertungen konfrontiert werde und diese Daten weiterverarbeiten muss. Seit einiger Zeit lese ich hier als Gast mit und habe schon den einen oder anderen nützlichen Tip gefunden. Meine Kenntnisse in Access sind leider rudimentär, ich möchte diese aber gerne vertiefen.
Derzeit beschäftigte ich mich mit eine Problem, das dem hier beschrieben sehr nahe kommt.
Hier meine vereinfachte Form der Ausgangstabelle:
Kunde Vertragsnummer xxxx xxxx
1. 1. xxxx Xxxxx
1. 2. xxxx. Xxxxxx
2. 3. xxxx. Xxxxx
3. 4. xxxxx xxxxx
4. 5. xxxxx. Xxxxx
4. 6.
4. 98.
Folgende Zieltabelle ist gewünscht:
Kunde. 1. Vertrag 2. Vertrag ........ 10.Vertrag
1. 1. 2.
2. 3.
3. 4.
4. 5. 6. ....... 98.
usw.
Wichtig wäre, das die einzelnen Verträge in einzelnen Feldern der neuen Tabelle dargestellt werden müssen. Jeder Kunde darf nur einmal in der Tabelle enthalten sein. Die Tabelle muss später als csv in exportiert werden.
Ich hoffe auf eure Unterstützung. Danke!
Du brauchst keine neue Tabelle. Die gewünschte Ansicht kann mit einer Kreuztabellenabfrage erstellt werden, die sich dann auch exportieren lässt.
Hi, danke für die schnelle Antwort. Genau das Bekomme ich nicht hin. Die Vertragsnummer ist immer Eindeutig (Primärschlüssel). Daher wird in der Kreuztabellenabfrage für jede Vertragsnummer eine Spalte erzeugt, an der Stelle wo sich Kunde und Vertragsnummer kreuzen wird das Feld mit 1 gefüllt. Im Ergebnis benötige ich aber 10 Spalten, welche je nach Anzahl der Verträge der Kunden nacheinander befüllt werden sollen. Hat ein Kunde eine geringere Anzahl von Verträgen soll von links nach rechts nur die benötigte Anzahl der Felder gefüllt werden. Die anderen Felder können dann leer bleiben.
ZitatIm Ergebnis benötige ich aber 10 Spalten
Kann man lösen über fixierte Spalten.
Für die Einordnung zu Vertrag_1 bis Vertrag_10 müsste man in der Basisabfrage zur KTA eine laufende Nummer erzeugen.
Vielen Dank! Das sieht sehr gut aus. Wo kommt den das Feld N her? Es ist ja in der Tabelle nicht vorhanden.
Zumindest habe ich die Testtabelle von dir jetzt nach meinen Anforderungen umgebaut und es funktioniert in der Simulation. Morgen werde ich den SQL-Code dann mal in die echte Datenbank exportieren.
Hi, leider stolpere ich bei der Adaption auf meine Tabelle über das Feld N. Mir ist nicht klar wo dieses herkommt, da es in der Ausgangstabelle nicht vorhanden ist.
ZitatTRANSFORM
MIN(Q.Art) AS M
SELECT
B.Name
FROM
05_tblBenutzer AS B
INNER JOIN
(
SELECT
B_ID,
Art,
"Sportart" & DCount("*", "05_tblSportarten", "B_ID = " & B_ID & " AND Art <= '" & Art & "'") AS N
FROM
05_tblSportarten
) AS Q
ON B.ID = Q.B_ID
GROUP BY
B.ID,
B.Name
PIVOT
Q.N IN("Sportart1", "Sportart2", "Sportart3", "Sportart4", "Sportart5")
Es ist hilfreich, wenn man eine SQL-Anweisung lesen und verstehen kann. Dazu wird man sie vorzugsweise vorher formatieren.
N ist der Alias (Name) für ein berechnetes Feld: Konstante "Sportart" und laufende Nummer.
Das habe ich so schon vermutet. Wie schon geschrieben habe ich habe den SQL-Code an meine Tabellendaten angepasst. Wahrscheinlich liegt der Fehler in der Syntax. Ich checke das morgen nochmals und bedanke mich für die nette Unterstützung.
So, alles im Echtsystem nochmal geprüft und getestet. Der Fehler lag zum einen an einer abweichenden Feldformatierung zum anderen am Syntax des Tabellennamen. In der Abfrage funktioniert das ganze jetzt wie gewünscht. Sobald ich die Daten allerdings aus der Abfrage in einer Tabelle erstelle wird die gewünschte Formatierung wieder aufgehoben, die Spalten N & M werden dargestellt und ich bekomme wieder für jeden Vertrag eine einzelne Zeile angezeigt. Excel-Export aus der Abfrage habe ich in echt noch nicht getestet, hat aber in der kleinen Simulation funktioniert. Von dort kann ich ja in *.csv ausgeben. Mit der echten Datenbank teste ich dann am Montag. :)
Ein Export als Text würde standardmäßig mit TransferText erledigbar sein.
Ja, aber es handelt sich um eine sehr Große Datenbank, eine Abfrage dauert derzeit fast 8 Minuten. Die Endtabelle muss zudem noch von anderen Mitarbeitern verifiziert werden. Am liebsten würde ich das auch in Access erledigen ist aber auch in Excel kein Problem. Nochmal vielen Dank für die freundliche Unterstützung.
Zitateine Abfrage dauert derzeit fast 8 Minuten
Das klingt so absolut. Muss es aber nicht sein.
Mit 200 Datensätzen kann jeder.
Bei 200k+ ist dann für Performance auch ein gewisses Maß an Entwicklerkompetenz zuträglich (Ablaufplanung, Abfragedesign, Indexnutzung).
Zum Querlesen: Performance total mies (http://www.office-loesung.de/ftopic413215_0_0_asc.php)