Velden subformulier aanroepen vanuit hoofdformulier

Status
Niet open voor verdere reacties.

HJD1986

Gebruiker
Lid geworden
28 mrt 2017
Berichten
61
Beste,

Ik ben een database aan het ontwikkelen of orders, facturen en offertes in te maken.
Om e.e.a. verder te verbeteren loopt ik tegen de volgende problemen aan:

1.
- Ik heb een formulier [Offertes] met een subformulier [Offerte_inhoud].
- in het subform [Offerte_inhoud] selecteer ik artikelen uit de artikelen database. Deze database bevat inkoopprijs, verkoopprijs etc.
- Nu wil ik het volgende realiseren:

Op het formulier [offertes] wil een veld weergeven met daarin de marge per regel (dus als ik op bijv. regel 1 sta dat in dit tekstvak de marge in euro's wordt weergegeven van de betreffende regel, een een veld met de totale marge van de hele offerte (alle regels in de offerte).

Ik wil dus vanuit het hoofdformulier velden aanroepen uit het subformulier. Kan iemand mij op weg helpen hoe dit te realiseren?

2.
- In het sub form offerte inhoud wil ik graag een veld (1e kolom) met doorlopende nummering realiseren. 1, 2, 3 enz. Dit kan helaas niet met autonummering aangezien deze ook door telt nadat er een record wordt verwijderd.
Iemand een idee of hier een bepaalde functie voor is in Access?

Voor de volledigheid heb ik mijn database bijgesloten.
 

Bijlagen

  • TEST database.zip
    102 KB · Weergaven: 38
1. Me.[naam control met subformulier].form.[naam control(tekstveld)]. Al je met alle waarden uit het veld van die offerte wil rekenen gebruik dan domein functies
2. je kan de DMax functie gebruiken om het max reeds gegeven nummer voor die offerte op te halen en daar één bijtellen.
 
Bedankt Noella,

De DMax ben ik niet bekend mee, maar ga ik me in verdiepen.

Ik heb de marge per regel nu werken en heb het volgende gebruikt: =([Subformulier Offerte-inhoud1].[Form]![Unitprice]-[Subformulier Offerte-inhoud1].[Form]![Inkoopprijs EUR])*[Subformulier Offerte-inhoud1].[Form]![Qty].
Dit werkt goed.

Nu heb ik nog een veld Marge totaal welke eigenlijk het totaal moet weergeven van de marge per regel per offerte. Dus ik dacht =Som([Subformulier Offerte-inhoud1].[Form]![Line total])-Som([Subformulier Offerte-inhoud1].[Form]![Line total]). Maar dit werkt niet!?
 
Beter de domeinfunctie DSum gebruiken. Zelde werkwijze als DMax
 
En kan DSum ook gebruikt worden als expressie in een onhankelijk tekstvak?
Of alleen in een query?

Ik heb wat geprobeerd maar kom er niet uit met de access help.
 
Je eerste vraag snap ik niet helemaal, voor de tweede kun je een UDF maken. Die roep je zo aan, in de eigenschap <Standaardwaarde> van het veld [Item]: =Volgnummer([Formulieren]![Offertes]![OfferID])
En dat is dan deze functie:

Code:
Function Volgnummer(OfferteID As Long)
Dim rs As Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT Top 1 [Item] FROM [Offerte-inhoud] WHERE [OfferteID] = " & OfferteID & " ORDER BY [Item] DESC")
    With rs
        If .BOF And .EOF Then
            Volgnummer = 1
        Else
            Volgnummer = !Item + 1
        End If
        .Close
    End With
End Function
Is wel een hele simpele, zonder foutafvanging, maar die kan je er wel bij verzinnen denk ik :)
 
Werkt geniaal Octafish.
De code is voor mij nog een beetje "Frans", maar het werkt BIJNA goed.

Als resultaat krijg ik nu achtereenvolgens:

Item:
1
1
2
2
3
3 enz.

Alles dus dubbel.

Heb je misschien nog een idee hoe ik dit goed kan krijgen?
 
Domein functies kan je in queries gebruiken, maar ik raad het af omdat je dan voor elke resultaatregel een full table scan doet.
Ik gebruik ze alleen in formulier velden waar ze prima werken:

[Dfunctienaam]("Veldnaam]";"Domeinnaam]"; "criteria")

Dfunctienaam: Dsum, DCount, Dmin, Dmax zoals je nodig hebt
Alle functie argumenten moeten als tekst doorgegeven worden, vandaar de aanhalingstekens
Veldnaam: naam van het veld binnen het domein dat de te aggregeren waarde bevat
Domeinnaam: naam van de query of de tabel die het waardeveld bevat; dit kan eventueel ook een sql expressie zijn
criteria: voorwaarde waaraan de te agregeren waarden voldoen. Vergeet niet om eventuele controle-waarden in de crriteria buiten de aanhalingstekens mee te gevn

voorbeeld:
DSum("VerkoopsPrijs";"Verkopen";"KlantID = " me.txtKlantID)
geeft
het totaal van de waarde in het veld VerkoopsPrijs uit de tabel "Verkopen" waar het veld KlantID gelijk is aan de waarde in het veld txtKlantID (numeriek veld) op het huidig formulier.

eenvoudig en geen code nodig
 
Laatst bewerkt:
Oppassen ben een ampersand vergeten in het voorbeeld:

DSum("VerkoopsPrijs";"Verkopen";"KlantID = " & me.txtKlantID)
 
Aha, dat scheelt misschien, want ik kreeg het maar niet werken ;-)
 
Sorry maar ik krijg het niet voor elkaar.

Ik heb de volgende formule:

=DSum("Line Total";"Offerte-inhoud";"OfferID = " & me.OfferID)

Als resultaat krijg #Naam?

Wat doe ik hier verkeerd?
 
Hallo Octafish,

Dat is inderdaad ook de bedoeling. Bij iedere nieuwe offerte moet ie opnieuw gaan nummeren. Dat doet die wel, maar dan met dubbele cijfers.
Raar dat die bij jouw wel werkt!?
 
In de bijlage nogmaals het bestand.
 

Bijlagen

  • TEST database.zip
    105,9 KB · Weergaven: 35
werkende syntax in formulierveld op Offerte scherm:

=DSum("[Line total]";"Offerte-Inhoud";"OfferteID = " & [Forms]![Offertes]![OfferID])

veldnamen met spaties in (beter geen spaties in objectnamen) tussen vierkante haakjes en de complete formuliernaam in het criteria gedeelte gebruiken.
 
Bij mij werkt-ie prima, maar hij begint opnieuw te nummeren bij elke offerte. Ik dacht eerlijk gezegd ook dat dat je bedoeling was. Zo niet: verwijder dan het criteirum.

Hi Octafish,

Ik ben erachter wat het probleem is. het veldnummer moet iedere keer (na wijzigen) geupdate worden. Als ik op de knop alles vernieuwen klik nadat ik de eerste regel heb ik gevuld gaat het wel goed.
Nu weet ik alleen niet hoe ik de functie vernieuw na het aanpassen/invullen van het regel nummer...
 
De functie werkt als standaardwaarde voor een nieuw record. Zodra je in een nieuw record iets invoert, is dat geen nieuw record meer, maar een bewerkt record. De functie zet dan dus in het volgende nieuwe record als voorzetje alvast het volgende nummer klaar. Probleem is echter: omdat je een record aan het bewerken bent, telt dat record niet mee voor de functie; die werkt alleen met opgeslagen records. Dus als je 5 records hebt, dan staat de waarde '6' ingevuld bij het nieuwe record. Je gaat dan werken, waardoor er een nieuwe regel komt voor het volgende nieuwe record. Omdat je bewerkte record nog niet is opgeslagen, telt dat niet mee in de telling voor de functie, dus je ziet in dat nieuwe record ook weer de waarde '6'. Daar is dus niks aan te doen, tenzij je het nieuwe record gelijk opslaat. Dan kan de functie het juiste nummer wél berekenen. Of je hem dan ook ziet, is weer afhankelijk van de verversing van je formulier, omdat de recordset dan óók geupdate moet worden. Anders werkt het vermoedelijk nog steeds niet.

Functies als deze gebruik ik dan ook nooit op een doorlopend formulier, omdat je de verwarring alleen maar groter maakt. Op een enkelvoudig formulier speelt dit namelijk ook, maar je hebt er geen last van, omdat je het niet ziet: zodra je doorbladert naar het volgende nieuwe record, wordt je andere record automatisch opgeslagen en je formulier ook ververst. Probleem opgelost :). Eigenlijk is het dus een kop-in-het-zand gevalletje, want wat je niet ziet, deert je ook niet. De vraag is ook waarom je niet gewoon een Autonummerveld gebruikt. Of waarom je überhaupt denkt zo'n veld nodig te hebben.
 
Beste,

Ik ben een database aan het ontwikkelen of orders, facturen en offertes in te maken.
Om e.e.a. verder te verbeteren loopt ik tegen de volgende problemen aan:

1.
- Ik heb een formulier [Offertes] met een subformulier [Offerte_inhoud].
- in het subform [Offerte_inhoud] selecteer ik artikelen uit de artikelen database. Deze database bevat inkoopprijs, verkoopprijs etc.
- Nu wil ik het volgende realiseren:

Op het formulier [offertes] wil een veld weergeven met daarin de marge per regel (dus als ik op bijv. regel 1 sta dat in dit tekstvak de marge in euro's wordt weergegeven van de betreffende regel, een een veld met de totale marge van de hele offerte (alle regels in de offerte).

Ik wil dus vanuit het hoofdformulier velden aanroepen uit het subformulier. Kan iemand mij op weg helpen hoe dit te realiseren?


Voor de volledigheid heb ik mijn database bijgesloten.


1. Na een paar avondjes proberen ben ik er nog steeds niet uit. Ik begrijp de Dsum functie en kan hem toepassen. Ik krijg echter niet helder hoe ik het marge totaal kan berekenen aan de hand van de artikelen in de offerte.
Kan iemand mij verder helpen?

2.Verder zoek ik nog een mogelijkheid om de gegevens in deze velden (Marge per regel, marge totaal, offerte totaal enz) live bij te werken of op z'n minst AfterUpdate. Nu laat ik na bijv. het wijzigen van de aantallen een AfterUpdate uitvoeren Formuliernaam.recalc. Toch werkt dit goed. Zijn er andere mogelijkheden?
Het vreemde is namelijk dat de marge per regel wel al update zonder dat ik daarvoor een code gebruikt heb.
 

Bijlagen

  • Test Database.zip
    103,8 KB · Weergaven: 32
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan