Pulsante a levetta o qualcosa di simileCiao comunità JMP,
Sto cercando di impostare una finestra in cui gli utenti possono selezionare mesi diversi, o trimestri, o l'intero YTD, che fornisca anche un feedback su quali caselle dei pulsanti sono state selezionate (o anche deselezionate). Il mio intento è di usare in ultima analisi la selezione mese/trimestre/YTD come un modo per creare un sottoinsieme di una tabella dati basata sul mese (l'anno è sempre impostato sull'anno corrente per ora).
Ecco una finestra su ciò a cui sto pensando:

Ogni volta che si seleziona un mese, il codice definirà una variabile come "01" per gennaio, "05" per maggio o "1" per Q1, ecc. Ciò che vorrei è che il pulsante sembrasse "cliccato" perché sembra premuto, o meglio che assumesse un colore evidenziato, come il blu. Qualcosa di simile a ciò che accade nella piattaforma Data Filter, come quando si usa Big Class e si aggiunge un Data Filter locale per :name, dove il nome è evidenziato e si può effettuare più di una selezione alla volta. Oltre a mostrare che il pulsante è stato selezionato, vorrei che mostrasse se il pulsante è stato deselezionato, proprio come una casella di controllo che mostra che è contrassegnato o meno, ma non voglio usare caselle di controllo perché sono meno accattivanti visivamente.

Il codice per la finestra che ho creato è simile a (vedi sotto) e, naturalmente, quando l'utente clicca su "OK", il codice creerà la tabella dei dati del sottoinsieme e chiuderà anche la finestra di selezione. Nell'impostare la variabile per il mese selezionato "mo#", esiste un modo meno macchinoso per assegnarle il valore 01Gen2024 rispetto al codice AsDate(Date DMY(dd,mm,yyyy))? Funziona benissimo, è solo un po' macchinoso.
Names Default To Here( 1 );
yr = Year( Today() );
subwin = New Window( "Select Subset",
<<TYPE></TYPE>
<P>Ogni aiuto è molto apprezzato!</P>
<P> </P>
<P>Grazie!,</P>
<P>S.S.</P><LINGO-LABS id="lingo-labs-809673" slang="en-US" mode="CREATE"><LINGO-LABEL>Automazione e scripting</LINGO-LABEL><LINGO-LABEL>Fusione e pulizia dei dati</LINGO-LABEL><LINGO-LABEL>Personalizzazione di massa</LINGO-LABEL><LINGO-LABEL>Finestre</LINGO-LABEL></LINGO-LABS>Re: Pulsante a levetta o qualcosa di simileCiao @jthi e @txnelson ,
Grazie a entrambi per il prezioso feedback. Tutti i vostri suggerimenti mi hanno dato qualche idea su cosa lavorare e come modificare il codice esistente per ottenere ciò di cui avevo bisogno. Mi è piaciuta l'idea di @txnelson sulla data di inizio e di fine, ma sfortunatamente non consente la selezione non continua di mesi e/o trimestri. Ad esempio, un utente potrebbe selezionare gennaio e settembre come mesi o Q1 e Q4 come trimestri per poi prendere il sottoinsieme. Quindi, ho dovuto riscriverlo per consentire date non continue. Ho persino inserito un controllo se l'utente stava selezionando mesi e trimestri o YTD e qualsiasi combinazione, in modo che dovesse tornare indietro e selezionare solo un gruppo o un altro.
La mia soluzione a questo è stata in realtà quella di usare Associative Arrays, e sono stato soddisfatto del risultato, oltre che dell'utilizzo di AA, dato che non ho lavorato molto con loro. Il codice che ho elaborato è di seguito. So che non è molto elegante o compatto, ma funziona e fa il suo lavoro, che a volte è tutto ciò di cui c'è bisogno, giusto?!;)
Grazie per tutto l'aiuto e il feedback veloce. Adoro poter porre un problema su questo forum e poi meno di 24 ore dopo avere uno script funzionante che risolve tutti i problemi di cui avevo bisogno. Di seguito il codice che ho finito per scrivere:
Names Default To Here( 1 );
dt = Current Data Table();
yr = Year( Today() );
MonthAA = Associative Array( {"M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12"}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} );
QAA = Associative Array( {"Q1", "Q2", "Q3", "Q4"}, {1, 2, 3, 4} );
YTDAA = Associative Array( {"YTD"}, {12} );
MonthList = {};
QList = {};
QMonths = {};
YTDList = {};
ClearExpr = Expr(
dt << Clear Select;
MonthList = {};
QList = {};
QMonths = {};
YTDList = {};
BB1 << Set( 0 );
BB2 << Set( 0 );
BB3 << Set( 0 );
BB4 << Set( 0 );
BB5 << Set( 0 );
BB6 << Set( 0 );
BB7 << Set( 0 );
BB8 << Set( 0 );
BB9 << Set( 0 );
BB10 << Set( 0 );
BB11 << Set( 0 );
BB12 << Set( 0 );
BB13 << Set( 0 );
BB14 << Set( 0 );
BB15 << Set( 0 );
BB16 << Set( 0 );
BB17 << Set( 0 );
);
OKExpr = Expr(
dt << Clear Select;
MonthList = {};
QList = {};
QMonths = {};
YTDList = {};
For( i = 1, i <= 17, i++,
tempBB = Eval( Parse( "BB" || Char( i ) ) ) << Get;
If( tempBB == 1,
If(
Substr( Eval( Parse( "Sel" || Char( i ) ) ), 1, 1 ) == "M", Insert Into( MonthList, Eval( Parse( "Sel" || Char( i ) ) ) ),
Substr( Eval( Parse( "Sel" || Char( i ) ) ), 1, 1 ) == "Q", Insert Into( QList, Eval( Parse( "Sel" || Char( i ) ) ) ),
Substr( Eval( Parse( "Sel" || Char( i ) ) ), 1, 1 ) == "Y", Insert Into( YTDList, Eval( Parse( "Sel" || Char( i ) ) ) )
)
);
);
If(
N Items( MonthList ) != 0 & N Items( QList ) != 0 | N Items( MonthList ) != 0 & N Items( YTDList ) != 0 | N Items( QList ) != 0 &
N Items( YTDList ) != 0,
ErrorWin = New Window( "Error Window",
<<TYPE></TYPE>
<P>Grazie!,</P>
<P>S.S.</P>
<P> </P>Re: Pulsante a levetta o qualcosa di simileNon sono sicuro di come appaiono i tuoi dati o di come desideri effettuare le selezioni, ma separerei l'interfaccia utente e la logica. Ho apportato delle modifiche alla tua interfaccia utente, ma non è necessario, questo rende solo un po' più facile raccogliere i pulsanti. Questo dimostrerà solo come puoi costruire le date dai mesi, non lo farà per YTD o trimestri, perché non sono sicuro di come li userai
Names Default To Here(1);
get_dates = Expr(
months = Loc(m_buttons << get, 1);
qs = Loc(q_buttons << get, 1);
ys = Loc(y_buttons << get, 1);
// loop over as necessary to create the combinations
dates_to_find = Transform Each({month}, months,
Date DMY(01, month, yr);
);
);
yr = Year(Today());
subwin = New Window("Select Subset",
<<TYPE></TYPE>Re: Pulsante a levetta o qualcosa di simileEcco una rielaborazione del tuo JSL... non è stato realmente testato, tuttavia dovrebbe essere abbastanza simile da poterlo utilizzare per completare la tua richiesta
Names Default To Here( 1 );
dt=current data table();
theYear = Year( Today() );
resetbb = Expr(
For( i = 1, i <= 17, i++,
Eval( Parse( "bb" || Char( i ) || "<< enable(1);" ) )
)
);
subwin = New Window( "Select Subset",
<<TYPE>= :Date < endDate );
dtSubset = dt << subset( selected columns( 0 ), selected rows( 1 ) );
subwin << Close Window;
),
Button Box( "Cancel/Exit", subwin << Close Window )
)
)
);
</TYPE>
Re: Pulsante a levetta o qualcosa di simileCiao @jthi ,
Questo ha sicuramente risolto il problema del toggle che cercavo. Ora, l'unica sfida è come impostare la struttura logica quando qualcuno clicca su "OK" in modo che selezioni solo quelle righe mm/yyyy nella tabella dati per tutte le possibili combinazioni di mesi selezionati o trimestri, ecc. Sto cercando di pensare a un modo per cui questo non diventi troppo grande molto velocemente. Idee?
Grazie!,
S.S.
Re: Pulsante a levetta o qualcosa di simileÈ anche possibile raggruppare le caselle di controllo in modo che solo una sia attiva in un dato momento:
Names Default To Here( 1 );
r1 = Radio Box( {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} );
r2 = Radio Box( {"Q1", "Q2", "Q3", "Q4"} );
New Window( "Example", H List Box( r1, r2 ) );
r2 << Group( r1 );Re: Pulsante a levetta o qualcosa di simileButton Box supporta lo stile Toggle
Names Default To Here(1);
New Window("Toggle Button Example",
ex = Button Box("Start",
If(ex << Get,
ex << Set Button Name("Stop"),
ex << Set Button Name("Start")
)
)
);
ex << Style("Toggle");


Re: Pulsante a levetta o qualcosa di similePotresti usare pulsanti di scelta a questo scopo. Potresti usare un set per definire se il periodo è mesi o trimestri. Potresti avere un altro set dinamico per offrire i dodici mesi o i quattro trimestri. Entrambe le opzioni potrebbero essere create quando la finestra è aperta, ma un set (non quello predefinito) potrebbe essere invisibile. Il primo set di pulsanti di scelta gestirebbe la visibilità del secondo set e la logica.