Chargenummer maken

Status
Niet open voor verdere reacties.

eawouters

Gebruiker
Lid geworden
11 aug 2012
Berichten
20
Hoi ik ben nieuw en een bekend met Access maar niet met VBA, ik moet een Access 2003 applicatie aanpassen. Het is de beoeling dat er een chargenummer wordt gemaak. Dit chargenummer bestaat uit 3 delen:
1) Jaarnummer (2 cijfers)
2) Weeknummer (2 cijfers)
3) Volgnummer (3 cijfers)

Er zijn de volgende zaken waarmee rekening dient te worden gehouden.

1. Op 1 Januari dient het volgnummer terug te gaan naar 0

2. Het charge nummer dient gelijk te blijven wanneer met hetzelfde product maakt over meerdere dagen (dus 2x registratie van hetzelfde poduct voor 2 dagen)

3. Hij dient nu niet met 0 te beginnne maar met het volgnummer dat er nu is. (bijvoorbeeld 104)

Wie wil en kan mij helpen?

Alvast bedankt. Ik heb meer van deze uitdagingen maar zoek eerst zelf naar antwoorden.


2 voorbeelden, mocht iemand een referentie hebben
- Automatisch aanpassen van de applicatie naar resolutie 1024 x 768 (is nu 1280 x 768)
- Ontwikkelde Access 2007 applicatie late werken onder Access 2003 omgeving zonder grote aanpassingen zoals lettertype naar Times New Roman, knoppen (toevoegen, opslaan, volgend record etc.)
 
Je kunt het chargenummer berekenen met een functie. Die zet je dan als standaardwaarde in het formulier, zodat je bij een nieuw record automatisch het juiste nummer genereert. Of, als je het volgnummer afhankelijk wilt maken van een product, zet je hem bij de gebeurtenis <Bij kiezen> van de keuzelijst waarmee je het product kiest.
Schermaanpassen van 1024 x 768naar (1280 x 768) is nog wel te doen, maar vereist een behoorlijk stuk programmeren; je moet dan bijvoorbeeld met tussenruimtes op je formulier gaan schuiven, lettergrootte, grootte van objecten etc. Dat zou ik er zelf niet voor over hebben; eerder zou ik de applicatie op de kleinere resolutie bouwen, want dan is hij ook goed op de grotere. Wat je met je laatste opmerking bedoelt? Geen idee :)
 
Bedankt voor je reactie,

Dat het genereren kan via een funktie geloof ik wel, maar hoe ziet die funktie er dan uit?
 
Daarvoor geef je te weinig informatie; wanneer moet het nummer precies veranderen? Weeknummer op basis van Invoerdatum (huidige datum dus), Verkoopdatum o.i.d.? En wat bedoel je met de opmerking dat het nummer gelijk moet blijven bij hetzelfde product? Ik zie dat product niet terug in je notatie.
 
Aha, hoor ik daar automatisch aanpassen van je controls op een formulier :) ?

Geen probleem indien je access versie het tenminste aankan , plak deze code in een Module en noem hem ModStretch


Code:
Option Compare Database

Public Sub Init(frm As Form, nFormHeight, nHeadRatioHeight, nFootRatioHeight, nFormWidth, nNumOfControls, nTop, nLeft, nHeight, nWidth, nFontSize, nChangeFontSize)

    Dim i As Integer

    nFormHeight = frm.InsideHeight - frm.Section(1).Height - frm.Section(2).Height
    nHeadRatioHeight = frm.Section(1).Height / nFormHeight
    nFootRatioHeight = frm.Section(2).Height / nFormHeight
    nFormWidth = frm.InsideWidth
    nNumOfControls = frm.Controls.Count - 1
    
    ReDim nTop(nNumOfControls)
    ReDim nLeft(nNumOfControls)
    ReDim nHeight(nNumOfControls)
    ReDim nWidth(nNumOfControls)
    ReDim nFontSize(nNumOfControls)
    ReDim nChangeFontSize(nNumOfControls)

   
    On Error Resume Next 'You'll never know how each Control will react ( e.g. FontSize )
    For i = 0 To nNumOfControls
        nTop(i) = frm.Controls(i).Top * (nFormHeight / frm.Section(0).Height)
        nLeft(i) = frm.Controls(i).Left * (frm.InsideWidth / frm.Width)
        nHeight(i) = frm.Controls(i).Height * (nFormHeight / frm.Section(0).Height)
        nWidth(i) = frm.Controls(i).Width * (frm.InsideWidth / frm.Width)
        nFontSize(i) = frm.Controls(i).FontSize * Sqr((frm.InsideWidth + nFormHeight) ^ 2 / (frm.Width + frm.Section(0).Height) ^ 2)
        nChangeFontSize(i) = (nFormHeight + frm.InsideWidth) / nFontSize(i)
    Next
      
    frm.ScrollBars = 0
   
End Sub

Public Sub FormResize(frm As Form, nFormHeight, nHeadRatioHeight, nFootRatioHeight, nFormWidth, nNumOfControls, nTop, nLeft, nHeight, nWidth, nFontSize, nChangeFontSize)
  
    Dim i As Integer
    Dim dRatioX As Double
    Dim dRatioY As Double
   
    On Error Resume Next 'Division by zero
    dRatioY = nFormHeight / (frm.InsideHeight - frm.Section(1).Height - frm.Section(2).Height)
    dRatioX = nFormWidth / frm.InsideWidth
    
    For i = 0 To nNumOfControls
        frm.Controls(i).Top = Int(nTop(i) / dRatioY)
        frm.Controls(i).Left = Int(nLeft(i) / dRatioX)
        frm.Controls(i).Height = Int(nHeight(i) / dRatioY)
        frm.Controls(i).Width = Int(nWidth(i) / dRatioX)
        frm.Controls(i).FontSize = Int((frm.InsideHeight + frm.InsideWidth) / nChangeFontSize(i))
    Next

    frm.Section(1).Height = frm.Section(0).Height * nHeadRatioHeight
    frm.Section(2).Height = frm.Section(0).Height * nFootRatioHeight
   
End Sub

Nu moet je voor ieder formulier dat je wilt gebruiken deze Code er standaard in plakken

Code:
Option Compare Database
Option Explicit
Dim m_IsLoading As Boolean
Private nFormHeight         As Integer
Private nHeadRatioHeight    As Integer
Private nFootRatioHeight    As Integer
Private nFormWidth          As Integer
Private nNumOfControls      As Integer
Private nTop()              As Integer
Private nLeft()             As Integer
Private nHeight()           As Integer
Private nWidth()            As Integer
Private nFontSize()         As Integer
Private nChangeFontSize()   As Integer


Private Sub Form_Load()
RunCommand Access.AcCommand.acCmdAppMaximize
DoCmd.Maximize

m_IsLoading = True
Call ModStretch.Init(Me, nFormHeight, nHeadRatioHeight, nFootRatioHeight, nFormWidth, nNumOfControls, nTop, nLeft, nHeight, nWidth, nFontSize, nChangeFontSize)
Call ModStretch.FormResize(Me, nFormHeight, nHeadRatioHeight, nFootRatioHeight, nFormWidth, nNumOfControls, nTop, nLeft, nHeight, nWidth, nFontSize, nChangeFontSize)
m_IsLoading = False


End Sub


Private Sub Form_Resize()

If Not m_IsLoading Then
    Call ModStretch.FormResize(Me, nFormHeight, nHeadRatioHeight, nFootRatioHeight, nFormWidth, nNumOfControls, nTop, nLeft, nHeight, nWidth, nFontSize, nChangeFontSize)
    Call ModStretch.FormResize(Me, nFormHeight, nHeadRatioHeight, nFootRatioHeight, nFormWidth, nNumOfControls, nTop, nLeft, nHeight, nWidth, nFontSize, nChangeFontSize)
End If

End Sub

Hier nog wat Uitleg m.b.v. afbeeldingen voor Het beste resultaat te bereiken met deze module

Voor deze module heb je een formulier kop en voettekst nodig

ModStretch1.png

Wil je geen formulier kop en voettekst dan verklein je ze tot het minimum maar wil je ze wel behouden dan zul je een rechthoek moeten trekken rond het gebied dat je wilt behouden

ModStretch2.png

Voor het beste resultaat altijd deze 2 afzetten indien je ze niet gebruikt

ModStretch3.png

Hopelijk is dit het gewenste resulaat dat je wou hebben

ModStretch4.png
 
Mooi die plaatjes, maar het gaat om een Access 2003 database...
 
Ten eerste bedankt voor de input, super. Het gaat inderdaad om een Access 2003 database, gaat het automatisch herkennen dan wel of niet lukken? ik zal het gaan testen met een kopie.

Het chargenummer dient te worden gemaakt met een druk op de cmdButton "Chargeren" voor die orders waarvan de selectieveld "Chargeren" is aangevinkt. De productiedatum (ProdDat) is het uitgangspunt voor weeknummer en jaar. Bij het plannen van twee orders (klanten) waarbij het product gelijk is dient het chargenummer gelijk te zijn als deze dezelfde productiedatum hebben. Immers één product voor 2 klanten in één oven kent dezelfde kenmerken. De zelfde order één dag later kan kleine afwijkingen vertonen. Belangrijk hierbij is de afhankelijkheid van de productiedatum, deze dient vast te staan. Het product komt idd niet terug in de notatie, maar aan het product heb ik en recept gekoppeld en receptregels (grondstoffen in bepaalde hoeveelheden).
 
Voor het volgnummer kun je deze code onder een knop hangen:
Code:
Private Sub cmdChargeNumber_Click()
    Me.Volgnummer = ChargeNumber(Me.Datum_Binnenkomst)
End Sub

En die gebruikt deze functies:
Code:
Function ChargeNumber(Datumveld As Date) As String
Dim strSQL As String, iNum As Integer, sJaar As String, sWeek As String

'Veldnamen in code vervangen door ProdDat en chargenummer en tabelnaam.
strSQL = "SELECT DISTINCT TOP 1 VolgNummer FROM Blad1 " _
    & "WHERE (Year([Datum_Binnenkomst]) = " & Year(Datumveld) & " " _
    & "AND IsoWeekNummer([Datum_Binnenkomst]) = " & IsoWeekNummer(Datumveld) & ") " _
    & "ORDER BY VolgNummer DESC;"
With CurrentDb.OpenRecordset(strSQL)
    If Not .RecordCount > 0 And .Fields(0) Then
        sJaar = Left(.Fields(0), 2)
        sWeek = Mid(.Fields(0), 3, 2)
        iNum = Right(.Fields(0), 3)
    Else
        sJaar = Format(Datumveld, "yy")
        sWeek = Right("00" & IsoWeekNummer(Datumveld), 2)
    End If
    .Close
End With
iNum = iNum + 1
ChargeNumber = sJaar & sWeek & Right("000" & iNum, 3)
End Function

Code:
Public Function IsoWeekNummer(d1 As Date) As Integer
Dim d2 As Long

   d2 = DateSerial(Year(d1 - Weekday(d1 - 1) + 4), 1, 3)
   IsoWeekNummer = Int((d1 - d2 + Weekday(d2) + 5) / 7)

End Function
 
Dag Michel,

Ik snap het nog niet. Je schrijft ''Veldnamen in code vervangen door ProdDat en chargenummer en tabelnaam.' ik neem aan dat je bedoeld:
'Datum veld' = datum productie ofwel PO_ProdDat
'Datum binnenkomst' = Datum registratie ofwel 'PO_MutDat', deze is niet de productiedatum PO_ProdDat.

Chargenummer is gedeclareerd als een datum, maar is bij mij een veld met de naam PO_ProdCharge een tekstveld met 10 karakters wat dien ik aan te passen? Dient het veld een datumveld te worden?

ChargeNumber komt in de code volgens mij niet voor a;s veld of tussen [], wat bedoel je?

strSQL = "SELECT DISTINCT TOP 1 VolgNummer FROM Blad1 " haalt een unieke waarde van blad1, waar komt die vanaf? ofwel wat is blad1?

De beide code heb ik in een module gezet, maar is dat de bedoeling? ik weet niet hoe je anders omgaat met funkties in Access.

Voor de code onder de knop heb ik een cmdButton gemaakt en de code onder de click funktie gehangen, de knop heeft de naam
'cmdChargeNumber', correct?

Je ziet ik probeer je code te begrijpen maar voor mij is dit geheel nieuw. Sorry dan ook voor de vele vragen maar bedankt voor je hulp.




Vriendelijke groet
Eric
 
Laatst bewerkt:
ChargeNumber retourneert een tekststring, maar heeft een datumveld nodig als input. Die input staat tussen de haakjes. Op basis van de gegeven datum op je formulier waar de knop op staat zoek je de hoogste waarde op in je tabel (waarvan ik dus de tabelnaam niet weet; in mijn functie heb ik een test gedaan op een tabel Blad1, en een datumveld [Datum_Binnenkomst]). Dat Chargenumber is tenslotte afhankelijk van de actieve week en jaar van dat datumveld. Je zoekt dus het hoogste nummer op in je tabel op basis van het jaar uit je formulier, en de week uit je formulier. Omdat we geen voorbeeld db hebben, is het verder lastig om de juiste syntax te geven; die zul je dus zelf moeten aanpassen. Jij weet hoe je tabel heet, hoe het datumveld heet, en je formulierveld.
 
Bedankt, ik ga er opnieuw mee aan de slag. Helpt het als ik de tabellen en het formulier exporteer en naar je toestuur?
 
Het zou inderdaad schelen als je een voorbeeldje post. Daar hoeven niet zoveel records in te zitten, maar genoeg om de vraag te reproduceren.
 
Resolutievraag:

De bovenstaande code in een module geplaatst (ModStrech) en de rest van de code als gebeurtenis bij laden geplaatst. Ik krijg de volgende foutmelding.
1.png2.png

Wat de doen? p.s. de Database is te groot om (aangepast) te sturen.

Alvast bedankt.

Groeten
Eric
 
Het chargenummer krijg ik niet werkend in de bijlage staat wat de bedoeling is. Ik snap de code helaas nog niet. Chargenummer.jpg

Wat te doen, alvast bedankt
Eric
 
In een voorbeeld hoeven alleen maar de formulier(en) en tabel(len) te staan die nodig zijn om het probleem duidelijk te maken. Ik zie op je afbeelding dat je een stevig aantal tabellen hebt, en die zijn vast niet allemaal nodig om een Chargenummer te bepalen. Maak dus een kopie van je db met alleen de noodzakelijke objecten, met een paar records er in. Vervolgens comprimeren en zippen, en dan zou hij geen probleem moeten zijn voor een upload. Is hij nog steeds te groot, dan zippen met WinRar; daarmee kun je deelbestanden van 100kb maken.
 
Bevat het bovenstaande .RAR bestand voldoende gegevens om een oplossing te bieden?
 
Ik heb het chargenummer opgelost via een query, ik kan met de complexe codes niet uit de voeten als beginner. Ik heb het opgelost met de quey
Year(Date()) & "" & DatePart("ww";Date()) & "" & [BTbl_Chargevolgnummer].[Chargevolgnummer]

Probleem is alleen dat hij het hele jaar laat zien terwijl alleen de laatste 2 cijfers voldoende is.

Ik krijg het met datepart niet opgelost, hoe dient de instelling te zijn?


Groeten
Eric
 
Year geeft altijd 4 cijfers voor het jaar. Wil je 2 cijfers, dan moet je Format gebruiken. Dus Format(Date();"yy"). Overigens heb je een numeriek veld gedefinieerd voor je chargenummer. Heb je datums die voor 1-1-2010 liggen in je tabel, dan heb je een verkeerde notatie, omdat een numeriek veld geen voorloopnul opslaat. Dan moet je dus een tekstveld gebruiken. Op zich overigens geen probleem, want ik neem niet aan dat je met die chargenummers gaat rekenen.
En je database geeft allerlei foutmeldingen over ontbrekende tabellen en queries, dus die was redelijk onbruikbaar :)
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan