Hallo zusammen,
ich möchte gerne in einem Endlosformular frm_PosÜbersicht, das an die Tabelle tbl_Pos gebunden ist, die Reihenfolge der Datensätze beliebig mit Drag and Drop verändern. Ich habe gelesen, dass das per Modul möglich sein soll. Allerdings habe ich kaum Ahnung von VBA und bin somit auf Beispiele angewiesen. Leider habe ich bisher nichts brauchbares gefunden.
Die Tabelle besitzt die Felder PosID; PosText; TitelText; LvID
Die Positionen sollen später als Bericht in Form eines Leistungsverzeichnisses automatisch nummeriert und ausgedruckt werden.
Kann mir jemand vielleicht weiterhelfen??
Danke vorab.
Gruß
Max
			
			
			
				Du verwechselst wohl eine Datenbank mit einer Excel Liste.
Diese beiden Objekte sind nicht vergleichbar.
Die Reihenfolge in einer Datenbank-Tabelle wird primär durch den Hauptindex und darüber hinaus durch die Sortierangabe der jeweiligen Abfrage bestimmt.
Weiter Einzelheiten erspare ich mir mal, da sie nur verwirren würden.
Hast du dich mit den zentralen Themen Indexierung und Sortierung bei Datenbanken beschäftigt?
			
			
			
				Zitat von: markus888 am Juli 13, 2018, 21:51:20Du verwechselst wohl eine Datenbank mit einer Excel Liste.
?Ich finde das Ansinnen, Datensätze in einer Liste per Drag&Drop sortieren zu wollen, völlig legitim und ein sinnvolles Feature für manche (Teil-)Datenbankanwendung. Dies bedeutet ja nur, dass die Spalte, nach der die Datensätze sortiert sind, entsprechend aktualisiert werden muss, um die durch Drag&Drop hergestellte Reihenfolge abzubilden. 
Leider ist in Access praktisch keine Unterstützung für Drag&Drop eingebaut, so dass ich hier keinen "anfängertauglichen" Ansatz kenne, den ich empfehlen könnte.
			
 
			
			
				Hallo,
Q&D Annäherung:
Neues Feld in Tabelle:  "Sort" (Long, Duplikate möglich)  gefüllt mit anfänglicher Sortierreihenfolge
Datenherkunft des Forms:  Select * from tblMyTable order by Sort
Option Compare Database
Option Explicit
Dim IDold As Long, sortold As Long,  Toggle As Boolean
'----------------------------------
Private Sub Detailbereich_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Shift = 1 And Not Toggle Then
IDold = Me!ID
sortold = Me!Sort
Toggle = True
ElseIf Shift = 1 And Toggle Then
CurrentDb.Execute "update tblMyTabel  set Sort = " & Me!Sort & " where ID = " & IDold
Me!Sort = sortold
Toggle = False
Me.Requery
End If
End Sub
Einen Datensatz im Endlosform mit gedrückter Shift-Taste anklicken, danach Zieldatensatz mit gedrückter Shift-Taste  anklicken.
Das Formular wird umsortiert.
			
			
			
				Zitat von: PhilS am Juli 14, 2018, 02:05:04
Ich finde das Ansinnen, Datensätze in einer Liste per Drag&Drop sortieren zu wollen, völlig legitim und ein sinnvolles Feature für manche (Teil-)Datenbankanwendung.
Darum geht's doch gar nicht.
Die Frage ist ob die Basic's verstanden werden um darauf aufzubauen.
			
 
			
			
				Mittels Listview ActiveX ist auch Drag & Drop möglich.
			
			
			
				Hallo Franz,
ich bin deiner Anleitung gefolgt, jedoch funkt es nicht, nachdem ich die Feldnamen etc. angepasst habe.
Mir ist unklar, wo genau der obere Teil des Codes Option Compare Database ... eingetragen werden muss.
Er steht bei mir, wie bei dir, über dem Private Sub..., getrennt durch den üblichen Strich, direkt unter einem anderen Code? Sieht irgendwie nicht richtig aus.
Access meckert bei dem Versuch auch nicht, die DS zu verschieben. Beim Markieren des 2. DS markiert er alle dazwischen liegenden DS. Also ein Verhalten, wie ohne Code.
Was habe ich falsch gemacht?
@Lachtaube:
sieht gut aus, aber mit dem bei mir eingefügten ListView weiß ich leider gar nichts anzufangen.
Gruß
Max
			
			
			
				Hallo,
hast Du das Tabellenfeld "Sort" angelegt und auch mit fortlaufenden Zahlen gefüllt?
ZitatOption Compare Database
Option Explicit
Dim IDold As Long, sortold As Long,  Toggle As Boolean
steht als aller Erstes im  Formular-Modul.
Hast Du auch das Drücken der Shift-Taste berücksichtigt, wie im vorletzten Satz beschrieben?
			
 
			
			
				Hier mal als Beispiel, wobei wie bei Franz auch, ein Feld zum Sortieren der Datensätze verwendet wird.
			
			
			
				Hallo Franz,
habe nun alles, wie vorgegeben. Funkt immer noch nicht.
Mein Form basiert allerdings nicht auf einer Tab. sondern einer Abfrage.
Habe dann eine einfache Beispieltab. mit deinen Feldbezeichnungen erstellt. Nachdem ich einen Schreibfehler im Code korrigiert hatte, funktionierte es gelegentlich. D.h., ich musste ca. 10-15 x klicken bzw. doppelt klicken, bis die Reihenfolge sich 1x eher zufällig geändert hat. Keine Ahnung weshalb.
@Lachtaube
Habe beim Öffnen folgende Fehlermeldung erhalten und sich dann aufgehängt.
Gruß
Max
			
			
			
				Sorry, dann setz' mal im VBA-Editor einen Verweis (unter Menü Extras/Verweise) auf die DAO 4.0 Bibliothek und klicke den fehlerhaften Verweis weg.
			
			
			
				ist nicht in der Liste (Access 2003)
Nur DAO 3.6 (bereits aktiviert)
Ich hoffe, dass ich das auch in einer anderen DB einstellen kann, als in deiner, denn da komme ich nicht weiter.
			
			
			
				3.6 meinte ich auch. :) 
Ich habe den Anhang in meinem Beitrag weiter oben dahingehend geändert.
			
			
			
				Hallo,
nun komme ich zwar rein, aber nicht viel weiter,
da div. Fehlermeldungen erscheinen.
Gruß
Max
			
			
			
				Dann dürte wohl das verwendete ActiveX-Steuerelement nicht kompatibel sein. Welche Windows-Version verwendest Du?
Du kannst folgendes versuchen: Lösche den ungültigen Verweis sowie  das Steuerelement im Formularentwurf und füge ein ActiveX-Listview Steuerelement dem Formular hinzu. Lege dann seine Eigenschaften über das Kontextmenü wie im Bildanhang fest. Das Beispiel benötigt 5 Kopfspalten (ihr Name ist egal). Benenne das Steuerelement in lvCtl um. Prüfe, ob sich der Code dann in VBA kompilieren lässt und ob die Verweise keinen Fehler mehr enthalten.
			
			
			
				Ich verwende Win 7 64 pro
Leider funkt dein 2. Ansatz nicht, neue Fehlermeldungen bezügl. OLE nicht initialisiert.
Vielleicht wäre der Ansatz von Franz einfacher?
			
			
			
				Hallo,
mein Ansatz benutzt kein OCX.
Mit dem MSCOMCTL.OCX habe ich auch so meine Schwierigkeiten...
Oftmals hilft, das OCX im Verzeichnis C:\Windows\syswow64 mit Regsvr32 (auch aus diesem Ordner)  als Administrator zu de-registrieren.
Anschließend das OCX mit der Dateiversion 6.1.98.46 überschreiben.
Danach wieder mit regsvr32 die Ocx-Datei neu als Administrator registrieren.
In der DB den Verweis löschen (enthaken) und das Steuerelement aus dem Formular löschen.
Die Db erneut starten und das Listview (Version 6.0) neu einbauen.
Probleme kann es auch geben, wenn mehrere verschiedene Version der Ocx-Datei installiert sind. Dann versuchen, die anderen zu de-installieren, bzw. de-registrieren.
			
			
			
				Hallo,
ich glaube, so komme ich mit meinen bescheidenen Kenntnissen nicht weiter.
Deshalb habe ich noch einmal im Netz nach einem geeigneten Code geschaut und bin fündig geworden.
Hiermit soll man die DS im Formular per Schaltflächen nach oben (Reihenfolge(1)) bzw. unten (Reihenfolge(-1)) verschieben können.
Allerdings funkt dieser Code (bei mir) nicht. Access meckert wegen der nicht deklarierten DB.
erforderliche Tab-Felder: IDKLSch (Primärschlüssel), Schulbildung (Text), Rflg (Byte, eindeutig), Sortierung nach Rflg.
Private Sub Reihenfolge(updn As Integer)
Dim RS As Recordset
Dim qry As String
Dim AktRS As Long
Dim NewNo As Byte
If Me.Rflg = 1 Then Exit Sub
AktRS = Me.IDKLSch
NewNo = Me.Rflg - updn
Me.Rflg = 255
Me.Requery
Set db = CurrentDb
qry = "SELECT IDKLSch, Schulbildung, Rflg FROM tblOPSchulbildung ORDER BY Rflg;"
Set RS = db.OpenRecordset(qry, dbOpenDynaset)
With RS
.FindFirst "Rflg = " & NewNo
If Not .NoMatch Then
.Edit
!Rflg = NewNo + updn
.Update
End If
.FindFirst "Rflg = " & 255
.Edit
!Rflg = NewNo
.Update
End With
Me.Requery
Me.RecordsetClone.FindFirst "IDKLSch = " & AktRS
Me.Bookmark = Me.RecordsetClone.Bookmark
End Sub
Ihr findet den Fehler wahrscheinlich sofort. Danke vorab.
Gruß
Max
			
			
			
				Hallo,
lad doch deine Beispiel-DB mal hier hoch.....
			
			
			
				Hallo Franz,
hier die Beispiel-DB.
Gruß
Max
			
			
			
				Hallo,
anbei entspr. meinem Vorschlag.
Shift gedrückt halten und auf Datensatz (Freie Fläche zwischen den Feldern,nicht Datensatzmarkierer) klicken.
Auf Zieldatensatz klicken.
			
			
			
				Hallo Franz,
super jetzt funkt es!
So habe ich nun auch ein Sortierfeld, das
ich für die Berichte dringend benötige.
Danke Dir für Deine Geduld!!
Gruß
Max
			
			
			
				Hallo,
Auch wenn's jetzt funzt.
ZitatAccess meckert wegen der nicht deklarierten DB.
Versuch's halt mit einem
Dim db As DAO.DatabaseDieser Fehler deutet allerdings auf ein grundlegendes Problem. In 
Deinem Modulen fehlt im Kopf die Zeile
Option ExplicitDiese solltest du unbedingt überall nachtragen. Dann hätte sich der 
Compiler schon vorher mit einer Fehlermeldung bezügl. nicht definierter 
Variable gemeldet.
gruss ekkehard
			
 
			
			
				Hallo Ekkehard,
ja, jetzt funzt auch dieser Code!!
Vielen Dank für deine Korrektur.
Jetzt habe ich eine 2. Möglichkeit, 
die Reihgenfolge der DS zu verändern.
Gruß
Max
			
			
			
				Hallo Max,
Der zweite Teil des Posts ist der wichtigere.
gruss ekkehard
			
			
			
				Hallo noch mal,
ich krieg' die Motten!
Bei dem Versuch, den Code "Reihenfolge" auf meine vorhandene DB anzupassen, kommt immer der Fehler (s. Anlage). Die Fehlermeldungen sagen mir rein gar nichts. Obwohl ich Tab u. Form schon probehalber wie im lauffähigen Beispiel abgespeckt habe, funzt es trotzdem nicht.
Mir ist auch nicht klar, ob der Code
qry = "SELECT IDKLSch, Schulbildung, Rflg FROM tblOPSchulbildung ORDER BY Rflg;"
umbedingt mit der Anzahl der Felder in der Tab bzw. Abfrage identisch sein muss. Ich denke nein, denn das habe ich wiederum in der Beispiel-DB probiert, und dort funzt es trotzdem.
Gruß
Max
			
			
			
				Feldnamen, die einen Bindestrich, oder andere Sonderzeichen, enthalten, müssen in eckige Klammern eingeschlossen werden. Bsp:
SELECT [Pos-Id], Menge, .....
Sonst ist für einen Computer nicht klar, dass es sich nicht um eine Rechenaufgabe (X - Y = ?), sondern um einen zusammenhängenden Bergriff handelt. 
			
			
			
				Ja meine alten Feldbezeichnungen, jedesmal stolpert man drüber!
Aber jetzt funzt es! Danke Dir!
Gruß
Max