Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Salutations.
Mon entreprise a finalement pu lancer JMP14, je suis donc très enthousiaste à l'idée d'essayer les nouvelles fonctionnalités. Plus précisément, le Semiconductor Took Kit et la fonction Calendar Box(). Ma première étape consiste donc à analyser les grandes quantités de données extraites d’une plage de données. J'ai finalement réussi à convertir le 3388594698 en date réelle.Voici un exemple du résultat :
sqlstart = "18/01/2018 00:00:00" ;
sqlend = "12/12/2018 13:25:05" ;
Cependant, notre base de données a l'horodatage au format 2018-10-28 16:59:03. J'ai essayé de résoudre ce problème à l'aide du Guide de script et des publications sur ce site Web, mais en vain. La fin du script ferme la fenêtre et en ouvre une autre en tant que partie n°2, mais souhaite que le tableau de bord contienne tout. Mais c’est le prochain obstacle.
Toute aide serait grandement appréciée.
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() - Plage de dates - Convertir date/heure - SQL [Base de données]J'ai quelques questions complémentaires si vous me le permettez
- Dans le code que vous avez fourni avec la chaîne de connexion, j'ai eu un problème avec SQL NATIVE CLIENT car j'ai remarqué qu'il utilisait par défaut le pilote MySQL 32 bits. Nos bases de données utilisent le pilote 64 bits. J'ai cherché en ligne et je n'ai pas trouvé de remplaçant pour le NATIVE CLIENT.
- JMP a-t-il la possibilité de joindre virtuellement des tables et de stocker toutes les informations sans les intégrer dans des tables ? Nous avons 4 tests principaux et dans ces 4 tests, nous avons 8 sous-tests, donc pour une plaquette de données, cela représente environ 61 000 lignes x 24 colonnes si je cingle le serveur et le place dans une table. Rétrospectivement, nous avons environ 50 tranches de données afin que vous puissiez voir quelle pourrait être la taille de l'ensemble de données. J'aimerais utiliser la fonction Dashbord pour filtrer et produire les rapports dont nous avons besoin pour faire notre analyse.
Comme toujours, j'apprécie l'aide et le soutien de la communauté. Si cela prête à confusion, n'hésitez pas à nous contacter pour obtenir des éclaircissements. J'ai modifié pas mal de choses pour ne pas révéler trop de détails sur nos tests
// 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() - Plage de dates - Convertir date/heure - SQL [Base de données]Merci beaucoup pour votre aide.. Fonctionne à merveille.
Re: Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Vous pouvez utiliser evalinsert pour un code plus propre et une conversion automatique des valeurs numériques en chaînes de caractères.Entourez simplement votre variable du caractère caret (^) comme ceci :
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() - Plage de dates - Convertir date/heure - SQL [Base de données]Merci.. Je vais essayer cela dès que j'arriverai au travail.
Re: Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Mentionné uniquement comme absent de votre exemple de code.
La chose la plus utile que je puisse faire pour vous maintenant est probablement de publier un exemple fonctionnel que je viens d'exécuter :
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() - Plage de dates - Convertir date/heure - SQL [Base de données]J'utilise religieusement le '"||quelque chose||"'. Le problème que j'ai essayé de résoudre
résoudre, c'est quand j'utilise '"||sqlstart||"' c'est gérer la concaténation
de cette variable dont je ne peux que supposer que sqlsart est une valeur numérique
et je dois convertir en personnage pour que cela fonctionne correctement. Quand j'ai ajouté
Show() pour StartDate, sqlstartA et sqlstart je vois la conversation
processus. L’intégrer dans la requête elle-même est ce qui m’a dérouté.
J'ai d'abord essayé de résoudre ce problème par moi-même au lieu de simplement venir
ici et on me dit la réponse.
Re: Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Salut,
Dans la clause SQL Where, toutes les dates doivent être entourées de '
exemples:
"
SELECT
*
FROM Runs
WHERE
RunStartDate > '2018-09-01'
";
"
SELECT
*
FROM Runs
WHERE
RunStartDate > ' " || DATE || " '
";
Re: Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Quelle base de données utilisez-vous ?
Vous devez soit convertir vos dates en date de base de données (TO_DATE dans Oracle), soit les transmettre sous forme de chaîne, d'où la nécessité de placer la date JMP entre guillemets simples.Existe-t-il un moyen pour vous d'exécuter le code SQL directement sur la base de données, peut-être dans Toad ou un produit similaire ?De cette façon, vous pouvez parcourir votre code jusqu'à ce qu'il fonctionne dans la base de données, puis l'appeler en JSL.
BTW plutôt que d'utiliser base de données ouverte je recommanderais créer une connexion à la base de données , exécuter SQL , et fermer la connexion à la base de données .De cette façon, vous pouvez ouvrir une connexion à la base de données, exécuter une ou plusieurs requêtes, puis fermer la connexion.Open Database crée une nouvelle connexion pour chaque requête SQL.
Re: Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Merci pour l'aide.. Pouvez-vous s'il vous plaît développer le "Modifiez votre code SQL pour inclure '" s'il vous plaît ?Re: Calendar Box() - Plage de dates - Convertir date/heure - SQL [Base de données]Salut,
Je crois comprendre que vous souhaitez que la sélection de la boîte de calandre soit utilisée comme filtre de date dans SQL ?
Si tel est le cas, vous aurez besoin de 2 modifications de script :
- Utiliser le format pour changer le format de la date
- Modifiez votre code SQL pour inclure '
J'ai montré un exemple ci-dessous :
/******************************************************************************/
/* */
/* 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
"
);