Munkanapok kiszámítása Access-ben
2012-06-29T16:01:17+02:00
2012-07-02T20:11:39+02:00
2022-07-24T00:17:25+02:00
  • OK, mehetünk tovább...
    Mutasd a teljes hozzászólást!
  • Másold be az alábbi kódot a meglévő egy sor elé.

    Rem inicializálás Dim napok_szama napok_szama = Me.Eddig - Me.Ettől munkanapok_szama = napok_szama MsgBoxWeekday(Me.Ettől, vbMonday)
    Az első sor,mivel Rem szócskával kezdődik (Remark = megjegyzés), megjegyzések megtételére alkalmas. Tanácsos a későbbi könnyebb kiigazodás miatt a programban minél több komment elhelyezése.

    A második sor egy napok_szama változónak helyet foglal a memóriában. Mivel nem adtam mega változó típusát, ezért variant lesz. Be állítható úgy a program, hogy ne lehessen változóra hivatkozni, amíg nincs ehhez hasonló módon deklarálva. A helyfoglalás gyorsítja a program futását.

    A harmadik sorban az előbb deklarált változónak értéket ad. Az értékadáshoz az aktív űrlapmezőinek értékét olvassa ki, és végez velük műveletet.
    A negyedik sorban egyik változó egy másik változó értékét veszi fel. A kapott szám perszenem mindig igaz, de teszünk róla, hogy az legyen.
    Az eddigiek tehát megnézik az eddig, és ettől közt hány nap van.
    Az ötödik sor azt mondja, hogy a hét első napja a hétfő, és megmondja, hogy a szabadság első napja, melyik napra esik. 1 = hétfő, 2 = kedd, stb. .
    Az msgbox egy függvény. Kiírja azt, amit utána, szintaktikailag helyesen megadsz. A Weekday egy másik függvény, melynél az első változó egy dátum, vagy dátumnak értelmezhető érték. A második, a mi esetünkben vbMonday, azt a naptári napot nevezi meg, mely az 1 számot kapja. A függvény az első változóban megadott dátum sorszámát adja meg 1-7 ig.
    Az utolsó sort javítsd az alábbira:

    Me.munkanapok_szama = munkanapok_szama
    Akkor, ha az eddigiek működését érted, cseréld le a teljes kódot az alábbira:
    Dim napok_szama Dim munkanapok_szama As Integer napok_szama = Me.Eddig - Me.Ettől munkanapok_szama = 0 vizsgalando_datum = Me.Ettől For x = 1 To napok_szama ' ciklus eleje If Weekday(vizsgalando_datum, vbMonday) <= 5 Then 'feltétel vizsgálat kezdete, ha teljesül ' ide akkor kerül, ha NEM szombat, vagy vasárnap munkanapok_szama = munkanapok_szama + 1 Else ' ha nem teljesül ' ide akkor kerül, ha szombat, vagy vasárnap End If 'feltétel vizsgálat vége vizsgalando_datum = vizsgalando_datum + 1 Next x ' ciklus vége Me.munkanapok_szama = munkanapok_szama
    Láthatod, hogy ha egy sorban aposztróf van, az onnan nem hajtódik végre. Így a program sorban is lehet megjegyzés.
    A magyarázataimat igyekeztem a kódba tenni. Talán annyit még, hogy a Me. szóval mindig az aktív űrlapra hivatkozunk. Ha egy űrlap nyitott, de nem aktív, akkor arra máshogy kell hivatkozni.

    A program még nem ad helyes értéket, vagy nem mindig. Még az ünnepek, és a munkanap áthelyezések kell rendezni.

    Szólj, ha eddig érted, és működik.
    Mutasd a teljes hozzászólást!
  • OK, eddig rendben, levélben elküldtem az eddigi állapotot.
    Mutasd a teljes hozzászólást!
  • Kérlek, hogy precízen csináld meg, azt, amit írok. Az eredményt, azaz az adatbázist mindig küld el, hogy lássam, nincs-e félreértés.
    A többiek érdekében, valamennyire rövidítve, a leveleimet kiteszem a topicba is.
    Megnéztem a programot, általános megjegyzéseim: Az objektumoknak ékezet nélküli neveket szokás, és célszerű adni. Pl. nem Név, hanem Nev. Ez egyrészt segíti a különböző nyelvű gépek közti hordozhatóságot, másrészt régebben egyes esetekben a VB programok kiakadtak az ékezetektől.
    Olyan objektumoknak, mint a táblák, lekérdezések, stb szokás, az objektum fajtáját megadó előtagot adni. Pl Dolgozók helyett Tbl_Dolgozok, ha tábla, Qdf_Dolgozok, ha lekérdezés, Frm_Dolgozok, ha űrlap, Rpt_Dolgozok, ha riport.
    Persze elmegy ez úgy is, ahogy csináltad.
    Javasolom, hogy minden táblának adjál ID-t és ez legyen az elsődleges kulcs. Ettől még más mezőket is indexelhetsz.(Automatikus sorszámozásra gondolok.)
    Konkrétumok:
    Tegyél egy munkanapok_szama elnevezésű oszlopot a kivett szabadságok táblába, legyen az adattípus megfelelő szám. Itt fogja a program tárolni az adott szabadság munkanapjainak számát.
    A kivett szabadságok űrlapra tedd rá ezt a mezőt, és tegyél rá egy parancsgombot. A gomb neve legyen Szamol, és a felirata pedig: Számol.
    Írj egy egysoros kódot a gomb kattintásra eseményébe:
    Me.munkanapok_szama = 12
    Zárd be a szerkesztőt, nyisd meg az űrlapot, nyomd meg a parancs gombot. A munkanapok_szama mezőben megjelenik a 12-es szám.
    Szóval ide a Szamol gomb kattintásra eseményébe kell írni a megfelelő VB kódot, hogy a kívánt eredményt megkapd.
    Ha eddig eljutottál folytatom.
    A folytatásnál kiindulási alapnak a Riha által leírt kódot fogom használni, ez egyébként alapjaiban megfelel az általam adott utolsó hivatkozásban találhatónak, de ez itt mindenki által látható.
    Mutasd a teljes hozzászólást!
  • Előre is köszi a segítséget, elküldtem a mail-t.
    Mutasd a teljes hozzászólást!
  • Azt sem tudom, hogy melyik vezérlőelem melyik eseményéhez kell rendelni a kódot

    Leírtam.

    A záródátum afterupdate eseményéből indíthatod a munkanap számítást
    Egy okító..
    Mutasd a teljes hozzászólást!
  • Ha valakivel meg akarod csináltatni, akkor az állásajánlat rovatot ajánlom.
    Viszont lépésről-lépésre rávezetlek, ha elküldöd a programod érintett részét, néhány teszt adattal. Hétfőn tudok elkezdeni foglalkozni vele. A címem: sipeki40 "kukac" gmail.com
    Mutasd a teljes hozzászólást!
  • Ahogy írtam, kezdő vagyok. Azt sem tudom, hogy melyik vezérlőelem melyik eseményéhez kell rendelni a kódot, hová kell illeszteni a függvényt, stb.?

    Mutasd a teljes hozzászólást!
  • Magam részéről nem, de mi gondod a megvalósítással?
    A dátumok ahogy írtad adottak, van egy függvény a növelésre DateAdd, gondolom dátumra tudsz keresni egy táblában (ünnepnapok), s egy számlálót léptetsz ami megadja végül a munkanapok számát.
    Mi kell még?
    1. Kezdő dátum
    2. Záró dátum

    A záródátum afterupdate eseményéből indíthatod a munkanap számítást, azzal a feltétellel, hogy a kezdődátum is adott és az kisebb vagy egyenlő a záródátummal.
    Mutasd a teljes hozzászólást!
  • Igen, a logika érthető, a megvalósítása továbbra is gondot okoz.

    Ha átküldöm az eddig elkészült adatbázist, nem vállalkoznátok a megvalósításra?
    Mutasd a teljes hozzászólást!
  • Csak azt nem értem,

    és amit leírtam az érthető, használható néked?
    Mutasd a teljes hozzászólást!
  • Csak azt nem értem, hogy ha az Excelben ezt a problémát megoldották egy NETWORKDAYS függvénnyel, akkor az ACCESS-ben ez miért ilyen bonyolult. Pedig mind a kettő Microsoft termék.
    Mutasd a teljes hozzászólást!
  • Annyi világos, hogy egy külön táblában kellene tárolni az ünnepnapokat, s meg kellene vizsgálni, hogy az 'ettől' és 'eddig' intervallumban van-e hétvége, vagy ünnepnap, s ha igen, akkor azt le kell vonni a napok számából, illetve ezt megjeleníteni a 'napok száma' mezőben.

    Kár, hogy nem volt késztetésed a kód böngészésére.

    Ez ugyan picit másra van hangolva, de ötletet adhatott volna a feladatod megoldására.
    Ez a kód ugye kap egy kezdődátumot, és egy számot (napokat).
    Visszaad egy dátumot.
    Vagyis az adott dátumtól számolja a munkanapokat az adott szám határáig és megadja a záródátumot.
    Hasonlóképp kéne kreálnod a két dátum között számítandó munkanapok kódját.
    Van egy kezdő és egy záródátumod.
    A kezdődátumot addig növeled míg eléri a zárót.
    A dátumfüggvényekre kaptál link-et (Sipeki uramtól).
    Közben nézed, hogy az adott dátum munkanap/ünnepnap/hétvége. Ugye az első esetben növeled a munkanap számlálót.
    Az ünnepnapot az általad is említett gyűjteményben kell ellenőrizni, a hétvége pedig a példa alapján vizsgálható.
    Ha elérted a záródátumot adott a munkanapok száma.
    Mutasd a teljes hozzászólást!
  • Előre és utólag is köszi a jó szándékot. Mint ahogy írtam is korábban, valóban kezdő vagyok még. Van némi access, pascal, delphi alapom, de nem vagyok még járatos.

    Már több egyszerű(!) minialkalmazást készítettem access-ben a munkám megkönnyítésére, ezek többnyire valamilyen egyszerű nyílvántartások, egyszerű lekérdezésekkel, jelentésekkel.

    Most is egy egyszerű szabadság-nyilvántartást kellene készítenem, amely szinte teljesen el is készült már, amely két táblából áll:

    1. tábla: dolgozók adatai (név, éves szabadnapok száma, stb.)
    2. tábla: ki mikor volt szabadságon (ettől, eddig, napok száma)

    És itt jött a gond! Az 'ettől' és az 'eddig' mezőkben lévő dátumértékek különbségeként megjelenő 'napok száma' félrevezető, mert nem kezeli a hétvégéket, és az ünnepnapokat.

    Annyi világos, hogy egy külön táblában kellene tárolni az ünnepnapokat, s meg kellene vizsgálni, hogy az 'ettől' és 'eddig' intervallumban van-e hétvége, vagy ünnepnap, s ha igen, akkor azt le kell vonni a napok számából, illetve ezt megjeleníteni a 'napok száma' mezőben.

    Hát erre kértem volna eredetileg segítséget, de látod, nem tudok élni vele, mert ennyire még nem vagyok profi, hogy tudjam, hogy a megadott kódrészleteket hová is kelle illeszteni.
    Mutasd a teljes hozzászólást!
  • Itt nem nagyon szokás bemásolható megoldást adni.Te pedig azt keresed.
    Ahhoz, hogy ezt vagy bármely más kódot használj hiányoznak alapvető ismereteid.
    Előbb azt kellene pótolni. Ez azonban meghaladja az itteni kereteket.
    Akkor, ha rászánod az időt, és a fáradtságot segítek elindulni.
    Mutasd a teljes hozzászólást!
  • És hová kell ezt bemásolni??
    Mutasd a teljes hozzászólást!
  • Public Function AddWorkdays(dteStart As Date, intNumDays As Integer) As Date Dim dteCurrDate As Date Dim i As Integer Dim intWeekday As Integer dteCurrDate = dteStart AddWorkdays = dteStart i = 1 Do While i < intNumDays intWeekday = Weekday(dteCurrDate, vbMonday) If Weekday(dteCurrDate, vbMonday) <= 5 Then If IsNull(DLookup("[dtObservedDate]", "tblHolidays", "[dtObservedDate] = #" & dteCurrDate & "#")) Then i = i + 1 End If End If dteCurrDate = dteCurrDate + 1 Loop AddWorkdays = dteCurrDate Exit_AddWorkDays: End Function This function doesn't add in Holidays either, but it needs a table like so: tblHolidays dtObservedDate Holiday Hope this helps, Scott<> Microsoft Access MVP 2007 Author: MS Office Access 2007 VBA
    Ez sem segített?
    Tán írd le, hogy ebben mi homályos, s segítünk eloszlatni..
    Mutasd a teljes hozzászólást!
  • Köszi mindenkinek az ötleteket, de sajnos nekem ez így sok egy kicsit. Tudom, ez az én hibám, de még nem vagyok ennyire profi az access-ben, így a felét sem értettem azoknak, amik az általatok javasolt linkeknél vannak.

    Nekem valami konkrét megoldás kellett volna.

    Azért köszi mindenkinek.
    Mutasd a teljes hozzászólást!
  • Nem én vagyok a kérdező.

    Az általam adott hivatkozás megoldja a változó ünnepek dolgát is.

    A munkanap áthelyezéseket is kezelni kell. Törvény, vagy rendelet szabályozza. (Magyar Közlöny.)
    Mutasd a teljes hozzászólást!
  • A sima workday-holyday nem lesz jó neked, ha anemzeti ünnepeket is kezelned kell.
    Ebben az esetben le kell tárolnod a 'normálistól' eltérő napokat egy táblában.
    De sztem le lehet tölteni vhonnan a netről is, mert az én WP7 telefonom tudta, mikor volt ünnepnap Mo.-on...
    Mutasd a teljes hozzászólást!
  • Pedig ezek egyrészének használatával lehet megoldani.
    Hol akadtál el?
    Talán ezt is megnézheted.Meg ezt is.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Köszi, de ezzel nem sokra megyek
    Mutasd a teljes hozzászólást!
  • Az Access dátum függvényeit megtalálod itt.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Van egy űrlapom, amelyik három mezőt tartalmaz:

    1. Kezdő dátum
    2. Záró dátum
    3. Szabadnapok száma

    A 3. mezőbe a két dátum közötti MUNKANAPOK számát szeretném megjeleníteni.

    Odáig eljutottam, hogy az ünnepnaokat egy külön táblába kell foglalni, és ezeket kellene kivonni a megadott dátum-intervallum közti napok számából, de nem igazán tudom a megoldást.

    Valami olyasmire lenne szükségem, mint az Excel-ben a NETWORKDAYS függvény. Ja, és persze, jó lenne a 3. mezőben számított adatot is letárolni a táblába.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd