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 :

Balayer tous les resultats avec une boucle et extraire les resultats avec un If


Sujet :

Formules

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Balayer tous les resultats avec une boucle et extraire les resultats avec un If
    Bonjour a tous,

    Bon, j'ai fait moulte recherches et je reste bredouille... Donc je n'ai plus d'autres choix que de poster un message.
    J'ai une base de donnee telle que

    Incident -nom - status
    456 - Dupont - 1
    456 - Jean-Charles - 3
    456 - Marc - 3
    490 - Chateau - 3
    490 - Dupont -1
    490 - Marc - 3


    Je cherche une formule pour savoir qui est en status "1" pour chaque incident et obtenir un truc du genre:

    Incident -nom - status - personne active
    456 - Dupont - 1 - Dupont
    456 - Jean-Charles - 3 - Dupont
    456 - Marc - 3 - Dupont
    490 - Chateau - 3 - Marc
    490 - Dupont -3 - Marc
    490 - Marc - 1 - Marc

    J'ai donc essaye de rajoute une petite formule:

    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
       dim test as string
    dim i as number
    dim incidenttotal as number
    dim actualincident as number
     
    incidenttotal= Count({TASKS.INCIDENT})
    actualincident = {TASKS.INCIDENT}
     
    Dim taskstatus() as number
    Redim taskstatus(incidenttotal)
     
    Dim personresp() as string
    Redim personresp(incidenttotal)
     
    Dim incidentnum() as number
    Redim incidentnum(incidenttotal) 
     
    taskstatus = Array({TASKS.STATUS})
    personresp = Array({TASKS.ASSIGNEDTOUSER})
    incidentnum = Array({TASKS.INCIDENT})
     
     
     
    if {TASKS.STATUS}=1 then 
            formula ={TASKS.ASSIGNEDTOUSER}
    elseif {TASKS.STATUS}=3 then 
        For i=1 to (incidenttotal-1) 'incidenttotal-1
            if (incidentnum(i) = actualincident and taskstatus(i)=1) then 
                    formula = personresp(i)
                    exit for
             end if
        Next i
    End If
     
    formula = test
    Mais attention! En fait je ne peux pas faire de groupe incident (ce qui aiderait pas mal) car je suis obligee de faire des groupe par personne (nom)...
    Je suis passee en Basic Syntax car je n'arrivais pas a me debarasser de toutes les erreurs du type "a boolean is required here".
    Maintenant il ne detecte plus d'erreur mais quand je save et close j'ai une remarque :
    A subscript must be between 1 and the size of the array
    Pourquoi?
    Merci de m'aider.

  2. #2
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 942
    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 942
    Points : 2 720
    Points
    2 720
    Par défaut
    bonsoir, tu as plein de solution. mais pour ton problème actuel... il serait judicieux de verifier la taille de ton tableau..avec un "ubound".. et de ne pas dépasser cette taille dans ta boucle...
    Luc

    Disponible - Intervention sur demande tout pays, toutes régions
    Formateur Crystal Reports (toutes versions)
    Contrat de support possible
    N'hésitez pas.... http://paypal.me/lucrascar

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Ben ca ne marche pas pour autant
    Mais ca m'a permis de cerner mon probleme: Je n'enregistre qu'un record (enregistrement)...le premier. Donc le tableau est limite a 1. Facheux quand il y a plus de 1000 records!
    J'ai donc encore bidouille:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    dim i as number
    dim incidenttotal as number
    dim actualincident as number
    
    actualincident = {TASKS.INCIDENT}
    
    Shared taskstatus() as number
    Shared personresp() as string
    Shared incidentnum() as number
    
    'ci dessous la fonction Array qui finalement n'enregistre que ma premiere ligne (/enregistrement)... donc inutile >.<[/
    taskstatus = Array({TASKS.STATUS})
    personresp = Array({TASKS.ASSIGNEDTOUSER})
    incidentnum = Array({TASKS.INCIDENT})
    
    
    if {TASKS.STATUS}=1 then 
            formula ={TASKS.ASSIGNEDTOUSER}
    
    elseif {TASKS.STATUS}=3 then 
        '{INCIDENTS.INCIDENT}=actualincident 
           whileprintingrecords
           i=1
    'j'essaie donc de lui faire parcourir les enregistrements en redimensionnant ma table a chaque fois:
          Do While Not(onlastrecord)
            redim preserve incidentnum(i)
            Redim preserve taskstatus(i)
            Redim preserve personresp (i) 
    
     'mais le fourbe avec les formules ci-dessous n'enregistre que la premiere ligne a repetition.... 1000 fois!!! Du coup j'ai  personresp="Dupont","Dupont","Dupont",... incidentnum = "456", "456","456","456",...:calim2: C'est frustrant!     
            taskstatus(i) = {TASKS.STATUS}
            personresp(i) = {TASKS.ASSIGNEDTOUSER}
            incidentnum(i) = {TASKS.INCIDENT}   
            i=i+1  
            If i>1000 then
                Exit Do [COLOR="SeaGreen"]'car visiblement on ne peut pas depasser 1000, est-ce vrai?[/COLOR]
            End If  
        Loop
    
    'persuadee d'avoir enregistre toutes mes donnees dans des tableau je parcours ces tableau... mais comme c'est 1000 fois les meme donnees, ca ne sert pas a grand chose
        For i=1 to 266
            if (incidentnum(i) = actualincident and taskstatus(i)=1) then 
                   formula =personresp(i)
             end if
        Next
    elseif {TASKS.STATUS}=4 then 
        formula = "abort"
    End If
    
    'formula = test

    Au final je n'obtiens rien... donc comment rentrer tous les enregistrements dans un tableau?

  4. #4
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 942
    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 942
    Points : 2 720
    Points
    2 720
    Par défaut
    bonjour

    Deuxième indice.

    tu te rends compte que tu demande à Crystal de t'afficher une information qu'il ne connait pas encore lorsque tu lui demande..."afficher le rang 1 de 'incident 590 que je n'ai pas encore fini de lire, parce qu'il y en a peut être encore à la fin de ma table..."
    Ce type de problématique est généralement résolue, en faisant une première passe dans un sous rapport. dans lequel tu fais tes traitements (là tu pourras faire tes groupes) et sélectionner le rang 1 que tu pourras mettre dans une variable partagée).
    Luc

    Disponible - Intervention sur demande tout pays, toutes régions
    Formateur Crystal Reports (toutes versions)
    Contrat de support possible
    N'hésitez pas.... http://paypal.me/lucrascar

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    erf... mais comment faire??
    un troisieme indice??

  6. #6
    Modérateur
    Avatar de luc_chivas
    Profil pro
    Consultant BO/Crystal Reports
    Inscrit en
    Avril 2004
    Messages
    1 942
    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 942
    Points : 2 720
    Points
    2 720
    Par défaut
    tel que je le vois moi...
    dans un sous rapport,
    j'initialise 2 tableaux en shared
    je crée mes groupes sur les incidents.
    en entête de groupe, je redimensionne mes tableaux (+1)
    dans le détails et je stocke le numéro d'incident (premier tableau)et le nom du numéro 1 (deuxieme tableau)
    Je passe ces 2 tableaux au rapport principal.

    Dans le rapport principal., dans la partie détails, je fais une boucle pour trouver le numéro d'incident dans le premier tableau.. et je récupère l'index pour afficher le nom correspondant à cet index du deuxième tableau.
    Ce n'est peut être pas clair... mais pas évident à raconter.. )
    Luc

    Disponible - Intervention sur demande tout pays, toutes régions
    Formateur Crystal Reports (toutes versions)
    Contrat de support possible
    N'hésitez pas.... http://paypal.me/lucrascar

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    argh! Pourquoi cette discussion a ete fermee? J'ai besoin de temps moi pour essayer Surtout que je me depatouille pas mal.
    Alors j'ai cree mon sub report. Je n'ai pas cree de groupe mais j'ai fait une selection sur les status 1, comme ca il peut enregistrer toutes les registres.
    J'ai cree des parametres (qui ne servent a rien car chaque fois que j'essaie de les mettres CR me dit qu'il y a une erreur), mais je peux balayer mes records... ou presque >.<

    Car oui il balaie, mais il va balayer le premier non: personrespo=("M","A","R","T"...)

    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
     
    dim test as string
    dim i as number
    dim incidenttotal as number
    dim actualincident as number
    dim temp as string
    
    Shared taskstatus() as number
    Shared personresp() as string
    Shared incidentnum() as number
    
    
    taskstatus = Array({TASKS.STATUS})
    'personresp =Array ({TASKS.ASSIGNEDTOUSER})
    incidentnum = Array({TASKS.INCIDENT})
    
     
    
    whileprintingrecords
    i=1
    Do While Not(onlastrecord)
        redim preserve incidentnum(i)
        Redim preserve taskstatus(i)
        Redim preserve personresp (i) 
        'taskstatus(i) = {TASKS.STATUS}(i)
        personresp(i) ={TASKS.ASSIGNEDTOUSER}(i)
        'incidentnum(i) = {TASKS.INCIDENT}(i) 'Et celui ci ne marche pas car il semble qu'il n'ait pas le bon format, CR me demande un string alors que tout est number >.<   
        i=i+1  
        If i>1000 then
            Exit Do
        End If  
    Loop
    Formula="mu"
    Voila, donc si deja c'est mal enregistre au niveau du subreport ca ne sert a rien de le faire remonter pour le moment.. mais peut etre ai je loupe une etape

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 202
    Points : 258
    Points
    258
    Par défaut
    C'est beaucoup plus simple de faire une jointure sur le champs incident de la table INCIDENTS avec elle meme ( aliassée INCIDENTS_1 par exemple ) et ajouter AND {INCIDENTS_1.STATUS} = 1 dans la sélection d'enregistrement

    Gaelle

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/07/2014, 10h12
  2. Réponses: 3
    Dernier message: 20/02/2014, 15h34
  3. [2008R2] Procédure stockée avec une boucle sur les resultat
    Par sak_ura dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/02/2013, 09h23
  4. afficher tous les resultats d'une boucle
    Par voyageurdumonde dans le forum Langage
    Réponses: 7
    Dernier message: 04/10/2010, 20h50
  5. [MySQL] Création de variables dans une boucle et récupération de données avec une requête
    Par lavande4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/09/2008, 11h10

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