none
Vortrag naechster Datensatz

    Frage

  • Hallo Zusammen,

    Ich arbeite mit Office 2010 und habe folgendes Problem.

    Ich habe in einem Unterformular mehrere berechnete Felder die im
    Feld 'Balance' saldiert werden.
    Die zugrunde liegende Tabelle besitzt einen Hauptschluessel (AutoWert)
    mit dem Namen: AccountID und einen Zweitschluessel 'CrewID' (Hauptschluessel
    der anderen Tabelle).

    Der Betrag aus dem Feld 'Balance' soll automatisch in das ungebundene Feld
    'Saldo' beim oeffnen eines neuen Datensatzes uebernommen werden.

    Ich habe es versucht mit dem Code und 'DLookup()' der unter
       http://www.microsoft.com/communities/forums/default.mspx

    zu finden ist.

    Da die 'AccountID' in abhaengigkeit zur 'CrewID' ist, faengt die 'AccountID'
    mit 1 bei bei jeder 'CrewID' an und somit existiert dann noch kein 'Previous
    Record' und das Feld 'Saldo' sollte den Wert '0,00' erhalten.

    Der Name des Unterformulares ist 'frmAccountsU'.
    Die Felder 'Balance' und 'Saldo' sind ungebundene Felder.

    Kann mir hier jemand weiter helfen?

    Dienstag, 16. November 2010 11:49

Antworten

  • Hallo,

    Ronald01 wrote:

    Ich habe in einem Unterformular mehrere berechnete Felder die im
    Feld 'Balance' saldiert werden.
    [...]

    Kann es sein, dass du sowas suchst? http://www.donkarl.com?FAQ3.11

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Dienstag, 16. November 2010 12:29
    Moderator
  • Karl Donaubauer wrote:

    Ronald01 wrote:


    'Saldo' = 'Balance' (des Vormonats)
    'Balance' = 'Balance des Vormonats' + 'Verschiedene Einnahmen'

    ...

    Aber ich glaub wir kommen so nicht weiter.

    Noch als Ergänzung, weil du durch den gefundenen Code
    vielleicht einfach in einer Sackgasse gelandet bist:

    Normalerweise löst man Saldo-Geschichten nicht per Hüpferei in den
    Datensätzen sondern durch die Berechnung von Laufenden Summen
    z.B. mithilfe der DSum-Funktion.
    Den diesbez. Link hast du ja schon länger von Peter.
    Hast du dir das mal angesehen?

    -- 
    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Mittwoch, 17. November 2010 11:55

Alle Antworten

  • hi Ronald,

    Warum musst du einen berechneten Wert speichern?
    Warum hat das etwas mit einem 'Previous Record' zu tun?

    Wenn deine Berechnung korrekt ist, liefert sie für den ersten Datensatz - wenn wir hier von einer Art laufenden Summe sprechen - NULL zurück. Das kannst du leicht mit Nz(deineBerechnung, 0) umwandeln.

    Ansonsten ist deine Beschreibung doch etwas wage und der Link ist auch nicht sonderlich erhellend.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Dienstag, 16. November 2010 11:55
    Moderator
  • Hallo Stefan,

    erst einmal vielen Dank fuer die schnelle Reaktion.

    Der berechnete Wert wird NICHT gespeichert, die Felder 'Balance' und 'Saldo' sind ungebundene Felder.

    Bein ersten Datensatz muss der Betrag unter 'Saldo' zwangslaeufig '0,00' sein da es keinen Vortrag vom

    letzten Monat, sprich 'Balance' gibt.

    Den Link habe ich nur angegeben da er meines erachtens der Loesung meines Problems am naechsten

    kommt.

    Dienstag, 16. November 2010 12:12
  • Ronald01 wrote:

    ...
    Den Link habe ich nur angegeben da er meines erachtens der Loesung
    meines Problems am naechsten

    Stefan bezieht sich darauf, dass dein Link nur auf die Foren-Übersichtsseite
    führt, nicht auf einen Artikel, der etwas zur Problembeschreibung beitragen würde.

    Das wäre aber gut, denn sonst versteht man das Problem kaum und müsstest
    du mehr dazu schreiben. Ausdrücke, Formeln etc.


    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Dienstag, 16. November 2010 12:26
  • Hallo,

    Ronald01 wrote:

    Ich habe in einem Unterformular mehrere berechnete Felder die im
    Feld 'Balance' saldiert werden.
    [...]

    Kann es sein, dass du sowas suchst? http://www.donkarl.com?FAQ3.11

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Dienstag, 16. November 2010 12:29
    Moderator
  • Hallo Karl, Hallo Peter,

    oder: Hallo Houston wir haben ein Problem bzw. wie erklaert ein Leihe einem Profi sein Problem.

    Ich habe versucht mein Problem mit folgendem Modul zu loesen:

    '*************************************************************
    ' FUNCTION: PrevRecVal()
    ' PURPOSE: Retrieve a value from a field in the previous form
    '   record.
    ' PARAMETERS:
    ' F  - The form from which to get the previous value.
    ' KeyName - The name of the form's unique key field.
    ' KeyValue - The current record's key value.
    ' FieldNameToGet - The name of the field in the previous
    '      record from which to retrieve the value.
    ' RETURNS: The value in the field FieldNameToGet from the
    '   previous form record.
    ' EXAMPLE:
    ' =PrevRecVal(Form,"ID",[ID],"OdometerReading")
    '**************************************************************
    Function PrevRecVal(F As Form, KeyName As String, KeyValue, _
    FieldNameToGet As String)
     Dim RS As DAO.Recordset
    
    On Error GoTo Err_PrevRecVal
    
     ' The default value is zero.
     PrevRecVal = 0
    
     ' Get the form recordset.
     Set RS = F.RecordsetClone
    
     ' Find the current record.
     Select Case RS.Fields(KeyName).Type
      ' Find using numeric data type key value?
      Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
      DB_DOUBLE, DB_BYTE
       RS.FindFirst "[" & KeyName & "] = " & KeyValue
      ' Find using date data type key value?
      Case DB_DATE
       RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
      'Find using text data type key value?
      Case DB_TEXT
       RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
      Case Else
       MsgBox "ERROR: Invalid key field data type!"
       Exit Function
     End Select
     
    ' Move to the previous record.
     RS.MovePrevious
    
     ' Return the result.
     PrevRecVal = RS(FieldNameToGet)
    
    Bye_PrevRecVal:
     Exit Function
    Err_PrevRecVal:
     Resume Bye_PrevRecVal
    End Function
    

    Das ungebundene Feld 'Saldo' enthaelt folgenden Eintrag unter 'Steuerelementinhalt':

           =PrevRecVal("frmAccountsU";"AccountsID";[AccountsID];"Balance")

    Hier noch eine kurze Erklaerung:

        Das 'Saldo' des aktuellen Datensatzes ist gleich dem 'Balance' des
        vorherigen Datensatzes.
        D.h., dass das 'Saldo' des ersten Datensatzes gleich Null (0,00) ist
        bzw. sein muss, da kein 'Balance' eines vorherigen Datensatzes existiert.

    Gruss

    Ronald

    Dienstag, 16. November 2010 13:20
  • Ronald01 wrote:

    ...
    Ich habe versucht mein Problem mit folgendem Modul zu loesen:
    ...
    Function PrevRecVal(F As Form, KeyName As String, KeyValue, _
    ...
    RS.MovePrevious
    ...
    PrevRecVal = RS(FieldNameToGet)
    ...
    Das ungebundene Feld 'Saldo' enthaelt folgenden Eintrag unter
    'Steuerelementinhalt':

    =PrevRecVal("frmAccountsU";"AccountsID";[AccountsID];"Balance")
    ...

    Falls ich dein OP richtig verstehe, dann ist "Balance" bereits ein
    berechnetes und damit ungebundenes Feld. Für
    RS(FieldNameToGet)
    müsste "Balance" aber ein gebundenes Feld sein, denn ungebundene
    Felder sind nicht im Formular-Recordset enthalten.

    Du müsstest wohl im Code deine Berechnung wiederholen, die du in
    "Balance" veranstaltest, also sowas als Funktion in deinem Formularmodul:

    Function fctPrevRecVal()

    On Error GoTo Err_PrevRecVal

    Dim rs As DAO.Recordset

    Set rs = Me.RecordsetClone

    rs.FindFirst "AccountsID=" & Me!AccountsID

    rs.MovePrevious

    ' hier die Berechnung wiederholen, also z.B.
    fctPrevRecVal = rs!Feld1 * rs!Feld2 /4711 + rs!Feld3

    Bye_PrevRecVal:
     Exit Function

    Err_PrevRecVal:
     Resume Bye_PrevRecVal

    End Function

    Als Steuerelementinhalt deines Textfeldes "Saldo" reicht dann:
    =fctPrevRecVal()

    Wenn du es nicht hinbekommst, dann poste den genauen Code, den
    du versucht hast, und den Steuerelementinhalt von "Balance".


    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Dienstag, 16. November 2010 15:15
  • Hallo Karl,

    es funktioniert nicht.

    Unten findest Du das geaenderte Modul sowie den Inhalt des Steuerelementes.
    Bei der Verwendung von 'Me.' erhalte ich beim kompilieren die Fehlermeldung
    'unzulaessig'. Deshalb habe ich das entsprechend abgeaendert.

    Im Steuerelement 'Saldo' erscheint: #Name?
    Im Steuerelement 'Balance' erscheint: #Typ!

    Function fctPrevRecVal(F As Form)
    On Error GoTo Err_PrevRecVal
    
      Dim rs As DAO.Recordset
      Set rs = F.RecordsetClone
    
      rs.FindFirst "AccountsID=" & F!AccountsID
    
      rs.MovePrevious
    
      ' hier die Berechnung
      fctPrevRecVal = rs!TotalIn + rs!TotalOut
    
    Bye_PrevRecVal:
      Exit Function
    
    Err_PrevRecVal:
      Resume Bye_PrevRecVal
    
    End Function
    
    ++++++++++++++++++++++++
    
    =fctPrevRecVal([frmAccountsU])

    Gruss

    Ronald

    Dienstag, 16. November 2010 16:31
  • Ronald01 wrote:

    es funktioniert nicht.

    Unten findest Du das geaenderte Modul sowie den Inhalt des
    Steuerelementes. Bei der Verwendung von 'Me.' erhalte ich beim
    kompilieren die Fehlermeldung 'unzulaessig'. Deshalb habe ich das
    entsprechend abgeaendert.

    Im Steuerelement 'Saldo' erscheint: #Name? Im Steuerelement 'Balance' erscheint: #Typ!

    Function fctPrevRecVal(F As Form)
    On Error GoTo Err_PrevRecVal
    
     Dim rs As DAO.Recordset
     Set rs = F.RecordsetClone
    
     rs.FindFirst "AccountsID=" & F!AccountsID
    
     rs.MovePrevious
    
     ' hier die Berechnung
     fctPrevRecVal = rs!TotalIn + rs!TotalOut
    
    Bye_PrevRecVal:
     Exit Function
    
    Err_PrevRecVal:
     Resume Bye_PrevRecVal
    
    End Function
    
    ++++++++++++++++++++++++
    
    =fctPrevRecVal([frmAccountsU])

    Das "unzulässig" kommt, wenn du die Funktion in einem Standardmodul
    stehen hast, statt, wie von mir geschrieben, im Modul des betroffenen
    Formulares.

    Ein Standardmodul war sinnvoll für den ursprünglichen Code, den
    du kopiert hattest, aber nicht mehr für den aktuellen, denn dafür ist die
    Berechnung nun zu spezifisch.

    Gib also die Funktion in das Modul des Formulares "frmAccountsU",
    dann versuche es noch einmal mit dem bereits gezeigten Code
    ohne Parameter:

    Function fctPrevRecVal()

    On Error GoTo Err_PrevRecVal

    Dim rs As DAO.Recordset

    Set rs = Me.RecordsetClone

    rs.FindFirst "AccountsID=" & Me!AccountsID

    rs.MovePrevious

    fctPrevRecVal =  rs!TotalIn + rs!TotalOut

    Bye_PrevRecVal:
    Exit Function

    Err_PrevRecVal:
    Resume Bye_PrevRecVal

    End Function

    Steuerelementinhalt deines Textfeldes "Saldo":
    =fctPrevRecVal()


    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Dienstag, 16. November 2010 16:45
  • Hallo Karl,

    Moin.
    Alles wie vorgegeben eingefuegt.
    Keine Fehlermeldung beim Kompilieren.
    Die Felder 'Saldo' und 'Balance' bleiben jedoch leer.

    'Balance' kann nicht berechnet werden, da 'Saldo' keinen Wert enthaelt.

    'Saldo' muss jedoch beim ersten Record den Wert '0,00' erhalten, da es ja
    beim 1. Record keinen vorherigen geben kann.
    Jedem nachfolgenden Record (nach dem 1.) muss dann der Wert aus 'Balance'
    in 'Saldo' uebegeben werden.

    Ich hatte mir gedacht, das man dies eventuell mit 'If' oder 'Wenn' hinter
    'rs.MovePrevious' loesen kann.

    Platt ausgedrueckt:

       Wenn kein PrevRecord oder If no PrevRecord, dann 'Saldo' = '0,00'

    Nur wie sag ich's meinem Kinde, sprich der Funktion?


    Gruss
    Ronald

    Mittwoch, 17. November 2010 06:38
  • Hallo,

    Ronald01 wrote:

    'Saldo' muss jedoch beim ersten Record den Wert '0,00' erhalten, da es ja beim 1. Record keinen vorherigen geben kann.

    Fuege in der Fehlerbehandlung eine Zeile ein:

     Err_PrevRecVal:
      fctPrevRecVal = 0  '<===
      Resume Bye_PrevRecVal

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Mittwoch, 17. November 2010 10:03
    Moderator
  • Ronald01 wrote:

    Alles wie vorgegeben eingefuegt.
    Keine Fehlermeldung beim Kompilieren.
    Die Felder 'Saldo' und 'Balance' bleiben jedoch leer.

    'Balance' kann nicht berechnet werden, da 'Saldo' keinen Wert
    enthaelt.

    ?
    Du hattest geschrieben, dass "Balance" ein berechnetes Textfeld sei.
    Nach meinem Verständnis wolltest du dann im Textfeld "Saldo" den
    Wert von "Balance" des vorherigen Datensatzes zeigen.

    Nun aber drehst du die Sache um, und schreibst, dass "Balance"
    von "Saldo" abhängig sei. --> Bahnhof

    'Saldo' muss jedoch beim ersten Record den Wert '0,00' erhalten, da
    es ja beim 1. Record keinen vorherigen geben kann.
    Jedem nachfolgenden Record (nach dem 1.) muss dann der Wert aus
    'Balance' in 'Saldo' uebegeben werden.
    ...

    Wenn in Balance des vorherigen DS nix steht, dann ergibt auch
    Saldo nix. Falls du das auf 0 ändern willst, dann kannst du z.B.
    die Deklaration der Funktion auf einen passenden Zahltyp ändern.
    Bei einer Ganzzahl z.B. auf:

    Function fctPrevRecVal() As Long

    Aber das ist alles ein Stochern im Trüben nach deinem letzten Posting.

    -- 
    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Mittwoch, 17. November 2010 10:07
  • Hallo Karl,

    Das ist kein Widerspruch, es ist nur: Wie beschreibe ich ein Problem

    'Saldo' = 'Balance' (des Vormonats)
    'Balance' = 'Balance des Vormonats' + 'Verschiedene Einnahmen'

    Ich koennte fuer 'SALDO' und 'BALANCE' auch folgendes schreiben.

        'Saldo' letzter Monat
        'Saldo' dieser Monat

    Wenn Du ein neues Konto eroeffnest und nichts einzahlst hast Du auf dem
    1. Kontoauszug

       Vortrag (Saldo) letzter Auszug = 0,00
       und unten steht

       Saldo (Balance) heute          = 0,00

    Zahlst Du 100,00 EUR ein, sieht Dein naechster Auszug wie folgt aus:

       Vortrag (Saldo) letzter Auszug = 0,00

       Saldo (Balance) heute          = 100,00

    Aber ich glaub wir kommen so nicht weiter.

    Gruss
    Ronald

    Mittwoch, 17. November 2010 10:49
  • Hallo Peter,

    es funktioniert, nur ...

    er uebertraegt das 'Balance' des 1. Records nicht in 'Saldo' des 2. Records sondern

    schreibt wieder '0,00'

    Gruss

    Ronald

    Mittwoch, 17. November 2010 10:53
  • Ronald01 wrote:

    Das ist kein Widerspruch, es ist nur: Wie beschreibe ich ein Problem

    'Saldo' = 'Balance' (des Vormonats)
    'Balance' = 'Balance des Vormonats' + 'Verschiedene Einnahmen'

    Ich koennte fuer 'SALDO' und 'BALANCE' auch folgendes schreiben.
    ...

    Diese geschäftlich-inhaltlichen Schilderungen führen nicht weiter.

    Du müsstest rein Access-technisch schildern, inwiefern dein
    Textfeld "Balance" von deinem anderen Textfeld "Saldo"abhängt,
    durch welche Formel, welche Einstellung, welchen Code, der sich wo
    befindet, wann ausgeführt wird etc.

    Das hast du für mich erkennbar nur in die andere Richtung getan,
    also Texteld "Saldo" = Textfeld "Balance" des vorherigen Datensatzes,
    bzw. in der technischen Umsetzung die Wiederholung der Formel für
    Balance.

    Es fehlt komplett die andere Richtung.

    Aber ich glaub wir kommen so nicht weiter.

    Joo, solange die technische Abhängigkeit nicht erläutert wird,
    kann man dir nicht weiterhelfen.
     --
    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Mittwoch, 17. November 2010 11:37
  • Karl Donaubauer wrote:

    Ronald01 wrote:


    'Saldo' = 'Balance' (des Vormonats)
    'Balance' = 'Balance des Vormonats' + 'Verschiedene Einnahmen'

    ...

    Aber ich glaub wir kommen so nicht weiter.

    Noch als Ergänzung, weil du durch den gefundenen Code
    vielleicht einfach in einer Sackgasse gelandet bist:

    Normalerweise löst man Saldo-Geschichten nicht per Hüpferei in den
    Datensätzen sondern durch die Berechnung von Laufenden Summen
    z.B. mithilfe der DSum-Funktion.
    Den diesbez. Link hast du ja schon länger von Peter.
    Hast du dir das mal angesehen?

    -- 
    Servus
    Karl
    *******
    Access-FAQ: http://www.donkarl.com

    Mittwoch, 17. November 2010 11:55
  • Hallo Karl,

    o.k., ich versuch's mal mit DSum.

    Erst einmal vielen Dank fuer die Hilfe und die geopferte Zeit.

    Gruss

    Ronald

    Mittwoch, 17. November 2010 12:53