Neuigkeiten:

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

Mobiles Hauptmenü

Erstellung von Rückzahlungsplänen

Begonnen von Paule, März 13, 2016, 10:12:14

⏪ vorheriges - nächstes ⏩

Paule

Hallo Ekkehard,

ich habe mich gerade nochmal an den VBA-Code gesetzt, komme aber in der zweiten Hälfte nicht mehr weiter.

Ich habe nun mich mal ausprobiert und bin zu folgendem VBA-Code gekommen:

Private Sub AddNewSale_Click()
    DoCmd.GoToRecord , "", acNewRec
    If lstRepaymentPlan = 1 Then
    For i = 1 To 9
    CurrentDb.Execute "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) SELECT SalesID.Value, SalesDate.Value, DatDiff('m', i, 40000), i"
    Next i
    End If
   
End Sub


Die Raten sollen in die Tabelle CF_InstallmentsT eingetragen werden. Der Aufbau dieser Tabelle ist:
- InstallmentID (PK)
- ReferingSale (FK)
- InstallmentDate
- InstallmentSum
- Notes (Wert von 1 zu i --> Nummer der Rate).

Die SalesID kann er sich aus dem Textfeld aus dem Formular ("SalesID") holen. Das Ursprungsdatum ebenso ("SalesDate" und dann eben für jedes neu hinzugefügte Installment einen Monat hinzufügen). Die Summe bleibt immer gleich (40.000) und unter Notes landet dann eine Zahl von 1 zu 9 (also gleich mit i).

Der Code oben funktioniert allerdings (aus nachvollziehbaren Gründen?) noch nicht.

Was muss ich noch verändern?



MaggieMay

#16
Hallo,

ZitatDie SalesID kann er sich aus dem Textfeld aus dem Formular ("SalesID") holen.
in diesem Fall musst du eine Werteliste übergeben:

Dim strSQL As String
strSQL = "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) " & _
        " Values(" & Me!SalesID & ", " & Format(Me!SalesDate, "\#yyyy\/mm\/dd\#") & ", " & DateDiff("m", i, 40000) & ", '" & i & "')"
CurrentDb.Execute strSQL, dbFailOnError


Aber was bezweckst du eigentlich mit diesem Ausdruck:
DatDiff('m', i, 40000)

Könnte es sein, dass die Werteliste so aussehen sollte:
        " Values(" & Me!SalesID & ", " & Format(DateDiff("m", i-1, Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, '" & i & "')"
Freundliche Grüße
MaggieMay

Paule

Zitat von: MaggieMay am Mai 31, 2016, 10:37:50

Könnte es sein, dass die Werteliste so aussehen sollte:
        " Values(" & Me!SalesID & ", " & Format(DateDiff("m", i-1, Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, '" & i & "')"

Hallo, vielen Dank schon mal.
Ja, das wird es wohl eher treffen.
Eine Frage noch zum DateDiff: Ich habe in dem Beispiel ja 9 Ratenzahlungen.
Und er soll mir dann also 9 Datensätze erstellen und es ändert sich ja nur das Datum. Bei der ersten Ratenzahlung wäre i=1 und dann soll er also vom Sales Date noch einen Monat drauf rechnen. Bei der zweiten Zahlungen i=2 dann eben zwei. Jetzt ist es minus? Das wird mir nicht ganz klar.

Außerdem fehlt ja jetzt noch die Info, dass wir i von 1 bis 9 läuft, oder?

Ich hatte es jetzt erstmal so versucht wie mit deinem Code. Da kommt bei mir Syntaxfehler bei der INSERT INTO-Methode und die letzte Zeile wird gelb markiert. Also die Execute-Zeile.

Woran kann das liegen?



MaggieMay

ZitatBei der ersten Ratenzahlung wäre i=1 und dann soll er also vom Sales Date noch einen Monat drauf rechnen.
Ich dachte, es sollte bei SalesDate beginnen und erst ab dem 2. Datensatz aufaddieren, daher die -1.

ZitatAußerdem fehlt ja jetzt noch die Info, dass wir i von 1 bis 9 läuft, oder?
Die Schleife sollte beibehalten werden. Ich zeigte nur den Code, der zu ändern wäre.

ZitatDa kommt bei mir Syntaxfehler bei der INSERT INTO-Methode
Dann zeige bitte deine Version des Codes. Oder den generierten SQL-String.
Freundliche Grüße
MaggieMay

Paule

Ok, mit der Schleife drinnen ist der Fehler woanders zu finden:

Private Sub AddNewSale_Click()
    DoCmd.GoToRecord , "", acNewRec
    If lstRepaymentPlan = 1 Then
    For i = 1 To 9
    Dim strSQL As String
    strSQL = "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) " & _
         " Values(" & Me!SalesID & ", " & Format(DateDiff("m", '"i"', Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, '" & i & "')"
    CurrentDb.Execute strSQL, dbFailOnError
    Next i
    End If


Gelb markiert ist nun die Zeile "Private Sub...".
Rot markiert sind die beiden Zeilen ab "strSQL..."


MaggieMay

Welche Fehlermeldungen werden dir angezeigt? Lässt sich damit nichts anfangen?

Und was hat dich dazu veranlasst, den Code an dieser Stelle zu ändern?
ZitatFormat(DateDiff("m", '"i"', Me!SalesDate)

Was für einen Datentyp hat das Feld "Notes"? Ist es kein Text, so lass die Hochkommata weg.
Und am Ende fehlt natürlich das "End Sub".

Aaber...
Was hast du mit dem GotoRecord am Anfang im Sinn?
Dadurch verlierst du doch den aktuellen Datensatz und somit die Steuerelementinhalte!

BTW:
Deklarationen gehören an den Anfang der Prozedur.
Freundliche Grüße
MaggieMay

Paule

Die Hochkommata sind weg. "Notes" ist vom Felddatentyp "Zahl".
Ich habe das "-1" weggelassen, weil er ja wie oben beschrieben soll je nach Rückzahlung immer +1 Monat auf das Sales Datum drauf rechnen soll.

Das End Sub ist vorhanden, ich hab es lediglich vergessen zu kopieren.

Angezeigt wird mir ein Fehler beim Kompilieren: - Syntaxfehler. Rot markiert wird die SQL-Zeile.

Mit dem GoToRecord wollte ich ihm sagen, dass er nach dem Klick auf dem Button zu einem neuen Datensatz springen soll.

Der Button befindet sich in dem Formular "AddSales" und wenn ich ein Sales angelegt habe, möchte ich anschließend ja eventuell noch einen weiteren Sale hinzufügen. 

Damit speichere ich also die Sales Daten in der Sales Tabelle und gleichzeitig soll er mir eben die Zahlungstermine zu diesem Sale in der Tabelle CF_Installments abspeichern.

Was genau meinst du mit Deklarationen?

MaggieMay

#22
ZitatIch habe das "-1" weggelassen, weil [...]
Du hast nicht nur -1 weggelassen, sondern i in Hochkommata und Gänsefüßchen gesetzt.

ZitatMit dem GoToRecord wollte ich ihm sagen, dass er nach dem Klick auf dem Button zu einem neuen Datensatz springen soll.
Das ist mir schon klar, aber dann verlässt du doch den aktuellen Datensatz und woher sollen dann die Daten für die Anfügeabfrage genommen werden?

ZitatWas genau meinst du mit Deklarationen?
Zum Beispiel die DIM-Anweisung.

Vielleicht wäre dies die bessere Code-Folge:
Private Sub AddNewSale_Click()
    Dim strSQL As String
    Me.Dirty = False    ' speichern
    If Me!lstRepaymentPlan = 1 Then
        For i = 1 To 9
            strSQL = "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) " & _
                       "Values(" & Me!SalesID & ", " & Format(DateDiff("m", i, Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, " & i & ")"
            CurrentDb.Execute strSQL, dbFailOnError
        Next i
    End If
    DoCmd.GoToRecord , "", acNewRec
End Sub


Hier fehlt dann nur noch eine Fehlerbehandlung.
Freundliche Grüße
MaggieMay

Paule

Ich habe es in allen Varianten mit Hochkommate+Gänsefüße oder ohne oder nur eines davon ausprobiert.

Ok, ich habe nun das GoToRecord zum Schluss gestellt. Und die DIM-Anweisung am Anfang. Jetzt sieht es so aus:

Private Sub AddNewSale_Click()
   
    Dim strSQL As String
    If lstRepaymentPlan = 1 Then
    For i = 1 To 9
    strSQL = "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) " & " Values(" & Me!SalesID & ", " & Format(DateDiff("m", "i", Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, '" & i & "')"
    CurrentDb.Execute strSQL, dbFailOnError
    Next i
    End If
    DoCmd.GoToRecord , "", acNewRec
End Sub


Jetzt meint er als Fehler "Laufzeitfehler 13 - Typen unverträglich".
Und markiert wieder die sql-Zeile.

In CF_Installments sind
- ReferingSale = Zahl
- InstallmentDate = Datum/Uhrzeit
- InstallmentSum = Zahl
- Notes = Zahl

Im AddSales-Formular sind:
- SalesID und SalesDate Textfelder
- SalesDate hat das Formal Datum, kurz
- SalesID ist PK.

Beaker s.a.

Hallo Paul,
1. In deinem Modul fehlt das "Option Explizit" im Modulkopf.
2. Deshalb fällt es VBA nicht auf, dass da ein Dim i As Integer fehlt.
3. Eben weil i ein Integer ist müssen die "" da weg.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Paule

Hi Ekkehard,

ah ok, ich bin jetzt also bei folgendem Code gelandet:

Private Sub AddNewSale_Click()
   
    Dim strSQL As String
    Dim i As Integer
    If lstRepaymentPlan = 1 Then
    For i = 1 To 9
    strSQL = "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) " & " Values(" & Me!SalesID & ", " & Format(DateDiff("m", i, Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, [b]'" & i & "'[/b])"
    CurrentDb.Execute strSQL, dbFailOnError
    Next i
    End If
    DoCmd.GoToRecord , "", acNewRec
End Sub


Das Option Exlicit ist eingefügt.

Jetzt sagt er mir: Fehler beim Kompilieren - Variable nicht definiert.

MaggieMay

ZitatJetzt meint er als Fehler "Laufzeitfehler 13 - Typen unverträglich".
Schau dir meinen Code-Vorschlag an. Du hast die Hochkommata bei Notes (um "i") nicht entfernt.

ZitatJetzt sagt er mir: Fehler beim Kompilieren - Variable nicht definiert.
Er nennt (oder zeigt) dir aber auch den Namen der Variablen, warum sagst du das nicht gleich dazu?

Freundliche Grüße
MaggieMay

Paule

Also ich habe alle Hochkommata in meinen Augen entfernt.

    strSQL = "INSERT INTO CF_InstallmentsT (ReferingSale, InstallmentDate, InstallmentSum, Notes) " & " Values(" & Me!SalesID & ", " & Format(DateDiff("m", i, Me!SalesDate), "\#yyyy\/mm\/dd\#") & ", 40000, " & i & ")"

Bei dem letzten "i" war ich mir nicht sicher, deswegen wollte ich es fett markieren.

Er zeigt mir lediglich an "Fehler beim Kompilieren - Variable nicht definiert". Mehr nicht.
Im VBA-Editor hinterlegt er dann erst dbFailOnError blau, aber das verschwindet sofort, wenn ich woanders hinklicke. Außerdem ist das ja keine Variable (?).

MaggieMay

Nein, dbFailOnError ist eine Konstante, aber das kann Access nicht wissen, wenn es sie nicht kennt. ;-)
Du kannst statt dessen den Direktwert 128 schreiben. Vermutlich fehlt dir der Verweis auf die DAO-Bibliothek, aber wenn du sie bisher nicht gebraucht hast, geht es halt auch so.

Du sagtest Notes wäre vom Typ Zahl, also müssen die markierten Hochkommata weggelassen werden.
Freundliche Grüße
MaggieMay

Paule

#29
Ah ok,

vielen Dank! Jetzt funktioniert das einfügen der Datensätze auf jeden Fall schon mal.

Die Verwirrung war ein wenig bei den Datumsangaben. Ich muss natürlich DateAdd statt DateDiff verwenden. Und nun klappt es wunderbar.

Das ist so cool, das spart so viel Zeit! :)