cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Browse apps to extend the software in the new JMP Marketplace
Choose Language Hide Translation Bar
ComplexNerd
Level III

Column Switcher Appled to All Open reports

Hi guys,

 

I am trying to write a script to apply column switcher to all open reports. Please guide me

 

dt = Current data Table();
//Get all Open reports
wList = Get Window List( Type( "Reports" ) );

//Get Column to replace and column to replace with
win = New Window( "Set a Value",
	<<Modal,
	<<Return Result,
	H List Box(
		ColumnSwitcherObject = dt << Column Switcher(),
		colList = dt << Col List Box()
	),
	Button Box( "OK" ),
	Button Box( "Cancel" )
	
);

//Now i want to loop through all reports and check if data table matches then replace column with selected column

If( win["Button"] == 1,
wList = Get Window List( Type( "Reports" ) );
for(i=1,i <= nitems(wList),i++,
	curWin = wList[i][Outline Box( 1 )][Outline Box( 1 )];
	curWinObj = curWin << get scriptable object;
	curWinDt = curWinObj << Get Datatable;
		if (curWinDt == dt )
		{
			//Replace all istance of column in list box of widow and col switcher
		}
)

Please guide how to do this action.

 

Thanks in advance

1 ACCEPTED SOLUTION

Accepted Solutions
jthi
Super User

Re: Column Switcher Appled to All Open reports

There seems to be few different bugs/weird interactions which are making this more difficult than I thought and because of that the code is very messy, but it seems to work on some level

Names Default To Here(1);

get_reports_for_datatable = function({dt}, {Default Local},
	valid_reports = {};
	
	// This might need improvements
	report_windows = Get Window List(Type("Reports"));
	
	For Each({report_window}, report_windows,
		Try(
			cur_analytic_layer = report_window[OutlineBox(1)] << Get Scriptable Object;
			cur_dt = cur_analytic_layer << Get Data Table;
			If(cur_dt == dt,
				Insert Into(valid_reports, cur_analytic_layer);
			);
		,
			show(exception_msg);
		);
	);
	return(valid_reports);
);

// I would use function, but there seem to be some bugs 
swap_report_columns = Expr(

	Eval(EvalExpr(
		nw_switcher = New Window("Switcher", << Window View("Invisible"),
			vlb2 = V List Box(
				ref_colswitcher2 = dt << Column Switcher(Expr(NameExpr(AsColumn(dt, old_col))),
					{Expr(NameExpr(AsColumn(dt, old_col))), Expr(NameExpr(AsColumn(dt, new_col)))}
				)
			)
		);
	));
	
	Batch Interactive(1);
	For Each({report, idx}, report_list,
		//report = report_list[2]
		
		nw1 = New Window("", << Window View("Invisible"),
			ref_colswitcher1 = dt << Column Switcher(Expr(NameExpr(AsColumn(dt, old_col))),
				{Expr(NameExpr(AsColumn(dt, old_col))), Expr(NameExpr(AsColumn(dt, new_col)))}
			)
		);
		
		lc = Log Capture(ref_colswitcher1 << Link Platform(report));
		ref_colswitcher1 << Remove Column Switcher;
		nw1 << Close Window;
		
		If(Is Missing(lc),
			Log Capture(
				Try(ref_colswitcher2 << Link Platform(report));
			);
		);
		
		wait(0);
	);
	Batch Interactive(0);
	Try(vlb2[ListBoxBox(1)] << Set Selected(2));
	
	wait(0);
	ref_colswitcher2 << Remove Column Switcher;
	
	Caption(remove);

	nw_switcher << Close Window;	
);

swap_columns = Expr(
	nw = New Window("Swap report columns", << Type("Launcher"),
		window:dt = Current Data Table(),
		H List Box(
			Lineup Box(N Col(2),
				Panel Box("Select Column to Change",
					fcs1 = Filter Col Selector(dt, << Set Max Selected(1))
				),
				Panel Box("Select New Column",
					fcs2 = Filter Col Selector(dt, << Set Max Selected(1))
				)
			),
			Panel Box("Action",
				Button Box("Change Columns",
					report_list = get_reports_for_datatable(dt);
					old_col = (fcs1 << get selected)[1];
					new_col = (fcs2 << get selected)[1];
					Try(swap_report_columns);
				),
				Button Box("Cancel",
					fcs1 << close window;
				),
			)
		)
	);
);

dt = Open("$SAMPLE_DATA/Probe.jmp");
dt << Clear Row States;

dist = dt << Distribution(Continuous Distribution(Column(:DELL_RPNBR)));
dist2 = dt << Distribution(Continuous Distribution(Column(:DELW_M1)));

gb1 = dt << Graph Builder(
	Size(528, 448),
	Show Control Panel(0),
	Variables(X(:Site), Y(:Lot ID)),
	Elements(Points(X, Y, Legend(3)))
);
gb2 = dt << Graph Builder(
	Size(523, 454),
	Show Control Panel(0),
	Variables(X(:DELW_M1), Y(:DELL_RPNBR)),
	Elements(Points(X, Y, Legend(3)))
);

swap_columns;

Write();
-Jarmo

View solution in original post

4 REPLIES 4
jthi
Super User

Re: Column Switcher Appled to All Open reports

How do you wish to use Col List Box? Column Switcher requires you to have a single column which is then changed to other column (based on the column list on Column Switcher) and this column should be the same in all of the reports at the start.

-Jarmo
ComplexNerd
Level III

Re: Column Switcher Appled to All Open reports

@jthi , My bad im sorry.. I guess instead of column switcher its more esay to have 2 colList Box where user selects column to replace in 1st and column to replace with in 2nd.. Is this approach more suitable

jthi
Super User

Re: Column Switcher Appled to All Open reports

I think that might be a bit easier. I don't have time to write proper solution, but below is an idea how I would approach this (use column switcher to change columns which you create on function call + "Ask forgiveness, not permission"). It still has hard-coded things in it, but I will get back to it later today or tomorrow and make it more robust as this is interesting problem.

Names Default To Here(1);

dt = Open("$SAMPLE_DATA/Probe.jmp");
dt << Clear Row States;

New Window("",
	Lineup box(N Col(2),
		dist = dt << Distribution(Continuous Distribution(Column(:DELL_RPNBR))),
		dist2 = dt << Distribution(Continuous Distribution(Column(:DELW_M1))),
		gb1 = dt << Graph Builder(
			Size(528, 448),
			Show Control Panel(0),
			Variables(X(:Site), Y(:Lot ID)),
			Elements(Points(X, Y, Legend(3)))
		),	
		gb2 = dt << Graph Builder(
			Size(523, 454),
			Show Control Panel(0),
			Variables(X(:DELW_M1), Y(:DELL_RPNBR)),
			Elements(Points(X, Y, Legend(3)))
		)
	)
);

nw = New Window("",
	H List Box(
		Lineup Box(N Col(2),
			Panel Box("Select Column to Change",
				fcs1 = Filter Col Selector(dt, << Set Max Selected(1))
			),
			Panel Box("Select New Column",
				fcs2 = Filter Col Selector(dt, << Set Max Selected(1))
			)
		),
		Panel Box("Action",
			Button Box("Change Columns"),
			Button Box("Cancel"),
		)
	)
);

update_reports = function({dt, report_list, old_col, new_col}, {Default Local},
	nw_switcher = New Window("", << Window View("Invisible"),
		ref_colswitcher = dt << Column Switcher(:DELL_RPNBR, {:DELW_SICR, :DELL_RPNBR});
	);
	wait(0);

	For Each({report}, report_list,
		Try(ref_colswitcher << Link Platform(report));
	);
	wait(0);
	
	nw_switcher[ListBoxBox(1)] << Set Selected(1);
	nw_switcher << Close Window;
	
);

reports = Eval List({dist, dist2, gb1, gb2});

update_reports(dt, reports, "a", "b");

-Jarmo
jthi
Super User

Re: Column Switcher Appled to All Open reports

There seems to be few different bugs/weird interactions which are making this more difficult than I thought and because of that the code is very messy, but it seems to work on some level

Names Default To Here(1);

get_reports_for_datatable = function({dt}, {Default Local},
	valid_reports = {};
	
	// This might need improvements
	report_windows = Get Window List(Type("Reports"));
	
	For Each({report_window}, report_windows,
		Try(
			cur_analytic_layer = report_window[OutlineBox(1)] << Get Scriptable Object;
			cur_dt = cur_analytic_layer << Get Data Table;
			If(cur_dt == dt,
				Insert Into(valid_reports, cur_analytic_layer);
			);
		,
			show(exception_msg);
		);
	);
	return(valid_reports);
);

// I would use function, but there seem to be some bugs 
swap_report_columns = Expr(

	Eval(EvalExpr(
		nw_switcher = New Window("Switcher", << Window View("Invisible"),
			vlb2 = V List Box(
				ref_colswitcher2 = dt << Column Switcher(Expr(NameExpr(AsColumn(dt, old_col))),
					{Expr(NameExpr(AsColumn(dt, old_col))), Expr(NameExpr(AsColumn(dt, new_col)))}
				)
			)
		);
	));
	
	Batch Interactive(1);
	For Each({report, idx}, report_list,
		//report = report_list[2]
		
		nw1 = New Window("", << Window View("Invisible"),
			ref_colswitcher1 = dt << Column Switcher(Expr(NameExpr(AsColumn(dt, old_col))),
				{Expr(NameExpr(AsColumn(dt, old_col))), Expr(NameExpr(AsColumn(dt, new_col)))}
			)
		);
		
		lc = Log Capture(ref_colswitcher1 << Link Platform(report));
		ref_colswitcher1 << Remove Column Switcher;
		nw1 << Close Window;
		
		If(Is Missing(lc),
			Log Capture(
				Try(ref_colswitcher2 << Link Platform(report));
			);
		);
		
		wait(0);
	);
	Batch Interactive(0);
	Try(vlb2[ListBoxBox(1)] << Set Selected(2));
	
	wait(0);
	ref_colswitcher2 << Remove Column Switcher;
	
	Caption(remove);

	nw_switcher << Close Window;	
);

swap_columns = Expr(
	nw = New Window("Swap report columns", << Type("Launcher"),
		window:dt = Current Data Table(),
		H List Box(
			Lineup Box(N Col(2),
				Panel Box("Select Column to Change",
					fcs1 = Filter Col Selector(dt, << Set Max Selected(1))
				),
				Panel Box("Select New Column",
					fcs2 = Filter Col Selector(dt, << Set Max Selected(1))
				)
			),
			Panel Box("Action",
				Button Box("Change Columns",
					report_list = get_reports_for_datatable(dt);
					old_col = (fcs1 << get selected)[1];
					new_col = (fcs2 << get selected)[1];
					Try(swap_report_columns);
				),
				Button Box("Cancel",
					fcs1 << close window;
				),
			)
		)
	);
);

dt = Open("$SAMPLE_DATA/Probe.jmp");
dt << Clear Row States;

dist = dt << Distribution(Continuous Distribution(Column(:DELL_RPNBR)));
dist2 = dt << Distribution(Continuous Distribution(Column(:DELW_M1)));

gb1 = dt << Graph Builder(
	Size(528, 448),
	Show Control Panel(0),
	Variables(X(:Site), Y(:Lot ID)),
	Elements(Points(X, Y, Legend(3)))
);
gb2 = dt << Graph Builder(
	Size(523, 454),
	Show Control Panel(0),
	Variables(X(:DELW_M1), Y(:DELL_RPNBR)),
	Elements(Points(X, Y, Legend(3)))
);

swap_columns;

Write();
-Jarmo