Je dois programmer un horaire de travail pour trois équipes dans un système à quatre brigades. Chaque quart de travail dure huit heures. Le premier quart de travail commence à 6 heures du matin. Le deuxième quart de travail commence à 14 h. Le troisième quart de travail commence à 22 h. Chaque cycle a quatre jours et 48 heures de pause.

Le tableau ci-dessous montre comment est le calendrier pour janvier 20019.

enter image description here

«W» signifie un jour de congé.

J'écrirais une fonction qui obtient une date d'argument et un numéro de quart de travail et renvoie quelle brigade a une équipe.

Par exemple:

getBrigadeNumber('2019-01-27',1); // should return 'III' for schedule above 

Je n'ai absolument aucune idée de comment ça s'écrit.

Je vais l'écrire en VBA, mais je connais aussi php,

Je serai reconnaissant pour tout conseil.

0
Mr Tea 28 janv. 2019 à 00:04

4 réponses

Meilleure réponse

À première vue, le problème semble difficile - algorithme pour un horaire à trois équipes, mais lorsque vous réalisez que les changements sont des modèles et que ces modèles ne changent pas avec le temps, le problème commence à paraître très facile.

L'idée de "Conserve le premier mois dans un tableau et quand j'aurai besoin d'un jour spécifique. Je peux le compter pour des boucles" résoudra le problème. Ce que je veux ajouter, c'est qu'il n'est pas nécessaire d'utiliser des boucles . Le modèle de décalage se répète tous les 16 jours - les valeurs pour le 11 janvier et le 27 janvier sont les mêmes.

Pour un jour particulier d , vous pouvez calculer le quart de travail de chaque brigade en tenant compte du pseudo-code suivant:

D = The distance between a particular day d and January 1st in days.
A = Schedule for January 2019. A zero indexed array with 4 rows and 31 columns.

S1=A[1][D mod 16] will be the calculated shift number for brigade 1 at day d.
S2=A[2][D mod 16] will be the calculated shift number for brigade 2 at day d.
            ...
S4=A[4][D mod 16] will be the calculated shift number for brigade 4 at day d.

Connaître S1, S2, S3 et S4 suffit pour que getBrigadeNumber renvoie la valeur correcte.

2
Dessy Stoeva 29 janv. 2019 à 17:00

Vous pouvez faire cela sans VBA, en utilisant la fonction de feuille de calcul MATCH():

Imaginez que votre mois January est sur la ligne 1. Vous pouvez utiliser la fonction MATCH() pour trouver la colonne où vous avez le 27 janvier:

=MATCH(1;AB$2:AB$5;0)

Qui veut dire:

Trouvez la valeur 1, dans la colonne "AB", à l'intérieur des quatre lignes (2 à 5), en utilisant la correspondance exacte.
La colonne 'AB' se trouve sous la forme =OFFSET(A1;0;27).

0
Dominique 28 janv. 2019 à 14:11

@Dessy Stoeva vous êtes un génie. Maintenant, mon code ressemble à ça:

 Public Property Get getCurrentBrigade() As Byte
    Dim days As Integer
    Dim DateOfStartSchedule As Date

    DateOfStartSchedule = #1/1/2019#
    Dim i As Integer

    days = Abs(DateDiff("d", CurrentDayOfShift, DateOfStartSchedule))
    i = (days Mod 16)

    If scheduleAtTheJanuary(1, i) = CurrentShift Then
    getCurrentBrigade = 1
    ElseIf scheduleAtTheJanuary(2, i) = CurrentShift Then
    getCurrentBrigade = 2
    ElseIf scheduleAtTheJanuary(3, i) = CurrentShift Then
    getCurrentBrigade = 3
    Else
    getCurrentBrigade = 4
    End If
End Property

Quelqu'un a une idée, comment puis-je améliorer ce code?

0
Mr Tea 31 janv. 2019 à 09:28

Actuellement, je travaille dans différentes parties de l'application, mais en ce moment, je pense toujours au problème ci-dessus. Je ne veux certainement pas d'un code gratuit. Je ne veux que des astuces et des conseils. J'ai deux idées sur la façon dont je peux l'écrire, mais à mon avis, elles ne sont pas optimales.

La première idée est:

Créez une feuille remplie de données pour les 10 prochaines années. Ensuite, tout ce dont vous avez besoin est simplement de lire la cellule appropriée.

La deuxième idée est:

Garde le premier mois dans un tableau Et quand j'aurai besoin d'un jour spécifique. Je peux le compter pour des boucles.

Mais peut-être existe-t-il un autre pour résoudre ce problème. Peut-être que quelqu'un connaît un algorithme pour ce problème

0
Mr Tea 28 janv. 2019 à 12:30