PDA

Vollständige Version anzeigen : Per Button Textfeld mit nächsten Datensatz (Feld) befüllen


oskar68
09.06.2012, 11:11
Hallo,


Dim rs As ADODB.Recordset

str_SQL = " SELECT Retouren_Stamm.Prod_Nr, " & _
" Retouren_Stamm.Nummer, " & _
" Retouren_Stamm.Erfasser " & _
" FROM Retouren_Stamm " & _
" GROUP BY Retouren_Stamm.Prod_Nr, " & _
" Retouren_Stamm.Nummer, " & _
" Retouren_Stamm.Erfasser " & _
" HAVING (((Retouren_Stamm.Erfasser) = cmdUserId())) " & _
" ORDER BY Retouren_Stamm.Nummer DESC "

Set rs = New ADODB.Recordset
rs.Open str_SQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

Do While Not rs.EOF
Me.Prod_Nr.Value = rs!Prod_Nr
rs.MoveNext
Loop


das hier funktioniert nicht, war mir auch klar, aber weiter weiß ich nicht.

Also ich habe in einem Formular (kein Endlos Frm) einen Command-Button und möchte, daß er beim ersten Betätigen des Buttons mir im Textfeld (Prod_Nr)
die letzte Prod-Nr anzeigt (letzter DS = Nummer (Autowert) absteigend), beim nächsten Pushen den vorletzten, dann den vorvorletzten usw., also pro Button-Drücken einen Datensatz weiter, bzw. zurück.

Hab keine Ahnung, ob das geht.

Gruß
Oskar

Thomas Möller
09.06.2012, 11:17
Hallo Oskar,

das hier funktioniert nicht, war mir auch klar, aber weiter weiß ich nicht.

was genau heißt für Dich "funktioniert nicht"?

Gibt es eine Fehlermeldung? Wenn ja, welche?

Oder tut der Code nicht das, was Du Dir vorstellst? Dann wäre die Frage, was genau nicht so funktioniert, wie Du es Dir wünscht.

CU

oskar68
09.06.2012, 11:27
er rattert durch und zeigt mir vom ersten DS die Prod-Nr an.

oskar68
09.06.2012, 11:31
ich denke, daß das so nicht funkioniert, da pro Betätigen des Buttons
das komplette Script durchläuft, also müßte das Script wissen, wo der Datensatzmarkierer das letzte mal war.

Thomas Möller
09.06.2012, 11:58
Hallo Oskar,

mal sehen, ob ich Deine Anforderung richtig verstehe:

Wenn man auf den Button klickt, dann wird in das Textfeld Prod_Nr der Wert der jeweils vorherigen ProdID eingetragen. Wenn es sich um einen neuen DS handelt, soll die letzte ProdID eingetragen werden.

Ist das so richtig?

CU

ebs17
09.06.2012, 11:59
er rattert durch
Die Recordsetschleife macht das erwartungsgemäß. Da das Formularfeld als Empfänger der Information nicht gewechselt wird, kannst Du den Buttonklick beliebig oft auslösen und wirst immer das gleiche Ergebnis erzielen.

Kleine Zusatzfrage: Warum wird kein gebundenes Formular verwendet? Da müsste man das Autowertfeld nur in die Anzeige einbeziehen.

oskar68
09.06.2012, 12:41
es geht darum, daß man sich per Button_Click eine DS rückwärts bewegt und jeweils im Textfeld die entsprechende Prod-Nr angezeigt bekommt.
Das besagte Formular ist ein Korrektur-Formular in den man bereits erfasste Retouren ausbessern kann.

Hab´s jetzt so gelöst, ist zwar nicht die eleganteste Lösung.


Dim rs As ADODB.Recordset

str_SQL = " SELECT Retouren_Stamm.Prod_Nr, " & _
" Retouren_Stamm.Nummer, " & _
" Retouren_Stamm.Erfasser, " & _
" Tbl_Nummer_temp.RetNummer " & _
" FROM Retouren_Stamm " & _
" LEFT JOIN Tbl_Nummer_temp " & _
" ON Retouren_Stamm.Nummer = Tbl_Nummer_temp.RetNummer " & _
" WHERE (((Retouren_Stamm.Erfasser) = cmdUserId()) " & _
" And ((Tbl_Nummer_temp.RetNummer) Is Null)) " & _
" ORDER BY Retouren_Stamm.Nummer DESC "

Set rs = New ADODB.Recordset
rs.Open str_SQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

Me.Prod_Nr.Value = rs!Prod_Nr
lngNummer = rs!Nummer

DoCmd.SetWarnings False
DoCmd.OpenQuery "Anfuegen_Nummer_temp"


Pro Button_Click wird der letzte Autowert in eine Tabelle mit temporären Inhalt geschrieben. So wird mir jeweils die nächstletzte Prod-Nr angezeigt und kann mich somit durchklicken.

Wenn jemand eine bessere, bzw. elegantere Lösung weiß, bitte einfach reinschreiben.

Danke und Gruß
Oskar

Thomas Möller
09.06.2012, 13:19
Hallo Oskar,

es geht darum, daß man sich per Button_Click eine DS rückwärts bewegt

wäre es dann nicht auch ausreichend, wenn man folgenden Code verwendet:
DoCmd.GoToRecord , , acPrevious
CU

oskar68
09.06.2012, 14:14
Wenn ich mich nicht irre, geht das nur in einem Endlosformular und das ist hier nicht der Fall. Es geht um HFO mit mehreren UFO´s.

Hab noch was geändert, damit´s nicht beim letzten DS auf Fehler läuft.


If rs.EOF Then
rs.Close
MsgBox "Keine Produktionsnummern mehr vorhanden", vbInformation, cmd_LOCATION_2
Else
Me.Prod_Nr.Value = rs!Prod_Nr
lngNummer = rs!Nummer
End If

Thomas Möller
09.06.2012, 14:30
Hallo Oskar,

Wenn ich mich nicht irre, geht das nur in einem Endlosformular und das ist hier nicht der Fall.

hast Du es denn einmal ausprobiert? ;)
Vielleicht irrst Du Dich ja. ;)

CU

oskar68
09.06.2012, 15:01
bekomme einen Laufzeitfehler 2105

kann nicht zu dem angegebenen Datensatz springen

wie sollte den das Ganze aussehen?

Thomas Möller
09.06.2012, 15:54
Hallo Oskar,

bekomme einen Laufzeitfehler 2105
kann nicht zu dem angegebenen Datensatz springen

befindest Du Dich zufällig im ersten Datensatz? Dann wäre diese Fehlermeldung zu erwarten und müsste abgefangen werden, z.B. so:

On Error GoTo Err_Handler

DoCmd.GoToRecord , , acPrevious

Exit_Here:
Exit Sub

Err_Handler:
Select Case Err.Number
Case 2105
Resume Exit_Here
Case Else
MsgBox Err.Description
Resume Exit_Here
End Select

HTH

oskar68
11.06.2012, 14:54
ich häng mal das Formular an, denn das hier

DoCmd.GoToRecord , , acPrevious


funktioniert in diesem Fall nicht.

Gruß
Oskar

oskar68
11.06.2012, 14:57
und hier ist das komplette Script

Private Sub cmd_LAST_RET_Click()
On Error GoTo Fehler
Dim rs As ADODB.Recordset
DoCmd.SetWarnings False

If lng_RKT_NUMMER_2 > 0 Then
MsgBox "Zum Weiterklicken, ausgewählten Datensatz entsperren !", vbInformation, cmd_LOCATION_2
Exit Sub
End If

Loop_1:

str_SQL = " SELECT Retouren_Stamm.Prod_Nr, " & _
" Retouren_Stamm.Nummer, " & _
" Retouren_Stamm.Erfasser, " & _
" Tbl_Nummer_temp.RetNummer " & _
" FROM Retouren_Stamm " & _
" LEFT JOIN Tbl_Nummer_temp " & _
" ON Retouren_Stamm.Nummer = Tbl_Nummer_temp.RetNummer " & _
" WHERE (((Retouren_Stamm.Erfasser) = cmdUserId()) " & _
" And ((Tbl_Nummer_temp.RetNummer) Is Null)) " & _
" ORDER BY Retouren_Stamm.Nummer DESC "

Set rs = New ADODB.Recordset
rs.Open str_SQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

If rs.EOF Then
rs.Close
strMeldung = MsgBox("Letzte Prod-Nr erreicht !" & Chr(13) & Chr(13) & "Wiederholen ?", vbYesNo, cmd_LOCATION_2)

If strMeldung = vbYes Then
GoTo Weiter
End If
Else
Me.Prod_Nr.Value = rs!Prod_Nr
lng_RKT_PRODNR = rs!Prod_Nr
lngNummer = rs!Nummer

Call cmd_Anzeigen_RKT_UFO
End If

DoCmd.OpenQuery "Anfuegen_Nummer_temp"

Exit Sub

Weiter:
DoCmd.OpenQuery "Loeschen_Nummer_temp"
GoTo Loop_1

Fehler:
MsgBox Me.NAME & Chr(13) & Err.Description
Exit Sub
End Sub

Thomas Möller
11.06.2012, 19:52
Hallo Oskar,

ich häng mal das Formular an,

Danke für den Screenshot.

Ich bin mir gerade nicht sicher, in welchem der Formulare zum vorherigen DS gewechselt werden soll - im Haupt- oder im Unterformular?

CU

EmiliaM
12.06.2012, 00:35
Hallo Oskar & Thomas,

ich glaube, hier muss man zwei Dinge unterscheiden.

Die Anweisung

DoCmd.GoToRecord , , acPrevious

bewegt ein gebundenes Formular zum nächsten Datensatz, d.h. das Formular würde den vorigen Datensatz zeigen mit allen zugehörigen Feldern. Es ändert nicht nur einfach den Inhalt eines Textfeldes.

Wie ich Oskar verstehe, soll der Button nur den Inhalt eines Textfeldes ändern und nicht das ganze Formular navigieren. Ich habe den Eindruck, dieses Textfeld ist ungebunden. Stimmt das?

Deshalb würde ich Oskar mal fragen, was bezweckst du genau mit dem Einblenden der ProdNr. in diesem Textfeld? Tut cmd_Anzeigen_RKT_UFO etwa den zugehörigen Datensatz einblenden?

oskar68
12.06.2012, 07:30
im HFO das Textfeld (Me.Prod_Nr.Value ) und

Call cmd_Anzeigen_RKT_UFO


startet ein weiteres Script für das UFO (benötigt die Prod-Nr)

Public Sub cmd_Anzeigen_RKT_UFO()
On Error GoTo Fehler

str_SQL = " SELECT Anzeigen_RKT_UFO.Sachbearbeiter, " & _
" Anzeigen_RKT_UFO.Prod_Nr, " & _
" Anzeigen_RKT_UFO.Fertigungs_Datum, " & _
" Anzeigen_RKT_UFO.Status, " & _
" Anzeigen_RKT_UFO.Fertigungs_Zeit, " & _
" Anzeigen_RKT_UFO.Erfassungs_Datum, " & _
" Anzeigen_RKT_UFO.Erfassungs_Zeit, " & _
" Anzeigen_RKT_UFO.Erfasser, " & _
" Anzeigen_RKT_UFO.Platz, " & _
" Anzeigen_RKT_UFO.Nummer, " & _
" Anzeigen_RKT_UFO.Txt_X, " & _
" Anzeigen_RKT_UFO.Gestell_Nr, " & _
" Anzeigen_RKT_UFO.SCHLUESSEL, " & _
" Anzeigen_RKT_UFO.REFERENZ_NR, " & _
" Anzeigen_RKT_UFO.IdentNr " & _
" FROM Anzeigen_RKT_UFO "
Forms!Retourenerfassung_Kontrolle!Unterformular_Retourenerfassung_Kontrolle.Form .RecordSource = str_SQL

Exit Sub

Fehler:
MsgBox "Mdl_RKT" & Chr(13) & _
Err.Description
Exit Sub
End Sub


und mit der Tabelle mit dem temporären Datensätzen funktioniert das Ganze recht gut. Also brauchst Dich damit nicht mehr zu befassen.

Danke und Gruß
Oskar

oskar68
12.06.2012, 07:35
das Textfeld im HFO dient hauptsächlich zur manuellen Eingabe der Prod-Nr.
Der Button, mit dem man sich die aktuellsten Retouren ansehen kann ist nur eine Zusatzfunktion und keine Hauptfunktion.