Neuigkeiten:

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

Mobiles Hauptmenü

Endlosformular Popup

Begonnen von Stele4, März 13, 2026, 10:56:17

⏪ vorheriges - nächstes ⏩

Stele4

Hallo!
Eine unbekannte Anzahl Datensaetze soll in einem Popup-Fenster angezeigt werden.
Die Daten kommen per Stored Procedure vom Sql Server und werden mit 'Me.Set .Recordset =...' zugewiesen.
Die Daten sollen nicht bearbeitet werden.

Die Formulare werden grundsaetzlich als Tab angezeigt (Projekteinstellung).

Das neue Formular soll als Endlosformular als Popup angezeigt werden.
Es sollen alle Datensaetze angezeigt werden.
Das Formular hat aber nur die Hoehe 1 Datensatzes.

Ein Versuch mit einem Report ist gescheitert, weil ein Feature nur in ADP verfuegbar ist.
Ich vermute, es betrifft die Zuweisung der Daten.

Wie kann die Aufgabe geloest werden?

Gruss Stele

Bitsqueezer

Hallo,

ja, das Feature, ein ADO-Recordset einem Formular zuzuweisen, kommt durchaus noch von ADP, aber grundsätzlich kann in einem Formular jedes DAO- oder ADO-Recordset dem Formular-Recordset zugewiesen werden.
Allerdings nicht so:
Me.Set .Recordset

sondern so:

Set Me.Recordset = DeinADORecordset
Beachte dabei, daß ein Recordset, das über eine SP befüllt wurde, u.U. nicht mit F5 aktualisierbar ist (i.d.R., wenn Parameter im Spiel sind). In dem Fall mußt Du die F5-Taste per VBA abfangen und das Recordset neu holen/zuweisen.

Gruß

Christian



PhilS

Zitat von: Stele4 am März 13, 2026, 10:56:17Wie kann die Aufgabe geloest werden?
Bitte beschreibe nochmal genau, was eigentlich dein Problem ist.
Das Recordset eines Reports kann in einer ACCDB-Datei nicht gesetzt werden. Wenn du die Daten in einem Bericht darstellen willst, musst du auf eine Pass-Through-Abfrage zurückgreifen.
Was dein Problem mit dem Formular ist, verstehe ich bisher nicht.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Stele4

Die Set-Anweisung ist bei mir schon korrekt. Ich habe es nur falsch uebermittelt. Verzeihung bitte.

Ein Endlosformular wird als Popup geoeffnet (WindowMode:=acDialog). Es ist nur 1 von 16 Datensaetzen sichtbar. Zu den anderen Datensaetzen muss gescrollt werden. Das ist nicht schoen.

Gruss Stele

Bitsqueezer

Hallo,

ja, aber wenn das Formular nur einen Datensatz hoch ist - was erwartest Du dann?.. :)
Mach's größer und gut is'.

Access merkt sich die Größe, wenn Du bei geöffnetem Popup-Formular "Save" durchführst.
Besser ist aber "DoCmd.MoveSize" für genaue Größe. Die ist allerdings in Twips. Kannst Du aber aus WindowWidth und WindowHeight auslesen (wenn ich die Namen richtig in Erinnerung habe), wenn das Formular geöffnet und auf die richtige Größe eingestellt ist.

Oder einfach ausprobieren.

MoveSize sollte dann keine X/Y-Parameter mitbekommen (Top/Left). Denn das gibt Probleme bei modernen Multi-Bildschirm-Layouts. Der Standardbildschirm ist der mit Koordinaten 0/0, ein Bildschirm links davon hat negative Koordinaten, rechts davon positive. Ganzz zu schweigen von darüber oder darunter, unterschiedliche Bildschirmgrößen und Auflösungen... usw.
Besser nicht die Position vorgeben.

Gruß

Christian

Stele4

Guten Morgen!

Das Formular laesst sich zur Laufzeit mit der Mouse nicht vergroessern.
Bei den Parametern habe ich nichts entdeckt, was dies verhindert.

Der Tipp mit "DoCmd.MoveSize" war hilfreich.
Access ist hier wieder einmal sonderbar.
Der Code "Me.Detail.Height=..." ist wirkungslos.
Bei "DoCmd.MoveSize" koennen keine benannten Parameter angewendet werden.
Die Berechnung der Hoehe aus den Einzelmassen und der Anzahl der Satensaetze funktioniert auch nicht annaehernd korrekt.
Selbst wenn man die Hoehen von Kopf und Fuss des Windows-Fensters beruecksichtigt.

Bei meiner Anwendung sind es normalerweise 8 oder 16 Datensaetze. Die beiden Hoehen des Formulars lassen sich  empirisch ermitteln. Fuer alles andere ist der Scroll-Balken ok.

Gruss und Dank!

    With Me
        Set .Recordset = mdlx_SqlSrv.fcSqlRst(sSql:="EXEC spIoSltCnf @SltId = " & .OpenArgs)                   
       
        DoCmd.MoveSize , , , .FormHeader.Height + .FormFooter.Height + .Recordset.RecordCount * 500
        'Twip (1 twip = 1/20 point, 1440 twips ~ 1 inch, 567 twips ~ 1 cm)
       
        '#nicht korrektes Ergebnis: DoCmd.MoveSize , , , .FormHeader.Height
                                                         + .FormFooter.Height
                                                         + .Recordset.RecordCount * .txtId.Height
        '#funktioniert nicht:       DoCmd.MoveSize Heigth:=.Recordset.RecordCount * 200
        '#funktioniert nicht:       .Detail.Height = .Recordset.RecordCount * 1000
    End With

Knobbi38

Hallo Stele,

ZitatDie Berechnung der Hoehe aus den Einzelmassen und der Anzahl der Satensaetze funktioniert auch nicht annaehernd korrekt.
Natürlich kann man alle diese Berechnungen korrekt durchführen, man muss halt nur wissen, auf was sich genau die verschiedenen Maßangaben bei einem Fenster und dessen Inhalt beziehen. Wenn man das alles berücksichtigt, kann man solche Einstellungen präzise machen, fragt sich nur, ob das überhaupt notwendig ist. Normalerweise überlässt man solche Größeneinstellungen den wünschen des Anwenders, eventuell überwacht man noch Mindestmaße, das sollte dann aber auch ausreichen.

Knobbi38
 

Stele4

Hallo Knobbi!
Einmal drueber schlafen hilft. Die Zeile, die ich gestern auskommentierte, funktioniert nun.
DoCmd.MoveSize , , , .FormHeader.Height + .FormFooter.Height + .Recordset.RecordCount * .txtId.Height + 1000Mit dem Offset 1000 fuer 'Sonstiges' bin ich zufrieden.

Fehlt noch die Groessenaenderung durch den Bediener. Das Formular wird aufgerufen:
DoCmd.OpenForm FormName:="F_IoSltCnf", WindowMode:=acDialog, OpenArgs:=143Es laesst sich vom Bediener in seiner Groesse nicht aendern.
Alle Parameter im Editor, die mir sinnvoll erschienen, habe ich ausprobiert.

Gruss Stele

Knobbi38

Hallo Stele,

bei einem Dialogfenster läßt sich die Größe nicht mehr mit der Maus ändern, sondern über das Systemmenü und der Tastatur. Öffne das Fenster als acWindowNormal und evtl. modal (gebunden), dann erzielst du den gewünschten Effekt.

Knobbi38
 

Stele4

Danke Knobbi!
Aber es bleibt wie es ist.

Public Sub fbTst()   
    DoCmd.OpenForm FormName:="F_IoSltCnf", WindowMode:=acWindowNormal, OpenArgs:=143         
End Sub

Private Sub Form_Load()
    With Me
        Set .Recordset = mdlx_SqlSrv.fcSqlRst(sSql:="EXEC spIoSltCnf @SltId = " & .OpenArgs)                   
        .Modal = True
        DoCmd.MoveSize , , , .FormHeader.Height + .FormFooter.Height + .Recordset.RecordCount * .txtId.Height + 1000
    End With
End Sub

Gruss
Stele

Stele4

Ich habe mich vielleicht missverstaendlich ausgedrueckt.
"Es bleibt, wie es ist." bedeutet, dass der Benutzer es nicht aendern kann.

Inzwischen ist es geloest:
- Aufruf mit Parameter: WindowMode:=acWindowNormal,
- Editor Property Sheet:
  - AutoResize: no
  - BorderStyle: Sizable
  - PopUp: yes
  - ControlBox: yes

Mein Pech war wohl die Kombi der Parameter.

Dank und Gruss
Stele

Knobbi38

#11
Hallo Stele,

ich verstehe offensichtlich dein Problem nicht, bei mir funktioniert das wie gewünscht. Mit
Private Sub Form_Load()
  Me.InsideHeight = 5000: Me.InsideWidth = 7000
End Sub
kann ich problemlos die Fenstergöße anpassen.

Knobbi38

Nachtrag:
Da hat sich etwas mit den Antworten überschnitten, aber entscheidend sind die Eigenschaften:
Zitat- BorderStyle: Sizable
  - PopUp: yes
  - ControlBox: yes
Und bitte keine Docmd.Move ... mehr, so etwas löst man in VBA direkt mit den entsprechenden Form-Eigenschaften, ohne auf Access Aktionen zurückgreifen zu müssen.