0

Calcul date

Bonsoir,

Je début avec Ninox, donc je risque d'avoir des questions ! Désolé !!

Je cherche à faire 2 calcul automatique de dates.

J'ai une table "Commandes", dans cette table j'ai les champs suivants " Date BAT " et "Délai", le champ "Date BAT " est une date et le champs "délai" des nombres.
J'ai aussi une autre table "Jour fériés" avec un champs "Date", dans lequel je viens lister l'ensemble des mes jours fériés pour l'année.

Je souhaite pour le calcul N° 1 :
Calculer ma date de livraison avec les jours ouvrés (donc hors samedi et dimanche), et en prenant en compte les jours fériés, donc si ma date de BAT est au 16/12 et que j'ai 8 dans le champ délai, je souhaite afficher le 27/12 dans mon résultat (16/12 + 8, sachant qu'il y'a un samedi, un dimanche et un jour férié).

 

Pour le calcul N°2 :
A partir de mon premier calcul, qui sera dans le champs "date de livraison", je souhaite calculer une date de départ de 2 jours ouvrés, donc pour livrer le 27/12, je dois expédier le 24/12 (pareil avec prise en compte des samedis et dimanches, ainsi que des jours fériés).

J'ai fait beaucoup de test, notamment avec le script, j'ai sollicité ChatGPT, dans l'ensemble ça fonctionne mais j'ai des bugs de temps en temps, suivant si ma date de livraison tombe un lendemain de week-end ou non il ne calcul plus que 1 jour et impossible de trouver la solution… pourriez-vous m'aider svp que je puisse comprendre comment gérer ce calcul de date ?

Merci à vous
Philippe

4 replies

null
    • PHILIPPE_CORBO
    • 9 days ago
    • Reported - view

    au final j'ai réussi !!

    Voici les codes si ça aide des gens :

    Calcul 1 :
    let startDate := 'Date BAT';
    let daysToAdd := 'Délai';
    let holidays := for t in select 'Jours Fériés' do
            t.Date
        end;
    let current := startDate;
    let addedDays := 0;
    while addedDays < daysToAdd do 
        current := current + 1;
        if weekday(current) >= 1 and weekday(current) <= 5 then
            let isHoliday := false;
            for h in holidays do
                if current = h then isHoliday := true end
            end;
            if not isHoliday then
                addedDays := addedDays + 1
            end
        end
    end
    ;
    current

    Calcul 2 :
    let deliveryDate := 'Date Livraison';
    let daysToSubtract := 2;
    let current := deliveryDate;
    let subtractedDays := 0;
    let holidays := (select 'Jours Fériés').Date;
    while subtractedDays < daysToSubtract do 
        current := current - 1;
        let isHoliday := false;
        for holiday in holidays do
            if holiday = current then isHoliday := true end
        end;
        if weekday(current) >= 0 and weekday(current) <= 4 and not isHoliday then
            subtractedDays := subtractedDays + 1
        end
    end
    ;
    current

    • John_Halls
    • 8 days ago
    • Reported - view

    Hi would you mind if I looked at the code you have put together? There are a few techniques that we can show you that will help you when you need to write another script. Regards John

      • PHILIPPE_CORBO
      • 8 days ago
      • Reported - view

       

      Hi John,
      Oh no, not at all!!!
      I'm just starting with Ninox, so I have a lot to learn!!

      Thanks
      Phil

    • John_Halls
    • 5 days ago
    • Reported - view

    Hi  Your code worked but occasionally gives the wrong date. This is because of this line

        if weekday(current) >= 1 and weekday(current) <= 5 then

    Which should be

        if weekday(current) <= 4 then

    This is because weekday(date) returns 0 for Monday through to 6 for Sunday

    If you want to improve your code, it can be re-written as 

    let current := 'BAT Date';
    let daysToAdd := Delay;
    let holidays := (select Holidays).Date;
    let addedDays := 0;
    while addedDays < daysToAdd do
        current := current + 1;
        if weekday(current) <= 4 then
            let isHoliday := count(holidays[= current]) > 0;
            if isHoliday = 0 then
                addedDays := addedDays + 1
            end
        end
    end;
    current

    As an alternative to this code you could use

    let a := for i from 1 to 30 do
            'BAT Date' + i
        end;
    let b := (select Holidays).Date;
    a := a[weekday(this) < 5];
    a := a[let v := this;
            not b[= v]];
    item(a, Delay - 1)

    This creates an array of 30 dates from BAT Date, then takes out the weekends at line 5, and then takes out the holidays at lines 6 and 7. It finally selects the one corresponding to Delay -1 (because arrays start at 0)

    Regards John

Content aside

  • 5 days agoLast active
  • 4Replies
  • 43Views
  • 2 Following