<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Durée in Discussions</title>
    <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639788#M83735</link>
    <description>&lt;P&gt;A bit lazy solution, but it might work&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-jsl"&gt;Names Default To Here(1);

dt = Open("$DOWNLOADS/AAAA.jmp");

// would get only numeric columns, but the provided example table is broken...
all_cols = dt &amp;lt;&amp;lt; Get Column Names(/*Numeric, */"String"); 
// so first we have to fix the datatable
Remove From(all_cols, 1, 2);
For Each({col_name}, all_cols,
	Column(dt, col_name) &amp;lt;&amp;lt; Set Data Type("Numeric");
	Column(dt, col_name) &amp;lt;&amp;lt; Set Modeling Type("Continuous");
);

// create list of duration columns
// same amount of columns AND in same order for "number" and duration
date_cols = {};
some_cols = {};

For Each({col_name}, all_cols,
	If(Starts With(lowercase(col_name), "date d"),
		Insert Into(date_cols, col_name);
	, !IsMissing(Regex(col_name, "^\d+$")),
		Insert Into(some_cols, col_name);
	,
		show(col_name);
	);
);

If(N Items(date_cols) != N Items(some_cols),
	Throw("Column mismatch");
);

// create new columns
dur_cols = {};
For Each({some_col}, some_cols,
	new_col = dt &amp;lt;&amp;lt; New Column("duration " || some_col, Numeric, Continuous);
	Insert Into(dur_cols, new_col &amp;lt;&amp;lt; get name);
);

// calculation
For Each Row(
	For Each({date_col, idx}, date_cols,
		datesomething = dt[Row(), some_cols[idx]];
		datesomethingvals = dt[Row(), some_cols];
		// to make comparison easier
		datesomethingvals[idx] = .; 
		datesomethingvals[Loc(datesomethingvals &amp;lt; datesomething)] = .; // lazy handling
				
		idx_of_interest = Loc Min(Abs(datesomethingvals - datesomething));
		If(idx_of_interest == 0,
			continue();
		);
		val_of_interest = dt[Row(), date_cols[idx_of_interest]];

		dt[Row(), dur_cols[idx]] = Abs(val_of_interest - dt[Row(), date_col]); // not sure if Abs is correct here
	);
);

// durations for 900 and 4500 for some reason missing from demo data&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Wed, 07 Jun 2023 11:11:46 GMT</pubDate>
    <dc:creator>jthi</dc:creator>
    <dc:date>2023-06-07T11:11:46Z</dc:date>
    <item>
      <title>Durée</title>
      <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639718#M83724</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;Bonjour à tous,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Je dispose d’une base de données comme ci-dessous,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="hcarr01_1-1686121505316.png" style="width: 400px;"&gt;&lt;img src="https://community.jmp.com/t5/image/serverpage/image-id/53473i1E2185F7CA350AF2/image-size/medium?v=v2&amp;amp;px=400" role="button" title="hcarr01_1-1686121505316.png" alt="hcarr01_1-1686121505316.png" /&gt;&lt;/span&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BR /&gt;&lt;P&gt;&lt;SPAN&gt;Dans la BD, les cellules vertes sont les résultats que l’on aimerait obtenir.&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;J’aimerai créer un script pour calculer des durées.&lt;/DIV&gt;&lt;DIV&gt;Je dispose de colonnes «&amp;nbsp;date début&amp;nbsp;» et ensuite je dispose de colonne «&amp;nbsp;numéro&amp;nbsp;» qui indique l’ordre d’exécution.&lt;/DIV&gt;&lt;DIV&gt;Le but serait de calculer «&amp;nbsp;date début y - date début x&amp;nbsp;» en fonction des numéros.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;U&gt;Je m’explique sur un exemple avec la BD :&lt;/U&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;EM&gt;1ère ligne&lt;/EM&gt; : Nous remarquons que la colonne «&amp;nbsp;720&amp;nbsp;» possède le numéro 12 dans la cellule, donc nous cherchons parmi toutes les colonnes «&amp;nbsp;numéros&amp;nbsp;» le premier supérieur à 12 (ici colonne «&amp;nbsp;740&amp;nbsp;» avec la valeur 21)&lt;/DIV&gt;&lt;DIV&gt;Donc la durée 720 serait durée 720 = date début 740 - date début 720.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Ensuite pour durée 740 cela serait durée 740 = date début 9801 - date début 740 avec la même principe&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;U&gt;Voici ci-dessous le script que j’ai commencé à écrire :&lt;/U&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;CODE class=" language-jsl"&gt;dt = Current Data Table();

dur_cols = Filter Each( {col_name}, dt &amp;lt;&amp;lt; Get Column Names( "String", Continuous ),
	Starts With( col_name, "Date début" ) 	
);


num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );

char_cols = dt &amp;lt;&amp;lt; Get Column Names ("string", Character);	



wait(1);
N_taches = N Items(dur_cols);
for (i = 1, i &amp;lt;= N_taches, i++, 
	Eval(
		Eval Expr(
			col = dt &amp;lt;&amp;lt; New Column ( "durée" || num_colnr[i], Numeric, "Continuous", Format(":jou:hh:m",8));
			col &amp;lt;&amp;lt; Formula(
				colidx = Loc(dt[row(), char_cols] &amp;gt; Eval(num_colnr[i]))[1];
				If ( N Items(colidx) &amp;gt; 0,
					val = dur_cols[colidx] - Eval(dur_cols[i]);
					If(IsMissing(val),
						0
					,
						val
			);
		,
			0
		);
	);
)));&lt;/CODE&gt;&lt;/PRE&gt;&lt;FONT&gt;Merci pour votre aide !&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;</description>
      <pubDate>Sun, 11 Jun 2023 00:02:03 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639718#M83724</guid>
      <dc:creator>hcarr01</dc:creator>
      <dc:date>2023-06-11T00:02:03Z</dc:date>
    </item>
    <item>
      <title>Re: Durée</title>
      <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639727#M83726</link>
      <description>&lt;P&gt;Maybe something like this:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-jsl"&gt;For(k=1, k&amp;lt;=6, k++,
	StartValue = Column(k+2)[1];
	For(i=1, i&amp;lt;=6, i++,
		If(num(Column(i+8)[1])&amp;gt;StartValue,break())
	);
	If(i&amp;lt;7, Write(Column("Date début "||(Column(i+8)&amp;lt;&amp;lt;get name()))[1]-StartValue));
);&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 07 Jun 2023 07:45:26 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639727#M83726</guid>
      <dc:creator>pauldeen</dc:creator>
      <dc:date>2023-06-07T07:45:26Z</dc:date>
    </item>
    <item>
      <title>Re: Durée</title>
      <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639733#M83728</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Merci pour votre réponse &lt;a href="https://community.jmp.com/t5/user/viewprofilepage/user-id/92"&gt;@pauldeen&lt;/a&gt;&amp;nbsp;mais il s'agit ici d'une base de données test, ce script devrait fonctionner pour plus de 700 colonnes.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 07 Jun 2023 07:51:21 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639733#M83728</guid>
      <dc:creator>hcarr01</dc:creator>
      <dc:date>2023-06-07T07:51:21Z</dc:date>
    </item>
    <item>
      <title>Re: Durée</title>
      <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639788#M83735</link>
      <description>&lt;P&gt;A bit lazy solution, but it might work&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-jsl"&gt;Names Default To Here(1);

dt = Open("$DOWNLOADS/AAAA.jmp");

// would get only numeric columns, but the provided example table is broken...
all_cols = dt &amp;lt;&amp;lt; Get Column Names(/*Numeric, */"String"); 
// so first we have to fix the datatable
Remove From(all_cols, 1, 2);
For Each({col_name}, all_cols,
	Column(dt, col_name) &amp;lt;&amp;lt; Set Data Type("Numeric");
	Column(dt, col_name) &amp;lt;&amp;lt; Set Modeling Type("Continuous");
);

// create list of duration columns
// same amount of columns AND in same order for "number" and duration
date_cols = {};
some_cols = {};

For Each({col_name}, all_cols,
	If(Starts With(lowercase(col_name), "date d"),
		Insert Into(date_cols, col_name);
	, !IsMissing(Regex(col_name, "^\d+$")),
		Insert Into(some_cols, col_name);
	,
		show(col_name);
	);
);

If(N Items(date_cols) != N Items(some_cols),
	Throw("Column mismatch");
);

// create new columns
dur_cols = {};
For Each({some_col}, some_cols,
	new_col = dt &amp;lt;&amp;lt; New Column("duration " || some_col, Numeric, Continuous);
	Insert Into(dur_cols, new_col &amp;lt;&amp;lt; get name);
);

// calculation
For Each Row(
	For Each({date_col, idx}, date_cols,
		datesomething = dt[Row(), some_cols[idx]];
		datesomethingvals = dt[Row(), some_cols];
		// to make comparison easier
		datesomethingvals[idx] = .; 
		datesomethingvals[Loc(datesomethingvals &amp;lt; datesomething)] = .; // lazy handling
				
		idx_of_interest = Loc Min(Abs(datesomethingvals - datesomething));
		If(idx_of_interest == 0,
			continue();
		);
		val_of_interest = dt[Row(), date_cols[idx_of_interest]];

		dt[Row(), dur_cols[idx]] = Abs(val_of_interest - dt[Row(), date_col]); // not sure if Abs is correct here
	);
);

// durations for 900 and 4500 for some reason missing from demo data&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 07 Jun 2023 11:11:46 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/639788#M83735</guid>
      <dc:creator>jthi</dc:creator>
      <dc:date>2023-06-07T11:11:46Z</dc:date>
    </item>
    <item>
      <title>Re: Durée</title>
      <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/640353#M83769</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Merci pour votre réponse&amp;nbsp;&lt;a href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366"&gt;@jthi&lt;/a&gt;&amp;nbsp; !&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 08 Jun 2023 13:07:12 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/640353#M83769</guid>
      <dc:creator>hcarr01</dc:creator>
      <dc:date>2023-06-08T13:07:12Z</dc:date>
    </item>
    <item>
      <title>Re: Durée</title>
      <link>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/641874#M83884</link>
      <description>&lt;P&gt;So? Just up the For loop count number. Or make it dynamic by including N cols() as the upper bound.&lt;/P&gt;&lt;P&gt;If you have allready solved this would you please mark this topic as solved?&lt;/P&gt;</description>
      <pubDate>Tue, 13 Jun 2023 14:59:26 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/Dur%C3%A9e/m-p/641874#M83884</guid>
      <dc:creator>pauldeen</dc:creator>
      <dc:date>2023-06-13T14:59:26Z</dc:date>
    </item>
  </channel>
</rss>

