Inizia l'aggiornamento dei datiCiao
Ho una tabella e vorrei che il volume vuoto fosse aggiornato a 0

Ho scritto lo script per aggiornare la colonna "19-04-2024"
il problema è che il nome della colonna può essere modificato e preferisco utilizzare la colonna (3) o la colonna (4)
ma non funziona.
puoi per favore correggere lo script?
dt << Inizia l'aggiornamento dei dati;
dt << Ricodifica colonna (
dt << Colonna (3),
{Valore mappa( _rcOrig, {., 0}, Senza corrispondenza( _rcNow ) )},
Aggiorna proprietà( 1 ),
Colonna di destinazione(Colonna (3)));
dt << Fine aggiornamento dati;
Automazione e scriptingfinestreRe: Iniziare l'aggiornamento dei datiAsColumn sembra funzionare qui
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt[1::10, 4] = .;
dt << Recode Column(
AsColumn(dt, 4),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(AsColumn(dt, 4))
);
Questo è un caso semplice in cui molto probabilmente utilizzerei l'abbonamento alla tabella dati
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt[1::10, 4] = .;
missing_rows = Loc(dt[0, 4], .);
dt[missing_rows, 4] = 0;
Re: Iniziare l'aggiornamento dei datiè qualcosa che non va
Ho provato a utilizzare il semplice script per modificare il volume vuoto in 0 nella colonna "19-04-2024"
dt[1::10, 3] = .;
righe_mancanti = Loc(dt[0, 3], .);
dt[righe_mancanti, 3] = 0;

ma vedo che lo script cambia non solo il valore vuoto in 0, lo script cambia anche il 14,3% e il 21,3% in 0

in realtà il mio script funziona bene, ma non so come posso cambiare dt :"19-04-2024" in "colonna 3"
dt << Inizia l'aggiornamento dei dati;
dt << Colonna ricodifica (dt :"19-04-2024",
{Valore mappa( _rcOrig, {., 0}, Senza corrispondenza( _rcNow ) )},
Aggiorna proprietà( 1 ),
Colonna di destinazione( :"19-04-2024" ) );
dt << Fine aggiornamento dati;
Re: Iniziare l'aggiornamento dei datiQuesta parte
dt[1::10, 4] = .;
era lì solo per aggiungere alcuni valori mancanti a scopo dimostrativo (prime dieci righe della colonna 4) in modo da poterlo rimuovere.
Re: Iniziare l'aggiornamento dei datisì, la riga di comando
dt[1::10, 3] = .;
imposta tutti i valori nelle righe da 1 a 10 nella terza colonna su vuoti. Il resto dello script ha sostituito i valori vuoti con 0. Quindi, come spiegato da @jthi , è sufficiente rimuovere la riga.
Re: Iniziare l'aggiornamento dei datiEsistono 2-3 trucchi per risolvere tali problemi:
- Nome Espr(Come colonna(...))
- Valutazione(Sostituto(Espr(),... , ...)))
- se ce n'è un terzo, può essere trovato qui: Gestione delle espressioni in JMP: Tipps e Trapdoors
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
my col = Name Expr( As Column( dt, 2 ) );
Eval(
Substitute(
Expr(
dt << Recode Column(
_col_,
{Map Value( _rcOrig, {14, 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( _col_ )
)
),
Expr( _col_ ), Name Expr( my col )
)
);
Re: Iniziare l'aggiornamento dei datiCiao
Se ho capito bene il tuo suggerimento, è di cambiare: "19-04-2024" con il tuo script .
ma ho ricevuto l'errore. Puoi verificare dove ho sbagliato?
dt << Inizia l'aggiornamento dei dati;
dt << Ricodifica colonna (dt
( my col = Nome Espr( Come Colonna( Colonna( dt, 3 ) ) );
Eval( Sostituisci( Espr( dt << Ricodifica Colonna( _col_,
{Valore mappa( _rcOrig, {14, 0}, Senza corrispondenza( _rcNow ) )},
Aggiorna proprietà( 1 ),
Colonna di destinazione( _col_ ))),
Espr( _col_ ), Nome Espr( mio col ))) ),
{Valore mappa( _rcOrig, {., 0}, Senza corrispondenza( _rcNow ) )},
Aggiorna proprietà( 1 ),
Colonna di destinazione( :"19-04-2024" ) );
dt << Fine aggiornamento dati;
Re: Iniziare l'aggiornamento dei datiL'idea è:
ottieni un modulo che può essere utilizzato in modo flessibile, l'handle è il mio col:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
my col = Name Expr( As Column( XXX) );
Eval(
Substitute(
Expr(
dt << Recode Column(
_col_,
{Map Value( _rcOrig, {14, 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( _col_ )
)
),
Expr( _col_ ), Name Expr( my col )
)
);dove As Column(XXX) può essere sostituito da
- Come Colonna (colonna ("sesso"))
- Come Colonna(dt, "sesso")
- Come colonna ("sesso")
- Come colonna(3)
- Come colonna(dt, 3)
- nel tuo caso:
Come colonna(dt, "19-04-2024")
o semplicemente come colonna("19-04-2024")
modificare:
come mostra Jarmo in qualche post precedente: https://community.jmp.com/t5/Discussions/Begin-Data-Update/mp/752334/highlight/true#M93383 , per Recode Column , in realtà
- non è nemmeno necessario Eval(Substitute(...))
- né il Nome Expr(Come Colonna(xxx))
... Ricodifica colonna (AsColumn(xxx)...) è sufficiente.
Oh!
Re: Iniziare l'aggiornamento dei datiDovresti aver bisogno solo di questa parte
dt << Recode Column(
AsColumn(dt, 4),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(AsColumn(dt, 4))
);
dove definisci l'indice della tua colonna all'interno di AsColumn.
Se ho un tavolo come questo

e desidero sostituire i valori mancanti degli indici di colonna 1 e 3, vorrei utilizzare
dt << Recode Column(
As Column(dt, 1),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(As Column(dt, 1))
);
E
dt << Recode Column(
As Column(dt, 3),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(As Column(dt, 3))
);
(il numero all'interno della colonna Come è cambiato)

Re: Iniziare l'aggiornamento dei dati
dt = Open("$SAMPLE_DATA/Big Class.jmp"); <BR />dt << Recode Column(
/*Print(.);*/AsColumn(dt, Print(1);2),
Print(2);{Print(3);Map Value(_rcOrig, {12, Print(4);0}, Unmatched(_rcNow))},
/*Print(0);*/Update Properties(Print(5);1),
/*Print(0);*/Target Column(/*Print(.);*/AsColumn(dt, Print(6);4))
);dà
2
5
6
1
1
3
3
3
3
3
3
1
:height
- Print(0) : nessun comando previsto qui → messaggio di errore → /* Li inserisco nei commenti */
- Print 2 : viene valutato il 2° argomento; l' elenco rimane così com'è (l'elenco non viene valutato)
- Print(5) & Print (6) → vengono valutati gli argomenti degli argomenti nominati
- Print(1) : ora viene valutato il primo argomento: perché due volte?
- Print(3) : 6 volte (!) (indipendentemente dai valori da sostituire)
- Stampa(1) : ancora?
- [Print(.) : vengono valutati, ma impediscono a Jmp di ottenere correttamente le informazioni sulla colonna → /* Le inserisco nei commenti */]
- Print(4) : non viene visualizzato → non previsto qui → errore → i valori vengono sostituiti da "." (invece di 0)
- :altezza : valore restituito: colonna di destinazione
Re: Iniziare l'aggiornamento dei dati(A) Dentro
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt[1,"age"]=4;
row()=1;
AsColumn(dt, tmp=As Column(2);print(tmp);tmp /*=4*/); // column #4 , row #1= 59<BR />Sum(As Column(2) ,7) // 4 + 7 = 11<BR />Il risultato di As Column(2) non è la colonna n. 2, è il valore della colonna n. 2 (nella riga n. 1).
(B) D'altra parte, il primo argomento di Recode Column() viene valutato solo a un livello in cui As Column() restituisce il riferimento alla colonna
... e NON il valore della riga corrente (come nel primo esempio).
Lo stesso vale per l'argomento Target Column() .
@joseph_morgan parla in Utilizzo di JSL per sviluppare applicazioni efficienti e robuste sulle espressioni che vengono "valutate due volte"
= (A)
se questo "standard" viene impedito (B), sembra una magia:)
Re: Iniziare l'aggiornamento dei datiQuindi, per quanto riguarda l'evidenziazione avanzata della sintassi nell'editor JSL, la funzione valuta il suo argomento? , forse abbiamo bisogno di un terzo colore?
Re: Inizio aggiornamento datiCiao
Ho provato a cambiare dt :"19-04-2024" in dt [1::10, 4], ma non cambia il volume vuoto in 0
puoi controllare dove ho sbagliato?
dt << Inizia aggiornamento dati;
dt << Ricodifica colonna ( dt [1::10, 4] ,
{Valore mappa( _rcOrig, {., 0}, Non corrispondente( _rcNow ) )},
Aggiorna proprietà (1),
Colonna di destinazione ( dt [1::10, 4] ) );
dt << Fine aggiornamento dati;