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
-
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 -
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
-
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
- 11 days agoLast active
- 4Replies
- 43Views
-
2
Following