Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Saluti.
La mia azienda è stata finalmente in grado di ottenere il rilascio di JMP14, quindi sono molto entusiasta di provare le nuove funzionalità. In particolare, il Semiconductor ha preso il kit e la funzione Calendar Box(). Quindi il mio primo passo è analizzare le grandi quantità di dati che estraggono da un intervallo di dati. Alla fine sono riuscito a convertire il 3388594698 in una data effettiva.Ecco un esempio dell'output:
sqlstart = "18/01/2018 00:00:00";
sqlend = "12/12/2018 13:25:05";
Tuttavia, il nostro database ha il timestamp formattato come 2018-10-28 16:59:03. Ho provato a risolvere questo problema utilizzando la Guida agli script e i post su questo sito Web, ma senza successo. Fine dello script chiude la finestra e ne aprirà un'altra come parte n. 2 ma vorrebbe che la dashboard contenesse tutto.. Ma questo è il prossimo ostacolo.
Qualsiasi aiuto sarebbe molto apprezzato.
d
Close All( Data Tables, No Save );
Close All( Reports );
Clear Log();
Close All( journals, no save );
Clear Symbols();
/******************************************************************************/
/* */
/* Brings in the list of wafers from the SQL Query [Current] */
/* */
/******************************************************************************/
testdata_HAY_QQ_LotList = Expr(
"
SELECT DISTINCT
t1.wafer_number,
t1.testdate
FROM tst_master t1
LEFT OUTER JOIN tst_dataset_header t2
ON ( t2.run_id = t1.run_id )
WHERE t1.testdate >= cast('2018-01-01' AS date) // Currently How I select a list of lots.
AND (t1.wafer_number NOT RLIKE '-ATL' )
ORDER BY t1.testdate DESC
"
);
/*******************************************************************************/
/* */
/* Brings in the list of wafers from the SQL Query [Desired with Caledar Box] */
/* */
/*******************************************************************************/
testdata_HAY_QQ_LotList = Expr(
"
SELECT DISTINCT
t1.wafer_number,
t1.testdate
FROM tst_master t1
LEFT OUTER JOIN tst_dataset_header t2
ON ( t2.run_id = t1.run_id )
WHERE (t1.testdate <= "||sqlstart||") // Varible from Date Selection
AND (t1.testdate >= "||sqlend||") // Varible from Date Selection
AND (t1.wafer_number NOT RLIKE '-ATL' )
ORDER BY t1.testdate DESC
"
);
/******************************************************************************/
/* */
/* LotList is used in the next step of the data pull selecting the wafers */
/* */
/******************************************************************************/
dt_LotList = Open Database( DATABASE, testdata_HAY_QQ_LotList, "LotList" );
Summarize( LotList = By( :wafer_number ) );
Close( dt_lotlist, No Save );
/******************************************************************************/
/* */
/* Start of Main Script [Calendar Box() to Select Wafer with Date Range] */
/* */
/******************************************************************************/
nw = New Window( "DATE SELECTION",
V List Box(
Align( Left ),
V List Box(
Spacer Box(
Size( 5, 15 )
),
Text Box(
"LOT DATE RANGE",
<< Set Font Name( "Segoe UI" ),
<< Set Font Style( "Bold" ),
<< Set Font Size( 12 ),
<< Justify Text( "Center" )
),
Spacer Box(
Size( 5, 20 )
),
H List Box(
Panel Box( "Select Start Date",
StartDate = Calendar Box(),
),
Spacer Box(),
Panel Box( "Select End Date",
EndDate = Calendar Box(),
)
),
Panel Box( "",
loadlot = Button Box( "LOAD LOT LIST",
<< Set Function(
Function(
{self},
sqlstart = MDYHMS( StartDate << Get Date()); // passed to database query
sqlend = MDYHMS( EndDate << Get Date()); // passed to database query
Show( sqlstart );
Show( sqlend );
self << close window;
)
)
)
)
)
)
);
date_start = Date MDY( 01, 1, 2018 );
StartDate << Date( date_start );
StartDate << Show Time( 0 );
StartDate << Min Date( Date Increment( Today(), "Day", -365, "Start" ) );
date_end = Date MDY( 01, 1, 2018 );
EndDate << Date( date_end );
EndDate << Show Time( 0 );
EndDate << Min Date( Date Increment( Today(), "Day", -365, "Start" ) );
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Ho un paio di domande di follow-up, se posso
- Nel codice che hai fornito con la stringa di connessione, ho avuto un problema con SQL NATIVE CLIENT poiché ho notato che è predefinito sul driver MySQL a 32 bit. I nostri database utilizzano il driver a 64 bit. Ho cercato online e non sono riuscito a trovare il sostituto per il CLIENTE NATIVO.
- JMP ha la capacità di unire le tabelle virtualmente e memorizzare tutte le informazioni senza inserirle nelle tabelle? Abbiamo 4 test principali e all'interno di questi 4 test abbiamo 8 sottotest, quindi per un valore di dati di un wafer è pari a circa 61.000 righe x 24 colonne se eseguo il ping del server e lo inserisco in una tabella. In retrospettiva, abbiamo circa 50 wafer di dati in modo da poter vedere quanto potrebbe essere grande il set di dati. Vorrei utilizzare la funzione Dashbord per filtrare e produrre i report di cui abbiamo bisogno per eseguire la nostra analisi.
Come sempre, apprezzo l'aiuto e il supporto della comunità. Se questo è fonte di confusione, non esitare a ricontattarti per chiarimenti. Ho cambiato parecchie cose per non rivelare troppi dettagli sui nostri test
// 32bit SQL Driver
ev = Get Environment Variable( "computername" );
ConnectionString = "DRIVER=SQL NATIVE CLIENT; SERVER=***; DATABASE=***; Uid=***;Pwd=***" // Need 64 bit
Try(Close database connection(SQLConnection));
SQLConnection = Create database connection(ConnectionString);
// Main SQL Query that brings in all data for a wafer(s)
"
SELECT
CASE
WHEN t2.testname = TEST_1 THEN t3.ts
WHEN t2.testname = 'TEST_2' THEN t4.ts
WHEN t2.testname = 'TEST_3' THEN t5.ts
WHEN t2.testname = TEST_4' THEN t6.ts
END AS TimeStamp,
t1.wafer_number,
t2.die_id,
t2.run_id,
t2.rownum,
t2.colnum,
t2.subrow,
t2.subcol,
t2.part_number,
t2.testname,
t2.set_id,
t2.trmode,
t2.channel,
t2.teststate,
t2.refstate,
t2.attenstate,
t3.Supply_Name,
t3.Current,
CASE
WHEN t2.testname = 'TEST_2' THEN t4.INPUT / 1000000000
WHEN t2.testname = 'TEST_4' THEN t6.INPUT / 1000000000
END AS INPUT_1,
CASE
WHEN t2.trmode = 'TX' THEN t4.TEST_2d
WHEN t2.trmode = 'RX' THEN t4.TEST_2a
END AS TEST_2ad,
CASE
WHEN t2.trmode = 'TX' THEN t4.TEST_2a
WHEN t2.trmode = 'RX' THEN t4.TEST_2d
END AS TEST_2da,
CASE
WHEN t2.trmode = 'Tx' THEN t4.TEST_2b
WHEN t2.trmode = 'Rx' THEN t4.TEST_2c
END AS TEST_2cc,
t5.ErrorCount,
CASE
WHEN t2.trmode = 'Tx' THEN t4.TEST_2b
WHEN t2.trmode = 'Rx' THEN t4.TEST_2c
WHEN t2.testname = 'TEST_1' THEN t3.Current
WHEN t2.testname = 'TEST_3' THEN t5.ErrorCount
END AS TestOutput,
t6.INPUT,
t6.TEST_4a,
t6.TEST_4b
FROM tst_master t1
LEFT OUTER JOIN tst_dataset_header t2
ON ( t2.run_id = t1.run_id )
LEFT OUTER JOIN tst_vector t5
ON ( t5.header_id = t2.header_id )
LEFT OUTER JOIN tst_test_1 t3
ON ( t3.header_id = t2.header_id )
LEFT OUTER JOIN tst_test_2 t4
ON ( t4.header_id = t2.header_id )
LEFT OUTER JOIN tst_test_4 t6
ON ( t6.header_id = t2.header_id )
WHERE ((( t2.testname IN ('TEST_1', 'TEST_2, 'TEST_3', 'TEST_4' ))
AND ( t2.teststate IN ( '1' , '3', '0x0' ))))
AND (t2.set_id NOT LIKE '1140' )
AND (t2.set_id NOT LIKE '1240' )
AND (t2.part_number LIKE 'WAFER_1')
AND (t1.wafer_number IN ( "||LotListSQLString||" ) ) // derived from the previous script you provided in your last reply
"
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Grazie mille per l'assistenza.. Funziona come un incantesimo.
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Puoi usare evalinsert per un codice dall'aspetto più pulito e la conversione automatica di valori numerici in stringhe di caratteri.Circonda semplicemente la tua variabile con il carattere caret (^) in questo modo:
testdata_HAY_QQ_LotList = evalinsert(
"SELECT DISTINCT
t1.wafer_number,
t1.testdate
FROM tst_master t1
LEFT OUTER JOIN tst_dataset_header t2
ON ( t2.run_id = t1.run_id )
WHERE (t1.testdate <= '^sqlstart^') /* Varible from Date Selection */
AND (t1.testdate >= '^sqlend^') /* Varible from Date Selection */
AND (t1.wafer_number NOT RLIKE '-ATL' )
ORDER BY t1.testdate DESC");
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Grazie.. Lo proverò appena arrivo al lavoro.
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Menzionato solo come assente dal codice di esempio.
Probabilmente la cosa più utile che posso fare per te ora è pubblicare un esempio funzionante che ho appena eseguito:
Names Default To Here( 1 );
nw = New Window( "DATE SELECTION",
<<MODAL>= ' " || sqlstart || " ' AND runStartTime <= ' " || sqlend || " '
";
dt = Execute SQL(SQLConnection,
SQLcode,
"dt"
);</MODAL>Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Uso religiosamente '"||qualcosa||"'. Il problema che ho cercato di
risolvere è quando uso '"||sqlstart||"' è una gestione della concatenazione
di quella variabile che posso solo presumere che sqlsart sia un valore numerico
e devo convertire in carattere affinché funzioni correttamente. Quando ho aggiunto
Show() per StartDate, sqlstartA e sqlstart vedo la conversazione
processi. Inserirlo nella query stessa è ciò che mi ha perplesso.
Ho cercato di risolvere questo da solo prima invece di venire
qui e viene detta la risposta.
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Ciao,
Nella clausola SQL dove tutte le date devono essere racchiuse tra '
esempi:
"
SELECT
*
FROM Runs
WHERE
RunStartDate > '2018-09-01'
";
"
SELECT
*
FROM Runs
WHERE
RunStartDate > ' " || DATE || " '
";
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]che database stai usando?
È necessario convertire le date in una data di database (TO_DATE in Oracle) o passarle come stringa, da qui la necessità di racchiudere la data JMP tra virgolette singole.C'è un modo per eseguire il codice SQL direttamente sul database, magari in Toad o in un prodotto simile?In questo modo puoi scorrere il tuo codice finché non funziona nel database, quindi chiamarlo in JSL.
A proposito, piuttosto che usare aprire la banca dati Consiglierei creare una connessione al database , eseguire sql , e chiudere la connessione al database .In questo modo è possibile aprire una connessione al DB, eseguire una o più query e quindi chiudere la connessione.Open Database crea una nuova connessione per ogni query SQL.
Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Grazie per l'aiuto.. Puoi per favore approfondire "Cambia il tuo codice SQL per includere '" per favore?Re: Calendar Box() - Intervallo di date - Converti data/ora - SQL[Database]Ciao,
La mia comprensione è che vuoi che la selezione della casella del calendario venga utilizzata come filtro della data in SQL?
In tal caso, avrai bisogno di 2 modifiche allo script:
- Usa il formato per cambiare il formato della data
- Modifica il tuo codice SQL per includere '
Ho mostrato un esempio qui sotto:
/******************************************************************************/
/* */
/* Start of Main Script [Calendar Box() to Select Wafer with Date Range] */
/* */
/******************************************************************************/
nw = New Window( "DATE SELECTION",
V List Box(
Align( Left ),
V List Box(
Spacer Box(
Size( 5, 15 )
),
Text Box(
"LOT DATE RANGE",
<< Set Font Name( "Segoe UI" ),
<< Set Font Style( "Bold" ),
<< Set Font Size( 12 ),
<< Justify Text( "Center" )
),
Spacer Box(
Size( 5, 20 )
),
H List Box(
Panel Box( "Select Start Date",
StartDate = Calendar Box(),
),
Spacer Box(),
Panel Box( "Select End Date",
EndDate = Calendar Box(),
)
),
Panel Box( "",
loadlot = Button Box( "LOAD LOT LIST",
<< Set Function(
Function(
{self},
sqlstartA = StartDate << Get Date(); // passed to database query
sqlendA = EndDate << Get Date(); // passed to database query
Show( sqlstart );
Show( sqlend );
self << close window;
)
)
)
)
)
)
);
sqlstart = format(sqlstartA, "Y/M/D h:m:s");
sqlend = format(sqlendA, "Y/M/D h:m:s");
/*******************************************************************************/
/* */
/* Brings in the list of wafers from the SQL Query [Desired with Caledar Box] */
/* */
/*******************************************************************************/
testdata_HAY_QQ_LotList = Expr(
"
SELECT DISTINCT
t1.wafer_number,
t1.testdate
FROM tst_master t1
LEFT OUTER JOIN tst_dataset_header t2
ON ( t2.run_id = t1.run_id )
WHERE (t1.testdate <= '"||sqlstart||"') // Varible from Date Selection
AND (t1.testdate >= '"||sqlend||"') // Varible from Date Selection
AND (t1.wafer_number NOT RLIKE '-ATL' )
ORDER BY t1.testdate DESC
"
);