IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Formules Discussion :

Initialisation de tableaux avec l'ensemble des enregistrement [CR 9]


Sujet :

Formules

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Initialisation de tableaux avec l'ensemble des enregistrement
    Bonsoir à tous,
    Je vous expose mon problème : N employés sont amenés à intervenir dans un projet. l'employé numéro i (ligne i dans le détail du rapport ) commence son intervention à la date Début_i et la termine à la date Fin_i
    Je veux calculer la somme du temps ( ou tout simplement le temps) pendant lequel personne ne travaillait sur ce projet sur la période [L--> C]
    L : date de lancement, C : date de clôture du projet.
    Je sais comment je dois faire pour les calculs ( du moins le pseudo-code) mais de pour transposer ça sur l'éditeur des formules je n'arrive pas .
    Ma question : Comment faire pour initialiser deux tableaux D[] et F[] de taille N avec respectivement les dates Début_i et Fin_i des employés.
    Ensuite je dois, pour chaque ligne i, faire des comparaison avec les dates de la ligne précédente.
    j'espère que je n'étais pas trop long
    Merci

  2. #2
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 945
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant BO/Crystal Reports

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 945
    Points : 2 723
    Points
    2 723
    Par défaut
    Citation Envoyé par linger Voir le message
    Bonsoir à tous,
    Je vous expose mon problème : N employés sont amenés à intervenir dans un projet. l'employé numéro i (ligne i dans le détail du rapport ) commence son intervention à la date Début_i et la termine à la date Fin_i
    Je veux calculer la somme du temps ( ou tout simplement le temps) pendant lequel personne ne travaillait sur ce projet sur la période [L--> C]
    L : date de lancement, C : date de clôture du projet.
    Je sais comment je dois faire pour les calculs ( du moins le pseudo-code) mais de pour transposer ça sur l'éditeur des formules je n'arrive pas .
    Ma question : Comment faire pour initialiser deux tableaux D[] et F[] de taille N avec respectivement les dates Début_i et Fin_i des employés.
    Ensuite je dois, pour chaque ligne i, faire des comparaison avec les dates de la ligne précédente.
    j'espère que je n'étais pas trop long
    Merci



    Pour tes tableaux, tu les initialises à vide.. puis tu les redimensionnes au fur et à mesure..
    Redim preserve d(nouvel_index).

    N'oublie pas le "preserve"
    Tu utilise le même index pour tout tes tableaux..

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci luc_chivas pour votre réponse; je connaissais pas avant redim preserve mais je sais pas non plus comment ça peut me servir dans mon exemple!
    Voila ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    local numbervar te:=0; // Variable pour additionner le temps d'inactivité à chaque fois
    local datetimevar ft;
    local numbervar N:=Count ({Table1.INTERVENANT}); // compte sur le nombre d'intervenants
    local datetimevar Array D;
    local datetimevar Array F;
    redim D[N];
    redim F[N]
    //Initiation des tableaux D et F ???
    Si j'arrive à faire cette initialisation, le reste est facile.
    Pseudo algorithme :
    For i=2 à N faire
    Si ( D[i]<= ft et F[i]<= ft) alors
    ft:=ft et te:=te
    Sinon si ( D[i]<= ft et F[i]> ft) alors
    ft:=F[i] et te:=te
    Sinon si ( D[i]> ft ) alors
    ft:=F[i] et te:=te+ ( D[i] - F[i-1])
    fin de la boucle for
    Je dois ajouter à la fin les temps (D[1] - L) et (C-D[N]) à la variable te pour avoir le temps d'inactivité sur tout le projet.
    Une piste svp...

  4. #4
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 945
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant BO/Crystal Reports

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 945
    Points : 2 723
    Points
    2 723
    Par défaut
    Citation Envoyé par linger Voir le message
    Merci luc_chivas pour votre réponse; je connaissais pas avant redim preserve mais je sais pas non plus comment ça peut me servir dans mon exemple!
    Voila ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    local numbervar te:=0; // Variable pour additionner le temps d'inactivité à chaque fois
    local datetimevar ft;
    local numbervar N:=Count ({Table1.INTERVENANT}); // compte sur le nombre d'intervenants
    local datetimevar Array D;
    local datetimevar Array F;
    redim D[N];
    redim F[N]
    //Initiation des tableaux D et F ???
    Si j'arrive à faire cette initialisation, le reste est facile.
    Pseudo algorithme :
    For i=2 à N faire
    Si ( D[i]<= ft et F[i]<= ft) alors
    ft:=ft et te:=te
    Sinon si ( D[i]<= ft et F[i]> ft) alors
    ft:=F[i] et te:=te
    Sinon si ( D[i]> ft ) alors
    ft:=F[i] et te:=te+ ( D[i] - F[i-1])
    fin de la boucle for
    Je dois ajouter à la fin les temps (D[1] - L) et (C-D[N]) à la variable te pour avoir le temps d'inactivité sur tout le projet.
    Une piste svp...

    bonjour

    Dans la section détails du rapport ou dans un sous rapport (plutôt cette option)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NumberVar Index
    Redim Preseve D[index];
    redim Preserve F[Index]
    shared datevar array D[Index]:= date_debut;
    shared datevar array F[Index]:= date_fin;
    Index:=Index+1
    Une fois que le rapport alu tous les enregistrements, mes deux tableaux sont rempli avec les dates, et chaque index correspond au même employé

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci Luc, j'ai essayé votre code : j'obtiens toujours l'enregistrement de la dernière ligne. ie D[1]=D[2]=D[3]=..D[6]; même chose pour le tableau F !
    Question :
    Est-ce que vous quelqu'un à déjà rencontrer ce problème? j'ai passé une journée entière à rechercher sur le net sans résultat

  6. #6
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 945
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant BO/Crystal Reports

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 945
    Points : 2 723
    Points
    2 723
    Par défaut
    Citation Envoyé par linger Voir le message
    Merci Luc, j'ai essayé votre code : j'obtiens toujours l'enregistrement de la dernière ligne. ie D[1]=D[2]=D[3]=..D[6]; même chose pour le tableau F !
    Question :
    Est-ce que vous quelqu'un à déjà rencontrer ce problème? j'ai passé une journée entière à rechercher sur le net sans résultat

    Bonjour,

    Fô pas craquer.. )
    le mieux est de faire une sorte de deboggage.
    Dans la ligne detail, vous mettez les champs intervenant, date de début et date de fin... vous lancez le rapport, et vous vérifier que ce sont bien les bonnes informations.
    puis vous rajoutez un premier tableau à remplir dans une seul formule... genre intervenant..
    vous finissez la formule sur le conteu du tableau

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    whileprintingrecords;
    NumberVar Index
    StringVar Array Intervenant
    Index :=Index +1
    Redim Preserve Intervenant [Index]
    Intervenant[Index]:={Intervenant}


    Et dans une autre formule à coté, vous vérifiez que l'index s'incrémente bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    whileprintingrecords;
    NumberVar Index;

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut HELP!!
    je bloque encore , je sais vraiment pas comment faire.
    j'ai essayé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    numbervar te:=0;
    datetimevar ft;
    numbervar N:=Count ({Feuil1_.OT});
    NumberVar i;
    whileprintingrecords;
    NumberVar index;
    DateTimeVar Array Debut;
    DateTimeVar Array Fin;
    while not(onlastrecord)do 
    (
    index:=index+1;
    Redim Preserve Debut[index];
    Redim Preserve Fin[index];
    Debut[index]:={Feuil1_.DATE DEBUT};
    Fin[index]:={Feuil1_.DATE FIN};
    );
    for i := 2 to N do
    (      
            if (Debut[i]<= ft and  Fin[i]<= ft) then 
            (
                ft:=ft;
                te:=te;
            )
            else if ( Debut[i]<= ft and Fin[i]> ft) then 
            ( 
                ft:=Fin[i];
                te:=te;
            )
            else if Debut[i]> ft then 
            (
            ft:=Fin[i];
            te:=te+ datediff("s",Debut[i],Fin[i-1]);
            )
    );
    te
    //Je dois ajouter à la fin les temps (D[1] - L) et (C-D[N]) à la variable
    //te pour avoir le temps d'inactivité sur tout le projet.
    le résultats de cette formule je l'ai mis dans le pied de page du rapport. quand je passe en mode aperçu je reçois le message suivant :
    "Un indice doit être compris entre 1 et la taille du tableau"
    à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (Debut[i]<= ft and  Fin[i]<= ft) then 
    quelqu'un a une idée ??

  8. #8
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 945
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant BO/Crystal Reports

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 945
    Points : 2 723
    Points
    2 723
    Par défaut
    Citation Envoyé par linger Voir le message
    je bloque encore , je sais vraiment pas comment faire.
    j'ai essayé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    numbervar te:=0;
    datetimevar ft;
    numbervar N:=Count ({Feuil1_.OT});
    NumberVar i;
    whileprintingrecords;
    NumberVar index;
    DateTimeVar Array Debut;
    DateTimeVar Array Fin;
    while not(onlastrecord)do 
    (
    index:=index+1;
    Redim Preserve Debut[index];
    Redim Preserve Fin[index];
    Debut[index]:={Feuil1_.DATE DEBUT};
    Fin[index]:={Feuil1_.DATE FIN};
    );
    for i := 2 to N do
    (      
            if (Debut[i]<= ft and  Fin[i]<= ft) then 
            (
                ft:=ft;
                te:=te;
            )
            else if ( Debut[i]<= ft and Fin[i]> ft) then 
            ( 
                ft:=Fin[i];
                te:=te;
            )
            else if Debut[i]> ft then 
            (
            ft:=Fin[i];
            te:=te+ datediff("s",Debut[i],Fin[i-1]);
            )
    );
    te
    //Je dois ajouter à la fin les temps (D[1] - L) et (C-D[N]) à la variable
    //te pour avoir le temps d'inactivité sur tout le projet.
    le résultats de cette formule je l'ai mis dans le pied de page du rapport. quand je passe en mode aperçu je reçois le message suivant : "Un indice doit être compris entre 1 et la taille du tableau" à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (Debut[i]<= ft and  Fin[i]<= ft) then 
    quelqu'un a une idée ??
    je vous ai envoyé une requête en MP.
    déjà à première vu, vous vous mélangez dans les index.. d'un coté "i" de l'autre coté "index".. il va falloir choisir..

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut problème résolu
    merci beaucoup Luc pour votre aide
    il faut faire un index dans la section détails du rapport:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WhilePrintingRecords;
    NumberVar Index:=Index+1;
    puis déclarer les tableaux comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WhilePrintingRecords;
    Datetimevar Array Tableau;
    Redim Preserve Tableau[{@index}];
    Tableau[{@index}]:={Feuil1_.DATE DEBUT};

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête select avec jointure sur des enregistrements inexitant.
    Par faistoiplaisir dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2009, 18h36
  2. Réponses: 4
    Dernier message: 24/09/2009, 20h21
  3. Réponses: 2
    Dernier message: 01/10/2008, 16h41
  4. Réponses: 2
    Dernier message: 24/09/2008, 19h14
  5. Parcourir l'ensemble des enregistrements d'une table
    Par Aurèl90 dans le forum Access
    Réponses: 17
    Dernier message: 22/09/2005, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo