none
rendre heures de repot paramétrable via l'interface RRS feed

  • Question

  • Bonjour la communauté,
    je suis entraine de réaliser un projet d'Organisation et planification du travail,
    dans l'une de mes pages j'ai affiché via une DataTable un planing annuel(i.e. dans chaque jour ou nuit s'affiche le nom du groupe qui a travaillé) à condition que si un groupe travaille dans la journée il prend 24h de repos, et s'il travaille dans la nuit 72h de repos, voici le code que j'ai utilisé:

      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
        da = New SqlDataAdapter("select count(distinct nom_groupe) from groupes", con)
        da.Fill(ds, "count")
        Dim count As Integer = ds.Tables("count").Rows(0).Item(0)
    
    
    
        da2 = New SqlDataAdapter("select * from conge ", con)
        da2.Fill(ds2, "conge")
    
    
    
        Dim t As New DataTable
        GV1.ShowHeader = False
    
        For j = 0 To 24
          t.Columns.Add(j)
    
        Next
    
        For i = 1 To 31
          t.Rows.Add(i)
    
        Next
    
        Dim k = 0
        ds.Clear()
        da = New SqlDataAdapter("select nom_groupe from groupes order by id_groupe asc ", con)
        da.Fill(ds, "groupes")
    
    
    
        ''''''''''''''''''mois 1'''''''''''''''''
        ''''''''''''''''''''BJ
        For i = 1 To 31
    
          If k > count - 1 Then
            k = 0
          End If
    
          t.Rows(i - 1).Item(1) = ds.Tables("groupes").Rows(k).Item(0)
    
          GV1.DataSource = t
          GV1.DataBind()
    
          k = k + 1
          s = k
    
        Next
        For j = 0 To ds2.Tables("conge").Rows.Count - 1
          day_debut = ds2.Tables("conge").Rows(j).Item(3)
          day_fin = ds2.Tables("conge").Rows(j).Item(4)
          remplacant = ds2.Tables("conge").Rows(j).Item(2)
          bene = ds2.Tables("conge").Rows(j).Item(1)
          For i = 1 To 31
            If i = day_debut.Day And day_debut.Month = 1 And day_debut.Year = Date.Now.Year Then
    
              If day_fin.Month <> day_debut.Month Then
    
                For m = day_debut.Day To 31
                  If k > count - 1 Then
                    k = 0
                  End If
                  If bene = t.Rows(m - 1).Item(1).ToString Then
    
                    t.Rows(m - 1).Item(1) = remplacant
    
                    GV1.DataSource = t
                    GV1.DataBind()
                    k = k + 1
                    var1 = day_fin.Day
                    var2 = day_fin.Month
                  End If
                Next
    
              Else
                For m = day_debut.Day To day_fin.Day
                  If k > count - 1 Then
                    k = 0
                  End If
                  If bene = t.Rows(m - 1).Item(1).ToString Then
                    t.Rows(m - 1).Item(1) = remplacant
                    GV1.DataSource = t
                    GV1.DataBind()
                    k = k + 1
                  End If
                Next
              End If
            End If
          Next
        Next
    
    ce que je cherche actuellement c'est de rendre les heures de repos paramétrables à travers l'interface comme ça si l'utilisateur choisi les heures et il clic sur valider le DataTable s'affiche avec comme heures de repos les heures saisie par l'utilisateur

    je suis bloqué depuis 2 jours et si vous avez une idée à me conseiller, elle est la bienvenue,
    merci d'avance

     

    mercredi 20 avril 2011 17:18

Réponses

  • Bonsoir, voici la suite:

     A partir de là, créons un planning.

     

    Nous avons le calendrier, les postes à pourvoir le jour, ceux à pourvoir la nuit. Nous disposons de la table « groupes » pour l’effectif disponible.

     

    Supposons que les droits à repos compensent réellement un travail astreignant et/ou pénible. Dans ce cas, le repos compensateur doit être consommé dès qu’il est acquis. Nous avons donc une règle : pas de travail avant d’avoir consommé le repos compensateur. Nous verrons ensuite les exceptions.

     

    Par contre il peut y avoir soit des discriminations « travail de jour/travail de nuit » pour chaque travailleur soit une obligation d’alternance. Le pire, c’est d’avoir les deux.. !

     

    Identification des travailleurs disponibles pour travailler le jour :

     

    Ce sont ceux qui ont (ou vont) épuisé leur droit à repos et qui ont travaillé de nuit la dernière fois donc : requête-sélection sur ces critères à partir du journal.

     

    Idem sur le même principe pour l’effectif à assigner de nuit.

     

    Ajouter un critère (et une colonne dans groupe) pour ceux qui ne travaillent que de jour/nuit et, pendant qu’on y est, au lieu de coder JOUR/NUIT avec 0/1 affectons 0 aux travailleurs en congé (annuel, maladie-maternité etc.), 1 pour ceux qui ont travaillé de jour et 2 pour les autres. Comme cela on a tous nos critères de sélection… Et l’effectif disponible et affectable.

     

    Il manque une table : postes à pourvoir avec une colonne qualification pour avoir un critère de sélection supplémentaire.

     

    Les sélections précédentes nous donnent l’effectif disponible pour chaque poste à pourvoir demain. On peut aussi l’avoir en procédant de même pour les jours suivants. Pour cela il faut créer un journal des affectations avec comme colonnes : index, date, poste1, poste2, etc. pour chaque poste, 0 veut dire non pourvu, N = l’index du travailleur affecté.

     

    Reste à mixer l’ensemble pour en faire un planning des « propositions d’affectation ». On est jamais sur de rien.. !

     

    Partons de JJ+1. = demain

    Nbrdispo= nombre de travailleurs disponibles

    Boucle jusqu’à ce que poste à pourvoir=0

                Boucle jusqu’à ce que travailleurs disponibles=0

    Si travailleur disponible X, et qualifié pour poste à pourvoir alors

    affecté : postes à pourvoir-1 : sortie de boucle

                            fin de condition

    Travailleur disponible -1

    Fin de la boucle

    Fin de la boucle à épuisement des postes à pourvoir

     

    Voilà le travail…Pas beaucoup de code mais une bonne organisation des données et une saisie simple.

     

    Un conseil : traduit tout cela en diagramme avant d’écrire du code ce sera plus facile.

     

    Bon courrage.. !

     

    Cordialement.

     

    • Marqué comme réponse menyarito samedi 23 avril 2011 00:40
    vendredi 22 avril 2011 18:51

Toutes les réponses

  • Bonjour..!

    Il serait à la fois plus simple et sans doute plus facile de te suggerer une boucle de traitement si tu nous liste tes tables (en indiquant ce qu'elles contiennent) et tes variables (idem).

    Ton code me parait un peu "embrouillé".

    à+

    Cordialement

    mercredi 20 avril 2011 17:43
  • merci de m'avoir répondu,

    voici mes tables:

    groupes

    conge

     

    cordialement

     

     

     


    jeudi 21 avril 2011 08:08
  • Bonjour.. !

     

    « Ce qui se conçoit bien s’exprime clairement et les mots pour le dire viennent aisément »

     

    Si j’ai bien compris, les gens dans ton entreprise travaillent JOUR comme NUIT, et pour chaque jour travaillé ils ont droit à un repos (compensateur) de 24 heures qui passe à 72 heures lorsqu’ils travaillent de nuit.

     

    Tu dispose d’une table « groupes » où doivent être listés chacun des travailleurs et d’une table « conges ».

     

    Logiquement, un opérateur devrait saisir chaque jour, sur un formulaire ou apparait un datagrid qui liste les travailleurs de la table « groupe », la période ouvrée par le travailleur ce qui par voie de conséquence entraine l’attribution du temps de repos acquis qui se cumulerait avec le montant de la colonne « repos acquis » de cette même table. Quand le travailleur consomme tout ou partie du temps de repos cumulé, le même opérateur (ou un autre) saisirait alors le repos consommé , toujours sur le même datagrid du même formulaire ce qui décrémenterait d’autant la colonne « repos acquis».

     

    Jusque là on n’a qu’une seule table, mais comme il y a toujours des contestataires il vaut mieux tenir un journal des saisies (la table « congés » fera l’affaire).

     

    Cette table congé aurait pour colonnes : INDEX, DATE, PeriodeTravailleur1, ConsomméTravailleur1, etc. Elle enregistrait sur un seul octet (0/1) ce que l’operateur aurait saisi pour chacun des travailleurs 0 pour jour et 1 pour nuit ainsi que les repos consommés.

     

    Le solde des droits à repos apparait ainsi dans le datagrid (plus de code « embrouillé) et tout le monde est content. Cela peut même être joli.. !

     

    En cas de contestation il suffit d’éditer le journal des saisies (on peut même le corriger).

     

    Allez bon courage et souviens-toi que le mieux est l'ennemi du bien...Alors pourquoi faire compliqué quand on peut faire simple ?

     

    Cordialement

    vendredi 22 avril 2011 17:48
  • Bonsoir, voici la suite:

     A partir de là, créons un planning.

     

    Nous avons le calendrier, les postes à pourvoir le jour, ceux à pourvoir la nuit. Nous disposons de la table « groupes » pour l’effectif disponible.

     

    Supposons que les droits à repos compensent réellement un travail astreignant et/ou pénible. Dans ce cas, le repos compensateur doit être consommé dès qu’il est acquis. Nous avons donc une règle : pas de travail avant d’avoir consommé le repos compensateur. Nous verrons ensuite les exceptions.

     

    Par contre il peut y avoir soit des discriminations « travail de jour/travail de nuit » pour chaque travailleur soit une obligation d’alternance. Le pire, c’est d’avoir les deux.. !

     

    Identification des travailleurs disponibles pour travailler le jour :

     

    Ce sont ceux qui ont (ou vont) épuisé leur droit à repos et qui ont travaillé de nuit la dernière fois donc : requête-sélection sur ces critères à partir du journal.

     

    Idem sur le même principe pour l’effectif à assigner de nuit.

     

    Ajouter un critère (et une colonne dans groupe) pour ceux qui ne travaillent que de jour/nuit et, pendant qu’on y est, au lieu de coder JOUR/NUIT avec 0/1 affectons 0 aux travailleurs en congé (annuel, maladie-maternité etc.), 1 pour ceux qui ont travaillé de jour et 2 pour les autres. Comme cela on a tous nos critères de sélection… Et l’effectif disponible et affectable.

     

    Il manque une table : postes à pourvoir avec une colonne qualification pour avoir un critère de sélection supplémentaire.

     

    Les sélections précédentes nous donnent l’effectif disponible pour chaque poste à pourvoir demain. On peut aussi l’avoir en procédant de même pour les jours suivants. Pour cela il faut créer un journal des affectations avec comme colonnes : index, date, poste1, poste2, etc. pour chaque poste, 0 veut dire non pourvu, N = l’index du travailleur affecté.

     

    Reste à mixer l’ensemble pour en faire un planning des « propositions d’affectation ». On est jamais sur de rien.. !

     

    Partons de JJ+1. = demain

    Nbrdispo= nombre de travailleurs disponibles

    Boucle jusqu’à ce que poste à pourvoir=0

                Boucle jusqu’à ce que travailleurs disponibles=0

    Si travailleur disponible X, et qualifié pour poste à pourvoir alors

    affecté : postes à pourvoir-1 : sortie de boucle

                            fin de condition

    Travailleur disponible -1

    Fin de la boucle

    Fin de la boucle à épuisement des postes à pourvoir

     

    Voilà le travail…Pas beaucoup de code mais une bonne organisation des données et une saisie simple.

     

    Un conseil : traduit tout cela en diagramme avant d’écrire du code ce sera plus facile.

     

    Bon courrage.. !

     

    Cordialement.

     

    • Marqué comme réponse menyarito samedi 23 avril 2011 00:40
    vendredi 22 avril 2011 18:51
  • Bonjour Menyarito,

     

    Reprenons et finissons notre affaire.

     

    L’entreprise ou l’organisme concerné (service hospitalier ?, service de sécurité ?, contrôle navigation aérienne ? etc.), dispose OBLIGATOIREMENT d’un livre du personnel (LPRS) où sont consignés les noms, prénoms, fonction et qualification du personnel. Elle doit aussi avoir un tableau des congés avec les dates de départ et de retour (TDCG). Ces deux tables pourraient donc exister dans sa BDD.

     

    Il faut neanmoins créer :

     

    TEFT (Table de l’Effectif des Travailleurs)

    ID(index) ; NM(nom) ; PN(prénom) ; FC(fonction) ; QL(qualification) ; DR(droits à repos compensateur acquis) ; DP(date de départ en congé) ; RT(date de reprise du travail) ; PT(poste d’affectation) ; PA(periode d’affectation contractuelle) ; JN(dernière affectation)

     

    NB :pour les congés annuels, il s’agit des dates acceptées par l’administration, on peut envisager un tableau des congés demandés pour anticiper, mais ce n’est pas très fiable. Les congés maladie, maternité et autres doivent être saisis ou extraits d’une table à identifier.

     

    TPAP (Table des Postes A Pourvoir)

    ID(index) ; NM(denomination du poste) ; QL(qualification requise) ; LC(localisation du poste) ; JN(période à pourvoir) => Octet = période à affecter: 0 = aucune, 1 = jour, 2 = nuit, 3 = jour et nuit

     

    NB : certains champs ne seront pas utilisés ou le seront ultérieurement si tu affine ton application

     

    Et si LPRS et TDCG existent dans la BDD, transformer TEFT en :

     

    REFT (Requete Effectif des Travailleurs)

    SELECT LPRS.ID,NM,PN,FC,QL,DR,DP,RT,PT

    FROM LPRS

    INNER JOIN (TDCG (WHERE TDCG.NM+PN = LPRS.NM+PN))

    WHERE LPRS.PT= (un poste jour/nuit) OR LPRS.PT = (un autre poste jour/nuit) etc. pour TOUS les postes jour/nuit

    ORDER BY LRPS.PT (c’est plus pratique pour la lisibilité)

     

    NB :si on doit saisir ces données on éliminera les travailleurs non concerné par jour/nuit de la saisie.

     

    JOURNAL DES PERIODES OUVREES :

     

    Ce journal peut être alimenté soit par un opérateur qui compile les feuilles de présence (archaïque) soit par les travailleurs eux-mêmes sur la console de leur poste de travail (dans ce cas il faut leur affecter un identifiant et un password modifiable et ajouter deux colonnes à T/REFT) soit encore par le système de pointage installé (faisable).

     

    JDPO (Journal Des Periodes Ouvrees)

    DATE(JJ/MM/AAAA) ; PO(T/REFT) -> Octet : 0=en congé, 1= jour, 2 = nuit

    NB :autant de colonnes que de lignes dans T/REFT

     

    PROPOSITIONS D’AFFECTATION AUTOMATISEES (PLANNING)

     

    Dim nbjplg As Integer = 90 (nombre de jours à plannifier)

    Dim nbreft   As Integer = T/REFT.Count-1

    Dim plgdte As Date = Now

    Dim dpn, pap, IDdpn, IDpap  As Integer = 0

     

    Dimensionner eftql, eftdr, eftdp, eftrt, eftpt, eftpa et eftjn en fonction du contenu des champs correspondants de T/REFT.QL,DR,DP,RT,PT,PA,JN

     

    Dimensionner papql et papjn en fonction des champs correspondants de TPAP.QL,JN

     

    Créer un tableau pour noter les projections d’acquisition et de consommation de repos suscitées par le planning

     

    Dim tbxplg(nbjplg) As Integer

     

     

    Do While nbjplg>0

        extraire le nombre(dpn) et la liste des travailleurs disponibles(IDdpn) le plgdte

        extraire le nombre(pap) et la liste des postes à pourvoir(IDpap) le plgdte

        pour le deuxième jour et les suivants : lire le planning du/des jour(s) précédents

        calculer ensuite le nombre de repos compensatoires acquis du fait des affectations

        let es affecter à un tableau tbxplg

                Do While pap>0

                     lire les données de TPAP.QL,JN pour IDpap

                    affecter ces données à papql et papjn

                    If JN = 0 Then exit Do

                     Do While dpn>0

                            lire les données de T/REFT.QL,DR,DP,RT,PT,PA,JN pour IDdpn

                            affecter ces données à : eftql, eftdr, eftdp, eftrt, eftpt, eftpa et aftjn

                            reconnaitre les critères d’exclusion

                            If eftdr>0 Or eftdp<plgdte Or eftrt>plgdte Then exit Do

                            condition de qualification

                            If eftql = papql Then

                                determiner la nature(J/N) de la dernière periode ouvree par IDdpn

        comparer avec papjn

                                Select Case eftjn

                                       Case 1

                                           If eftjn = 1 Then Exit Do

                                           => le poste est pourvu par IDdpn

                                       Case 2

                                           If eftjn = 2 Then Exit Do

                                           => le poste est pourvu par IDdpn

                                End Select

                            dpn=dpn-1

        Loop

                    pap=pap-1

                Loop

        nbjplg=nbjplg-1

        plgdte=plgdte+1

    Loop

     

    Pour avoir en permanence 90 jours de planning il faut relancer le programme tous les jours. Avec tout cela si tu n’y arrive pas…Tiens-moi au courant.

     

    Cordialement.

    • Proposé comme réponse FredDorine samedi 23 avril 2011 13:07
    samedi 23 avril 2011 13:06