Hallo mal wieder
Hab da ein Problem mit dem Speichern bzw. ändern eines Datensatzes
Durch das klicken in einen Rahmen mit 2 Options Felder möchte ich das Feld ArtMwstIDRef
des aktuellen Datensatzes Im Recordset ändern
das Feld wird aber nicht im Formular aufgezeigt Sonden nur in berechneter form in Anhänglichkeit
mit einem anderen Rahmen angezeigt
Wodurch sich das Speichern des Wertes von einer If Anweisung anhänglich macht
Durch die untere Prozedur schreibe ich es aber in alle Felder einer spalte und komme nicht ganz weiter wie ich das einzelne Feld der aktuellen Satzes ansprechen kann
Die If Anweisung müsste ich dann wahrscheinlich in eine Variable setzen die ich dann in den With block einsetzen?
Wäre nett wenn mir jemand einen Tipp geben könnte Gruß Frank
(http://s7.directupload.net/images/111121/temp/cpywi6l8.jpg) (http://s7.directupload.net/file/d/2715/cpywi6l8_jpg.htm)
Private Sub Rahmen2_Click() ' MWSt geändert
Call speichern
Dim db As Database
Dim rst As Recordset
On Error GoTo Fehler
Set db = CurrentDb
Set rst = db.OpenRecordset("TblArtikel", dbOpenDynaset)
With rst
Do Until .EOF
.Edit
If Rahmen2.Value = 1 Then
rst!ArtMwstIDRef = mwstB
Else
rst!ArtMwstIDRef = mwstA
End If
.Update
.MoveNext
Loop
.Close
End With
Call anzeigen
Exit Sub
Fehler:
MsgBox Err.Number & " " & Err.Description
End Sub
Hallo,
warum bindest Du die Optionsgruppen nicht einfach an die Tabellenfelder?
Dann kannst Du Dir den VBA Code vollständig sparen, geht dann alles automatisch.
'n Abend !
Das Bild ist nur ein kleiner Ausschnitt des Formulare der zum eingeben des Preises dient
Den Preis speichere ich nur in netto, die anderen Felder werden dann in der Tabelle berechnet
Mwst Betrag , preis pro Stück , pro VPE usw.
Wenn ich sagen wir 7% und Brutto einstelle und in das Feld 350 eingebe wird beim Speichern der
Betrag in netto umgerechnet und in das Feld geschrieben Plus alle anderen Felder im Formular die Angaben zum Artikel enthalten
Das passiert aber in der Prozedur "Speichern" die ja dann den gleichen Code wie oben enthält
Nur mit allen Feldern der Tabelle
Ich hab das schon mit einem gebundenen Formular probiert aber bei jeden klick hat es mir die Zahlen in der Tabelle weiter verrechnet und hab dann nach tagen aufgegeben aber egal bin dann auf die Idee gekommen dass mit einem ungebundenen Formular zu machen
Die Idee habe ich aus Access Programmieren nur das es dort über ADO und Datenbank Datei
Lauft
Gruß Frank
Hallo,
nimm ein gebundenes Formular alles andere ist Krampf.
Außerdem solltest Du nicht den errechneten Wert in der Tabelle speichern, sondern den Optionswert. Berechnet wird dann in einer Abfrage bei Bedarf.
Auch ein Speichern Button wird dann völlig überflüssig.
hallo und danke !
Den brutto möchte ich nicht speichern lediglich ihn umrechnen lassen zum Speicher in netto damit ich es nicht von Hand machen muss da ich Artikel auch kaufe die nur in brutto angegeben sind
Das andere werde ich dann in eine Abfrage ändern gute Idee
Gruß Frank
Hallo,
erstelle ein brauchbares Beispiel, mit Formular und Tabelle in einer DB, nach Access2003 konvertiert, weil A2007/10 haben noch nicht so viele.
Hallo,
"Durch die untere Prozedur schreibe ich es aber in alle Felder einer spalte und komme nicht ganz weiter wie ich das einzelne Feld der aktuellen Satzes ansprechen kann "
wirf die Prozedur weg und erstelle ein an das Tabellenfeld "Nettobetrag" gebundenes und unsichtbar eingestelltes Formtextfeld.
Dieses Feld wird über eine Funktion, die die Berechnungen entspr. den sonstigen Einstellungen im Form durchführt, mit dem Netto-Wert gefüllt.
Die Funktion wird überall dort aufgerufen, wo es nötig ist (z. B. Ereignisse Form_Current, Rahmen1_Afterupdate, etc)
Hallo danke für deine Antwort und die Hilfe
Hab das Beispiel fertig ist aber noch in der ursprünglichen Idee notdürftig erstellt
Da ich mit dem "Private Sub Rahmen2_Click" und dem "Private Sub speichern"
Probleme Habe wie oben beschrieben
Dort wo die Buttons sind sollte eigentlich das Produktbild sein
Zur Beispiels Db:
Klickte ich auf das ändern der Mwst sollte diese in der Tabelle geändert werden bzw. das einzelne Feld des aktuellen Datensatzes im oder über das Recordset was aber zum oben beschriebenen Problem führt und damit die ganze sparte der Tabelle geändert wird
Beim Navigieren sollte der Sub speichern angesprochen werden der dann die alle Änderungen in der Tabelle speichert was aber das gleiche Problem aufwirft da ich dort die gleiche Struktur im Code habe
Der Button Refrech ist nur zur Demo enthalten um die fehler rückgängich zu machen er löscht den Inhalt der TblArtikel und stellt die ursprünglichen Daten der Tabelle wieder her
( Notdürftig fürs Demo zusammengestellt )
Hier ist der original Code den ich als Vorlage hatte:
Private Sub speichern()
If rs.RecordCount > 0 Then
' einfache Felder in DB schreiben ----------------
rs!Bezeichnung = Text1.Value
' berechnete Felder in DB schreiben ---------------
' Brutto/Netto:
If Rahmen1.Value = 1 Then ' Bruttowert in Netto umrechnen
rs!Netto = Text2.Value / (1 + rs!MWSt)
Else ' Netto direkt abspeichern
rs!Netto = Text2.Value
End If
End If
End Sub
Private Sub Rahmen2_Click() ' MWStgeändert
speichern
If Rahmen2.Value = 1 Then
rs!MWSt = mwstB
Else
rs!MWSt = mwstA
End If
anzeigen
End Sub
Ich wollte es so umbauen :
Private Sub speichern()
Dim db As Database
Dim rst As Recordset
On Error GoTo Fehler
Set db = CurrentDb
Set rst = db.OpenRecordset("TblArtikel", dbOpenDynaset)
With rst
Do Until .EOF
.Edit
!ArtName = TxtArtName.Value
If Rahmen1.Value = 1 Then ' Bruttowert in Netto umrechnen
rst!ArtNetto = Text2.Value / (1 + rst!ArtMwstIDRef)
Else ' Netto direkt abspeichern
rst!ArtNetto = Text2.Value
End If
.Update
.MoveNext
Loop
.Close
End With
Exit Sub
Fehler:
MsgBox Err.Number & " " & Err.Description
End Sub
Private Sub Rahmen2_Click() ' MWStgeändert
Call speichern
Dim db As Database
Dim rst As Recordset
On Error GoTo Fehler
Set db = CurrentDb
Set rst = db.OpenRecordset("TblArtikel", dbOpenDynaset)
With rst
Do Until .EOF
.Edit
If Rahmen2.Value = 1 Then
rst!ArtMwstIDRef = mwstB
Else
rst!ArtMwstIDRef = mwstA
End If
.Update
.MoveNext
Loop
.Close
End With
anzeigen
Exit Sub
Fehler:
MsgBox Err.Number & " " & Err.Description
End Sub
Gruß frank Und danke für die Hilfe !
Beispiel entfernt : Ist jetzt am Ende des Beitrags
Hallo,
hast Du mein Posting gelesen?
Ich verstehe ehrlich gesagt Deine Vorstellung über das neue Konzept nicht...
"Ich wollte es so umbauen :"
Warum? und wieso auf diese völlig falsche Vorgehensweise.?
Hallo habe deine Post erst nach dem einstellen gesehen
Ich habe das Original in eine frühere Version umgewandelt
Und als Beispiel angehängt
Ich dachte man könnte die Version einfach für meine Zwecke umbauen
Ich habe in meinen Buch stehen das ich durch das Erstellen der Prozedur den aktuellen Datensatz modifizieren kann was aber leider nicht geht
[Anhang gelöscht durch Administrator]
Hallo,
mhmm, was ist denn der eigentliche Grund/Sinn der dahinterliegenden DB? Nur eine Übung an ungebundenen Formularen und ADO-Datenzugriffen? Oder soll eine funktionierende Anwendung in Sicht auf Bestell- oder Rechnungsvorgänge erstellt/erweitert werden.
Das Form in der Beispiel-DB dürfte aus einer komplexeren Anwendung "herausgerissen" worden sein.
Ich rate , wie vorher (auch von Klaus) gesagt, zu einem gebundenen Formular und der Berechung des Nettowertes nach der angedeuteter Vorgehensweise.
Hallo
Danke für die Antwort
Das ADO Beispiel ist im Access Programmierrezepte 2010 Seite 265
,,Eine intelligente Eingabemaske unter ADO Programmieren" zu finden
Der Gedanke der hinter meiner Umsetzung steckt ist der das ich in dem Formular nur Artikel
In die DB aufgenommen werden oder er preis geändert wird (mal abgesehen von der Preis Änderungshistorie)
Gleichzeitig wollte ich die die Parameter abhängigen zahlen direkt anzeigen
Beispiel wäre:
Mitarbeiter geht zum Baumarkt und kauft eine Flex
Macht dann Formular auf gibt 50€ ein wählt 19% brutto wählt dann die anderen Parameter
Gespeichert wird automatisch den er weiß nur wie er den PC einschaltet und dort hin kommt
Sozusagen eine Lösung für dummes
Gruß frank
Hallo,
sprich, Du möchtest ein Kassenbuch erstellen...
Im Downloadbereich gibt es ein Beispiel dafür. Das könnte man für Eingabe von Netto oder Brutto- Betrag durchaus aufbohren.
Hallo,
warum mutest Du Deinen helfern eine getrennte DB zu?
Erstelle eine Beispieldb mit Tabelle und dem Formular.
Solche Beispieldbs sehe ich mir gar nicht erst an, da habe ich ja erst mal Arbeit, dass die DB läuft.
Ich würde sowohl den Paramter für die Mwst als auch den Parameter für Brutto oder Netto in der Tabelle speichern und nur in einer Abfrage rechnen.
Hi !
Ich möchte kein Kassenbuch das kommt an anderer stelle
Ist schwer zu erklären
Der Betrieb ist eine Bäckerei im Reisegewerbe zu zusagen wir gehen auf mittelaltermärkte Festival usw. und backen vor Ort schwäbische Backwaren im Holzofen in ganz Deutschland
Der einzige Unterschied zu anderen im dem Gewerbe ist das wir gelernte Profis sind und meine Bäcker teilweise keine PC Kenner
Waren werden teils aus dem Lager aber Großteiles frisch Vorort bezogen und auf dem Laptop in die DB eingetragen und in die Buchhaltung als Bericht gesendet
Diese wird im Base mit Lexware finanziell Office verarbeitet
Dieses Programm ist für einen Leien gar nicht zu bedienen (Grundkurs bei uns vor Ort 3200€)
Die "Artikel mit Brutto Netto Demo" Beispiel Datei müsste doch laufen ist im 2000er Format
Für die MwSt. habe ich eine Lösung gefunden
Private Sub Rahmen2_Click() ' MWStgeändert
Call speichern
Dim db As Database
Dim rst As Recordset
On Error GoTo Fehler
Set db = CurrentDb
Set rst = db.OpenRecordset("TblArtikel", dbOpenDynaset)
With rst
.FindFirst "ArtID = " & Me.TxtArtID
.Edit
If Rahmen2.Value = 1 Then
!ArtMwstIDRef = mwstB
Else
!ArtMwstIDRef = mwstA
End If
.Update
End With
anzeigen
Exit Sub
Fehler:
MsgBox Err.Number & " " & Err.Description
End Sub
Gruß Frank
Hallo,
nach deinen neuen Ausführungen würde ich es erst recht so machen, wie bereits vorgeschlagen:
Zitat von: MzKlMu am November 22, 2011, 14:52:21Ich würde sowohl den Paramter für die Mwst als auch den Parameter für Brutto oder Netto in der Tabelle speichern und nur in einer Abfrage rechnen.
Wenn dann das Formular an die Tabelle gebunden wird, brauchst Du keine Zeile VBA und das Formular ist immer aktuell, automatisch.
Hallo !
Das mit den gebundenen Formularen habe ich ja bei anderen Tabellen standardmäßig so gemacht!
Was mich aber bei der Lösung aber stört ist das beim normalen schlissen oder weiterblättern im Formular immer der Datensatz gespeichert wird wenn der Benutzer keinen Undo Botton hat
ich wollte einfach bei der Lösung hier etwas mehr Performance und Dynamics ins Formular bringen sonst wär es ja einfach
Zu den berechneten Feldern möchte ich euch eure Meinung nicht absprechen sonst wäre ich ja nicht hier ich bin ja über jede Hilfe froh die ich bekomme!
Ich habe bei der Schulung zu Access 2010 von Lorenz Hölscher gesehen das man die zu berechneten Felder die nach standardmäßig benötigt gleich in der Tabelle berechnen lässt damit man es jederzeit ohne großen Aufwand abfragen kann ( Geht im Beispiel , aber wenn die Tabelle in 2010 kopiert wird geht's aber darum geht's hier ja nicht )
Der Grund warum ich den Beitrag eröffnet habe war der das ich im Netz unter dem such Kriterium
Nichts Komplettes gefunden habe und möchte hier an dieser Stelle mal meine endgültige Lösung posten
Zur Beispiels DB:
Der neue Datensatz oder der eine Änderung wird immer verworfen wenn nicht gespeichert wird
Ein Fach mal gnadenlos durch testen
DB mit Shirt starten wenn in sie von innen anschauen wollt
Viel Spaß damit und Gruß an alle die etwas damit anfangen können besonders an MzKlMu und DF6GL
Frank
Option Compare Database
Option Explicit
Private newFlag As Boolean ' ist True bei neuem Datensatz
-----------------------------------------------------------------------------------------------------------
Private Sub Form_Load()
Set db = CurrentDb()
Set rst = db.OpenRecordset("TblArtikel", dbOpenDynaset)
newFlag = False
End Sub
-----------------------------------------------------------------------------------------------------------
Private Sub CmdNeu_Click()
If rst.Updatable And rst.EditMode = dbEditNone Then
newFlag = True
Me!TxtArtID.Value = "" ' maskenabhängig
Me!TxtArtName.Value = ""
......
......
......
End If
Me!CmdSpeichern.Visible = False
End Sub
-----------------------------------------------------------------------------------------------------------
Private Sub speichern()
'On Error GoTo Fehler
If rst.Updatable And rst.EditMode = dbEditNone Then
If newFlag Then rst.AddNew Else rst.Edit
If Me.TxtArtName.Value <> "" Then rst!ArtName = Me.TxtArtName
If Me.CboArtLiefIDRef.Value <> "" Then rst!ArtLiefIDRef = Me.CboArtLiefIDRef
If Me.TxtArtLifArtNr.Value <> "" Then rst!ArtLifArtNr = Me.TxtArtLifArtNr
If Me.CboArtKatIDRef.Value <> "" Then rst!ArtKatIDRef = Me.CboArtKatIDRef
If Me.CboArtUntKatIDRef.Value <> "" Then rst!ArtUntKatIDRef = Me.CboArtUntKatIDRef
If Me.TxtArtVPEinheit.Value <> "" Then rst!ArtVPEinheit = Me.TxtArtVPEinheit
If Me.CboArtEinheitenIDRef.Value <> "" Then rst!ArtEinheitenIDRef = Me.CboArtEinheitenIDRef
If Me.TxtArtPreisstaffelung.Value <> "" Then rst!ArtPreisstaffelung = Me.TxtArtPreisstaffelung
If Me.CboArtStaffelungPreisIDRef.Value <> "" Then rst!ArtStaffelungPreisIDRef = Me.CboArtStaffelungPreisIDRef
If Rahmen1.Value = 1 Then ' Bruttowert in Netto umrechnen
rst!ArtNetto = Me.Text2.Value / (1 + rst!ArtMwstIDRef)
Else
rst!ArtNetto = Me.Text2.Value ' Netto direkt abspeichern
End If
If Rahmen2.Value = 1 Then ' Mwst einstellung speichern
rst!ArtMwstIDRef = mwstB
Else
rst!ArtMwstIDRef = mwstA
End If
rst.Update
Me!IstArtikel.Requery
If newFlag = True Then rst.MoveLast
Call anzeigen
Else
MsgBox "Kein Editieren möglich!"
End If
newFlag = False
Me!CboArtUntKatIDRef.RowSource = "SELECT TlbUntKategorie.UntKatID, TlbUntKategorie.UntKatName FROM TlbUntKategorie ORDER BY TlbUntKategorie.UntKatName;"
Exit Sub
Fehler:
MsgBox Err.Number & " " & Err.Description
End Sub
-----------------------------------------------------------------------------------------------------------
Private Sub Rahmen1_Click() ' Brutto-/Netto Rahmen
If newFlag = True Then Exit Sub
If Rahmen1.Value = 1 Then
Bezeichnungsfeld4.Caption = "Brutto"
Else
Bezeichnungsfeld4.Caption = "Netto"
End If
Call anzeigen
Call Speichern_One
End Sub
-----------------------------------------------------------------------------------------------------------
Private Sub Rahmen2_Click() 'Mwst Rahmen
If newFlag = True Then Exit Sub
Call speichern
Call Speichern_One
End Sub
-----------------------------------------------------------------------------------------------------------
Private Sub CmdLoeschen_Click()
If rst.Updatable And rst.EditMode = dbEditNone Then
If MsgBox("Wollen Sie den Datensatz wirklich löschen ?", vbYesNo) = vbYes Then
rst.Delete
rst.MoveNext ' zum nächsten Datensatz ...
If rst.EOF And Not rst.BOF Then rst.MoveLast ' nur wenn Tabelle nicht leer ist
Me!IstArtikel.Requery
Call anzeigen
End If
Else
MsgBox "Datensatz kann momentan nicht gelöscht werden!"
End If
End Sub
-----------------------------------------------------------------------------------------------------------
Private Sub Form_Unload(Cancel As Integer)
Set rst = Nothing
End Sub
Produktbild in neuem Beispiel übers Recordset mit eingebaut
[Anhang gelöscht durch Administrator]