Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoCiao a tutti,
Ho 2 tabelle in cui dtA è il mio file originale e dtB è il mio file di riferimento. Quello che avrei voluto fare è aggiornare dtA in base alla data inferiore o uguale al file di riferimento.
Per esempio,
Tabella dtA
| Data | Modello | Qtà |
| 24/06/2023 | UN | 23 |
| 30/06/2023 | UN | 25 |
| 07/01/2023 | UN | 34 |
| 07/05/2023 | UN | 50 |
Tabella dtB
| Data | Modello | Rif |
| 01/06/2023 | UN | 100 |
| 07/01/2023 | UN | 150 |
Dopo aver aggiornato dtA, la tabella dovrebbe assomigliare a questa
| Data | Modello | Qtà | Rif |
| 24/06/2023 | UN | 23 | 100 |
| 30/06/2023 | UN | 25 | 100 |
| 07/01/2023 | UN | 34 | 150 |
| 07/05/2023 | UN | 50 | |
È possibile? Per favore aiuto
Automazione e scriptingRi: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoEcco uno script che funziona.Non sarebbe molto efficiente se i tavoli scommettessero molto in grande.
Date le tue 2 tabelle di dati, lo script fornirà l'aggiornamento

Tieni presente che la riga 4 ha un valore di aggiornamento, mentre la tua tabella non ne aveva uno.A meno che non interpreti erroneamente le tue esigenze, l'ultima riga ha un valore nella tabella di riferimento che soddisfa i criteri di selezione
Names Default To Here( 1 );
New Table( "Original",
Add Rows( 4 ),
New Column( "Date",
Format( "m/d/y", 10 ),
Input Format( "m/d/y" ),
Set Values( [3770409600, 3770928000, 3771014400, 3771360000] )
),
New Column( "Model", Character( 16 ), Set Values( {"A", "A", "A", "A"} ) ),
New Column( "Qty", Set Values( [23, 25, 34, 50] ) )
);
New Table( "Reference",
Add Rows( 2 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "m/d/y", 10 ),
Input Format( "m/d/y" ),
Set Values( [3768422400, 3771014400] )
),
New Column( "Model", Character( 16 ), Set Values( {"A", "A"} ) ),
New Column( "Ref", Set Values( [100, 150] ) )
);
// This is the code that does the actual update
dtA = Data Table( "Original" );
dtB = Data Table( "Reference" );
dtA << New Column( "Ref" );
For Each( {row}, Index( 1, N Rows( dtA ) ),
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)]
);Ri: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoEsistono diversi metodi per eseguire questa operazione, ma JMP non offre (almeno ancora) tale unione direttamente.
Per prima cosa puoi creare Ref nella tabella originale (che sarà vuota) (questo passaggio molto probabilmente non è necessario poiché JMP aggiungerà le colonne mancanti durante la concatenazione)

Concatenare le tabelle

Ordina per gruppi e ora. Seleziona tutti i valori nella colonna Rif e fai clic con il pulsante destro del mouse per selezionare Riempi mancante

Seleziona tutte le righe in cui manca QTY ed eliminale


Ci sono anche alcuni componenti aggiuntivi (e script) che possono farlo partecipare alla comunità. Inoltre puoi utilizzare SQL all'interno di JMP
Ri: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoCiao txnelson, viene visualizzato un errore come questo.

Ri: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoMolto probabilmente stai utilizzando una versione di JMP precedente alla 16 (For Each è stato aggiunto in JMP16). Puoi modificarlo abbastanza facilmente e trasformarlo in ciclo For
Ri: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoSospetto che tu abbia una versione di JMP che non supporta
For Each()
quindi se cambi la sezione Per ogni in
For(row=1, row<= N Rows( dtA ), row++,
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)]
);
dovrebbe funzionare.
Ri: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoLo script ora funziona bene, ma ho un'ultima domanda: esiste un modo per limitare l'aggiornamento a una determinata data poiché le tabelle verranno aggiornate ogni giorno? Per esempio,
Tabella dtA
| Data | Modello | Qtà |
| 24/06/2023 | UN | 23 |
| 30/06/2023 | UN | 25 |
| 07/01/2023 | UN | 34 |
| 07/05/2023 | UN | 50 |
| 07/10/2023 | UN | 65 |
| 27/07/2023 | UN | 68 |
Tabella dtB
| Data | Modello | Rif |
| 01/06/2023 | UN | 100 |
| 07/01/2023 | UN | 150 |
| 20/07/2023 | UN | 300 |
| 01/08/2023 | UN | 250 |
Dopo aver aggiornato dtA, la tabella dovrebbe assomigliare a questa
| Data | Modello | Qtà | Rif |
| 24/06/2023 | UN | 23 | 100 |
| 30/06/2023 | UN | 25 | 100 |
| 07/01/2023 | UN | 34 | 150 |
| 07/05/2023 | UN | 50 | 300 |
| 07/10/2023 | UN | 65 | 300 |
| 27/07/2023 | UN | 65 | 250 |
Ho provato a utilizzare lo script, ma sovrascrive il valore Rif delle date passate con quello più recente che è 250. Sembra così
| Data | Modello | Qtà | Rif |
| 24/06/2023 | UN | 23 | 250 |
| 30/06/2023 | UN | 25 | 250 |
| 07/01/2023 | UN | 34 | 250 |
| 07/05/2023 | UN | 50 | 250 |
| 07/10/2023 | UN | 65 | 250 |
| 27/07/2023 | UN | 65 | 250 |
Ri: Aggiorna la tabella in base alla data inferiore o uguale al file di riferimentoLo scopo della comunità di discussione per quanto riguarda l'aiuto con gli script non è quello di essere una fonte di generazione di script su richiesta.È qui per aiutare gli individui a superare i problemi con gli script che stanno sviluppando e per aumentare la loro capacità di migliorare i propri script.
Se non hai avuto il tempo di leggere la Guida allo scripting, ti consiglio vivamente di farlo.Ti mostrerà i dettagli del linguaggio di scripting e da ciò vedrai che JSL è un linguaggio di scripting completo in grado di gestire praticamente qualsiasi cosa tu possa lanciargli.Tuttavia, per quanto riguarda la tua domanda attuale, puoi facilmente inserire istruzioni condizionali "IF()" per definire quando l'aggiornamento deve essere eseguito o non eseguito.Di seguito è riportato un esempio di tale
For( row = 1, row <= N Rows( dtA ), row++,
If( dtb:Date == Today(),
If( dtA:date[row] <= Col Max( dtB:date ),
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)],
dtA:Ref[row] = .
)
)
);