|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre actif
![]() |
Bonjour,
je commence l'apprentissage des tableaux et des boucles sous SAS. J'ai une table, avec différentes dates de visite, une date peut etre vide. J'ai besoin de savoir quand à eu lieu la dernière visite. Je fais donc un tableau, où je commence par insérer la dernière visite qui était prévue.. Dans ma boucle je lui dis d'initialiser ma variable jusqu'a ce que la variable est vide (comme ça je sais quand a eu lieu ma dernière visite) mais visiblement il ne boucle pas. Exemple : dans ma table j'ai VS_1 de vide mais pas M9 donc il doit m'initialiser ma date de dernière visite à M9 et non VS_1 . Et bien non.. voici mon code : Code :
|
||
|
|
00
|
|
|
#2 | ||||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Bonjour maysa
Personnellement j'ai toujours du mal avec les "DO UNTIL"... ne sachant pas si tes variables sont classées par date croissante, voici un code dérivé a base de boucle DO i TO max Code :
Code :
sinon avec DO UNTIL en partant de l'envers et avec l'utilisation de dim() sans dim() je n'y arrive pas... Code :
|
||||||
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour.
Ca ne boucle pas parce que i n'est pas initialisé. Donc i=. dès le début de la boucle donc on n'y entre pas. La solution de Jérôme est très bien. On peut aussi se passer de l'array : la fonction COALESCE renvoie la 1e valeur non manquante parmi une liste de variables. Il faut donc écrire : Code :
derVis = COALESCE(visite10, visite9, visite8, etc., visite1) ; Bon courage. Olivier |
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Si tu souhaites conserver ton array et sa boucle, il serait plus optimal de le parcourir à l'envers (en partant de la visite la + récente), si j'ai bien compris ton besoin.
Code :
L'avantage si seule un petit nombre de dates manque, c'est qu'on fera moins de passages dans la boucle (aucun si la dernière date est renseignée) et qu'on gagnera donc du temps. |
||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
Bonjour,
Remarque peut être hors contexte, mais je ne vois pas pourquoi passer par les array. Si j'ai bien compris Mayssa a en entrée un ensemble de variables date ( VS_1 M9 M8 M7 J195 M6 J165 M5 M4 M3 J75 M2 J45 M1 J15 dchir M_3 J_7 M_6) et l'idée est de retenir la date max. Pourquoi ne pas utiliser la finction max dans une étape data ou sql? |
|
|
00
|
|
|
#6 | |||||||
|
Membre actif
![]() |
Merci pour vos réponses, je vais tenter d'y répondre individuellement..
oui mes variables sont classées par ordre chronologique... soit ordre décroissant. Alors j'ai essayé ton code est ça fonctionne ! merci Citation:
|
|||||||
|
|
00
|
|
|
#7 | |||
|
Membre actif
![]() |
ça foncitonne aussi, sauf que je l'ai fait à l'envers... (parce que mon tableau est créé de façon chronologique..
Code :
DO i=1 TO DIM(vis) WHILE(MISSING(vis{i})) ; Au final j'ai utilisé la fonction COALESCE, plus rapide , une seule ligne de code... Merci Citation:
|
|||
|
|
00
|
|
|
#8 | |
|
Membre actif
![]() |
Citation:
|
|
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Dans une étape data, tu peux avoir le max par ligne comme suit:
Code :
datevisite=max(of date1 date2 date3 date4); |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
Justement! Dans une étape data, la fonction max() renvoie le maximum d'un ensemble d'arguments (c'est à dire variable, ou encore colonnes). Cette fonction va renvoyer pour chaque la valeur maximum sur un ensemble de colonnes. Donc ça à l'air de coller avec ce que tu veux faire.
En sql, tu peux utiliser cette fonction sur des lignes ou sur des colonnes (ou les deux), il faut donc faire attention à la syntaxe. Manoutz |
|
|
00
|
|
|
#11 |
|
Membre actif
![]() |
oui mais en sql, je ne peux faire un max que sur une colonne.. soit
je ne pense pas pouvoir lui donner plusieurs colonne... Mais je ne connaissais pas la fonction max() de l'étape data, alors merci |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com