Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Frank77 am November 21, 2011, 22:19:54

Titel: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 21, 2011, 22:19:54
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

Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: MzKlMu am November 21, 2011, 23:00:46
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.
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 21, 2011, 23:27:28
'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
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: MzKlMu am November 21, 2011, 23:35:11
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.
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 21, 2011, 23:48:18
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

Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: MzKlMu am November 22, 2011, 08:32:21
Hallo,
erstelle ein brauchbares Beispiel, mit Formular und Tabelle in einer DB, nach Access2003 konvertiert, weil A2007/10 haben noch nicht so viele.
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: DF6GL am November 22, 2011, 08:59:16
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)
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 22, 2011, 11:49:05
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
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: DF6GL am November 22, 2011, 12:10:43
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.?

Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 22, 2011, 12:33:17
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]
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: DF6GL am November 22, 2011, 13:31:55
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.

Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 22, 2011, 14:23:54
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
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: DF6GL am November 22, 2011, 14:49:14
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.
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: MzKlMu am November 22, 2011, 14:52:21
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.
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 22, 2011, 15:40:05
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
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: MzKlMu am November 22, 2011, 16:03:40
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.
Titel: Re: Einzelnen Datensatz in im Recordset ändern / If Anweisung Im With Block
Beitrag von: Frank77 am November 24, 2011, 21:50:45
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]