Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Formular - Unterformular

Begonnen von benjamin.grimm, September 05, 2013, 13:30:21

⏪ vorheriges - nächstes ⏩

benjamin.grimm

Hallo zusammen,

ich hab mal ne grundlegende Frage,

ist es möglich, das ich in einem Formular definiere wie ein Unterformular aussieht?

Zwischen Formular und Unterformular besteht eine 1:n Beziehung.

Also im Formular würde man beispielsweise ein Datum eingeben (Vertragsbeginn).

Der Vertrag hat immer eine bestimmte ID.

Dann würde man Anzahl der Jahre auswählen.

Bsp. Vertragsbeginn 12.12.2012

Anzahl der Jahre 5.

Im Unterformular entsteht dann automatisch

ID         Jahr             

1           2012

1           2013

1           2014

1           2015

1           2016

1           2017


Ist so etwas möglich?


DF6GL

#1
Hallo,

Auch grundlegende Antwort:

Zitatist es möglich, das ich in einem Formular definiere wie ein Unterformular aussieht?

Das Aussehen eines Formulares wird in der Form-Entwurfsansicht definiert.  Diese Definition kann auch per VBA erfolgen, indem das Form damit in der Entwurfsansicht geöffnet und bearbeitet wird.

Das ist aber sicherlich nicht das, was Du mit der Frage gemeint hast.

eher dieses:

1)
Füge mit Hilfe einer Anfügeabfrage die Datensätze mit der Jahreszahl und dem richtigen Fremdschlüssel(wert) in die Tabelle ein, auf der das Ufo basiert. Setze danach ein Requery auf das Ufo ab.

oder auch:

2)  
Hänge die DS mittels Schleife über die Jahresanzahl an  das Ufo-Recordset an.


ZitatIm Unterformular entsteht dann automatisch
Solche Vorgängen beziehen sich immer primär auf Tabellen, auch wenn wie in Fall 2) das Form-Recordset herangezogen wird. Das Formular hat nur den eigentlichenZweck, die Daten zu visuliasieren.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

benjamin.grimm

Ok,


kannst du das näher erläutern oder weißt du zufällig eine Beispieldatenbank In der das beschreiben ist?


bahasu

Hi,

Zitat von: benjamin.grimm am September 05, 2013, 13:30:21
ist es möglich, das ich in einem Formular definiere wie ein Unterformular aussieht?

ich intepretiere Dein Anliegen, dass nicht das Aussehen, sondern die Daten im UFO definiert werden.

Anbei im Anhang ein Beispiel.
Im Formular "Vertragsbeginn" gibt es die Möglichkeit, die Anzahl Folge-Jahre einzutragen.
Da nur die Sprache von Jahr war, habe ich diese Folgejahre als Zahl und nicht als Datum angelegt.

Der Button legt die Daten im Unterformular an, sofern es diese noch nicht gab.
Die Vertrags-ID wird im UFO angezeigt, ist dort aber nicht gespeichert. Diese wird per Abfrage aus der Tabelle1 geholt.

Vielleicht kann das eine erste Anregung sein.

Harald

[Anhang gelöscht durch Administrator]
Servus

benjamin.grimm

Ok super.

Dankeschön auf dem kann ich super aufbauen.

Ich muss dann noch, die Kosten berechnen lassen und die Inflationsrate miteinkalkulieren.

Ich lass dich wissen, wie es weiter gegangen ist.

grüße

Benjamin

benjamin.grimm

hey

also das klappt jetzt echt gut.

Danke für den Anstoß.

Ich hab noch eine Frage vom Code her:

Private Sub Befehl32_Click()
    Dim rs As DAO.Recordset, amtPerYear As Long, I As Integer
   
    If Nz(Me.running_time, 0) = 0 Then
        MsgBox "No running time is set"
        Exit Sub
    Else
        Set rs = Me.Untergeordnet12.Form.Recordset
       
        For I = 0 To Me.running_time - 1
            rs.AddNew
            rs!payYear = Year(Me.contract_inception) + I
            amtPerYear = Me.montly_amount * 12
            rs!Amount_per_anno = ((amtPerYear * (Me.interest_rate / 100)) * I) + amtPerYear
            rs!SuWID = Me.SuWID
            rs.Update
        Next
        Set rs = Nothing
    End If
End Sub


Ich hab jetzt den code geschrieben. Sorry das Tool soll jetzt in Englisch sein.

Wie schaffe ich es das er nicht 12 Monate pro Jahr nimmt sondern bei Vertragsbeginn nur die Differenz und bei Vertragsende wieder die Differenz.

Ich hab mir schon irgendwie gedacht sowas

            If Year(Me.contract_inception) = Year(?????) Then
            amtPerYear = Me.montly_amount * (12 - Month(Me.contract_inception))
            If Year(Me.contract_inception) = Year(?????) + Me.running_time Then
            amtPerYear = Me.montly_amount * Month(Me.contract_inception)
           
            Else
            amtPerYear = Me.montly_amount * 12


Ich weiß nicht was ich bei den Fragezeichen rein schreiben soll.

Habt ihr ne Idee oder einen anderen Vorschlag?

Grüße

bahasu

Hi,

Bitte erkläre, wozwischen eine Differenz besteht.

Harald
Servus

benjamin.grimm

Ich geb ja den Vertragsbeginn an (inception date)

und wenn der Vertrag jetzt am 01.09.2013 gemacht wurde. Dann sind ja nur 4 Monate in 2013 angefallen und nicht 12.

Also soll er dort 4*montly_rate rechnen.

Im letzten Jahr sind es ja dann die restlichen 8 Monate, also da soll er ja dann

8* montly_rate rechnen.

Weißt du was ich meine?

bahasu

#8
Hi,

anbei ein ungetesteter Vorschlag:

Private Sub Befehl32_Click()
   Dim rs As DAO.Recordset, amtPerYear As Long, I As Integer
   
   If Nz(Me.running_time, 0) = 0 Then
       MsgBox "No running time is set"
       Exit Sub
   Else
       Set rs = Me.Untergeordnet12.Form.Recordset
       
       For I = 0 To Me.running_time - 1
           rs.AddNew
           rs!payYear = Year(Me.contract_inception) + I

           Select Case I
               Case 0
                   amtPerYear = Me.montly_amount * (13 - Month(Me.contract_inception))     '13 und nicht 12, damit 13 - "Dezember" eine eins ergibt
                   
               Case Me.running_time - 1
                   amtPerYear = Me.montly_amount * (Month(Me.contract_inception) - 1)
                   
               Case Else
                   amtPerYear = Me.montly_amount * 12
           End Select
           
           
           rs!Amount_per_anno = ((amtPerYear * (Me.interest_rate / 100)) * I) + amtPerYear
           rs!SuWID = Me.SuWID
           rs.Update
       Next
       Set rs = Nothing
   End If
End Sub


Üblicherweise werden berechnete Daten aber nicht gespeichert.

Harald


Nachtrag:
Sofern Me.montly_amount immer eine Zahl vom Typ integer bzw. long ist, ist die Deklaration
amtPerYear As Long
ok.

In anderen Fällen sollte die folgende Deklaration besser sein:
amtPerYear As Double
Servus

benjamin.grimm

 :) :) :)


ja super. Vielen Dank für deine Hilfe.

Grüße

Benjamin

benjamin.grimm

Hallo jetzt ist mir nochmal was aufgefallen.


Bei der Berechnung wird immer ein Jahr zu wenig berechnet.

Bsp.

Ich hab nen Vertrag mit ner Laufzeit von 3 Jahren. Er startet am 01.12.2013(Rate 100€, keine Inflation)

Dann wär es ja

Jahr 2013  --> 100€
Jahr 2014  --> 1200€
Jahr 2015  --> 1200€
Jahr 2016  --> 1100€

Momentan berechnet der Code nur


Jahr 2013  --> 100€
Jahr 2014  --> 1200€
Jahr 2015  --> 1200€
´

    Dim rs As DAO.Recordset, amtPerYear As Long, I As Integer
   
    If Nz(Me.running_time, 0) = 0 Then
        MsgBox "No running time is set"
        Exit Sub
    Else
        Set rs = Me.Untergeordnet12.Form.Recordset
       
        For I = 0 To Me.running_time - 1
            rs.AddNew
            rs!payYear = Year(Me.contract_inception) + I
           
        Select Case I
               
        Case 0
                   
        amtPerYear = Me.montly_amount * (13 - Month(Me.contract_inception))
                   
        Case Me.running_time - 1
                   
        amtPerYear = Me.montly_amount * (Month(Me.contract_inception) - 1)
                   
        Case Else
                   
        amtPerYear = Me.montly_amount * 12
           
        End Select
           
           
           
       
        rs!Amount_per_anno = ((amtPerYear * (Me.interest_rate / 100)) * I) + amtPerYear
        rs!SuWID = Me.SuWID
        rs.Update
        Next
        Set rs = Nothing
    End If



Wo ist der Fehler?


bahasu

Hi,

was passiert beim Ersatz von
For I = 0 To Me.running_time - 1
gegen
For I = 0 To Me.running_time


Wenn ok, dann
aus Case Me.running_time - 1 wird
Case Me.running_time

Harald
Servus

benjamin.grimm

Vielen Dank für die schnelle Antwort

Dann klappt es. Super Danke