Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut,
J'ai besoin de collecter des données de test paramétriques au niveau de la puce auprès des testeurs finaux pour de nombreuses tranches de production.
Chaque plaquette a ~ 3000 puces et 10s de paramètres.
J'ai créé un SQL factice dans le cadre de cette demande d'assistance :
SÉLECTIONNER
I.PRODUCTNR,
T.TESTUNITNR,
T.POINT DE MESURENR,
T.CREATIONTIME,
T.RESULT_PARAM1,
T.RESULT_PARAM2.
.
.
.
DEPUIS
" ARTICLES " D,
"RESULTATS DU TEST" T,
TRR "TESTRESULTROWS",
"TESTROW" TR,
.
.
OÙ I.IDNR = T.IDNR
ET T.TESTRESULTNR = TRR.TESTRESULTNR
ET TRR.TESTROWIDNR = TR.TESTROWIDNR
ET I.LOTIDNR = L.LOTIDNR
ET T.VALIDITE = '1'
ET D.WAFERNR DANS
(
'WAF43K309A',
'WAF43K310A',
'WAF43K311A',
'WAF43K312A',
'WAF43K313A',
'WAF43K314A',
., ., ., ., .,
'WAF43K315A',
'WAF43K316A',
'WAF43K317A',
'WAF43K319A',
'WAF43K320A',
'WAF43K321A'
)
ET (T.TESTUNITNR COMME ('HENE%')
ET TR.VARIABLENAME DANS
('ACÉNUM',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF',
......)
PAR GROUPE ...
Si je collecte toutes les données pour la première plaquette répertoriée (WAF43K309A), le temps de collecte/récupération est d'environ 90 secondes.
Si je collecte toutes les données pour les 2 premières tranches répertoriées (WAF43K309A,WAF43K310A), le temps de collecte/récupération est d'environ 4 minutes
Si je collecte toutes les données pour les 3 premières tranches répertoriées (WAF43K309A,WAF43K310A,WAF43K311A), le temps de collecte/récupération est d'environ 7 minutes
Je suis sûr que vous voyez le problème, le temps de collecte/récupération croît de manière exponentielle avec le nombre de wafers.
Parfois, je dois le faire pendant le week-end !!
En utilisant l'opérateur SQL "Union All" et en collectant des données pour une plaquette à la fois, je peux récupérer les données en utilisant approximativement le même temps pour chaque plaquette.
Ce n'est pas grave si je n'ai que quelques wafers dans ma liste. Malheureusement, j'ai assez souvent besoin de collecter des données sur plusieurs dizaines de wafers, voire des centaines de wafers.
En utilisant une sélection interne, je pourrais faire une liste des plaquettes :
par exemple
.....
ET D.WAFERNR DANS (
SELECT WAFERNR from ITEM
OÙ TESTDATE > SYSDATE-5)
la liste de plaquettes résultante serait :
WAF43K309A
WAF43K310A
WAF43K311A
WAF43K312A
WAF43K313A
WAF43K314A
WAF43K315A
WAF43K316A
WAF43K317A
WAF43K319A
WAF43K320A
WAF43K321A
Est-il possible, en utilisant JSL, d'utiliser cette liste en parcourant la liste et en collectant des données pour une plaquette à la fois ?
Au plaisir de voir quelles solutions créatives la communauté pourrait avoir à offrir
Une solution serait un super cadeau de Noël
Cordialement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut Yosef,
Merci pour votre participation.
J'aime la façon dont vous avez construit la liste à utiliser dans les scripts SQL et je suis sûr que je peux l'utiliser en cas de besoin.
Dans ce cas particulier, l'idée est d'éviter l'utilisation d'une liste de plaquettes dans le SQL car cela ralentit l'acquisition de données par rapport à l'approche une plaquette à la fois.
Cordialement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut
j'utilise le script suivant pour créer une ligne contenant une liste de lots
lot_list = Colonne ( 1 ) << Obtenir des valeurs ;
dans la liste = "('" || Concater des objets ( liste_lot , "','" ) || "')" ;
chaîne_sql = "OÙ \!"BEAUCOUP\!" DANS " || dans la liste ;
// / Si vous voulez voir la chaîne / / /
montrer ( chaîne_sql ) ;
* si le numéro de lot a un espace quelque part et que vous devez rechercher "comme" '%numéro de lot'... cela ne fonctionne pas en SQL. vous devrez créer un script différent
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut msharp,
Merci beaucoup pour votre contribution.
J'ai maintenant combiné cette section "jointure verticale" de la section de script dans le script principal et cela fonctionne à merveille
Le temps requis pour l'extraction des données a été réduit à une fraction de ce qu'il était auparavant et la possibilité de scripter et d'automatiser l'ensemble de la procédure me permet de le faire pendant la nuit lorsque nos serveurs sont sous une charge plus légère.
Cordialement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Il y a plusieurs façons d'aborder cette dernière question.La solution la plus simple et la plus simple n'est probablement pas très intuitive.Ce que vous voulez faire, c'est créer une liste de tables, puis pousser chaque table de données dans la liste. Ensuite, vous pouvez concaténer la liste ensemble à la fois.Voici le contour :
mesTables = {} ;
Pour ( je = 1...
dt = exécuter sql ( ... ) ;
Insérer dans ( mesTables , dt ) ;
) ;
dtTout = Nouveau tableau ( "Toutes les données" ) ;
dtTout << Enchaîner (
eval ( mesTables ) ,
Tableau de sortie ( "Toutes les données" )
) ;
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut PMroz,
Un grand merci pour votre soutien et votre patience.
Sur la base de votre contribution, ainsi que celle de EricHill , Ron Horne et msharp Je suis maintenant en mesure de configurer la requête SQL imbriquée comme je l'avais espéré.
Cette méthode est directement transférable à la tâche d'acquisition de données plus avancée mentionnée au début de cet article et cela vous évitera de nombreuses heures d'attente pour que les données soient renvoyées par le serveur.
J'ai beaucoup appris dans cet exercice et j'apprécie tous vos efforts.
Une dernière question....
Maintenant que j'ai toutes les données collectées dans des tables de données séparées (faites pour accélérer l'acquisition des données), existe-t-il un moyen, sans avoir à enregistrer toutes les tables de données, d'effectuer une concaténation sur toutes les tables ouvertes afin que je puisse plus facilement effectuer des données analyses ?
Je peux déjà le faire en sauvegardant toutes les tables de données et en utilisant JSL pour les concaténer lors de la réouverture, mais il semble idiot de devoir le faire de cette façon.
Je vous souhaite à tous un Joyeux Noël,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Je pense que ça fera l'affaire :
// Exemple de table - vous n'avez pas à effectuer cette étape si la table existe déjà. Mais vous devriez créer
// une variable pour pointer dessus.
wafer_dt = Nouveau tableau ( "Numéros de plaquette" ,
Ajouter des lignes ( 9 ) ,
Nouvelle colonne ( "Numéro de plaquette" ,
Personnage ,
Nominal ,
Définir les valeurs (
{ "XC6A49L410.1" , "XC6A49L411.1" , "XC6A49L412.1" , "XC6A49L413.1" ,
"XC6A49L414.1" , "XC6A49L415.1" , "XC6A49L416.1" , "XC6A49L417.1" ,
"XC6A49L418.1" }
)
)
) ;
// Par exemple, si votre table s'appelle Wafer Numbers, cette instruction attribuera une variable à cette table
// wafer_dt = data table("Wafer Numbers");
// Stocke les numéros de wafer dans une liste
wafer_list = colonne ( wafer_dt , "Numéro de plaquette" ) << obtenir des valeurs ;
dsn_string = "DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;ODA=F;TSZ=8192;" ;
// Crée une instruction SQL où le numéro de wafer est une variable à remplacer pendant la boucle
instruction_sql = evalinsert (
"\[ SELECT WaferNR,WIPSTATUS
DE "DISCSET"
WHERE WaferNR = '^one_wafer^']\" ) ;
// Créer une connexion à la base de données
dbc = créer une connexion à la base de données ( dsn_string ) ;
pour ( je = 1 , je <= articles ( wafer_list ) , je ++,
one_wafer = wafer_list [ je ] ;
// Nommez la table de la même manière que la tranche.Modifiez selon vos besoins
nom_tbl = one_wafer ;
// Récupérer les données d'un wafer
dt = exécuter sql ( dbc , instruction_sql , nom_tbl ) ;
) ;
// Maintenant que nous avons fini de récupérer toutes les tranches dans des tables séparées
// ferme la connexion à la base de données
fermer la connexion à la base de données ( dbc ) ;
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Vous manquez clairement le message ET l'intention de ce que j'ai dit.
Quoi qu'il en soit, il n'y a aucune raison pour que ce message de forum soit plus long que celui de Ron Horne puisqu'il renvoie à un forum où j'ai déjà résolu ce problème étape par étape.
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Mes excuses MSHARP si je vous ai offensé d'une manière ou d'une autre avec ma demande directe d'assistance.
Comme je l'ai moi-même déjà dit, je ne suis malheureusement pas un expert en JSL mais j'ai réussi à faire pas mal de choses sur la base des contenus proposés par cette communauté.
J'ai en fait assisté à un cours JMP JSL de 2 jours mais malheureusement, en raison de son organisation par un bureau local en Europe pour un enseignant américain avec une classe très internationale, il y a eu de nombreux problèmes techniques et beaucoup de temps a été perdu au cours des 2 jours, laissant une bonne partie du matériel et des entraînements non couverts.
Jusqu'à présent, j'ai eu de bons retours d'autres membres de cette communauté et je travaille en fait avec JMP sur un prochain didacticiel basé sur un domaine où j'ai plus de connaissances et d'expérience.
En aucune occasion je n'ai revendiqué l'aide offerte par d'autres membres comme mon propre travail. J'ai été ouvert en indiquant d'où vient l'aide et à quel point il est agréable d'appartenir à un tel groupe de soutien où il est possible de grimper la courbe d'apprentissage plus rapidement et plus loin que dans d'autres communautés.
Je ne peux qu'espérer que d'autres partagent mon sentiment et continuent à soutenir et à enseigner les moins capables.
Sincèrement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Tu l'as, vas-y.
Je pense que tu as une mauvaise approche. Si vous avez besoin que la communauté jmp vous fournisse le code pour le cas simple, vous ne pourrez en aucun cas l'implémenter pour le cas compliqué. Il semble que vous ayez pris un projet bien au-dessus de votre tête.Dans ce cas, je vous recommande de lire le Guide de script ou de suivre un cours.
Vraiment, pour tirer le meilleur parti d'une communauté, vous devez d'abord développer vous-même un code ; puis, lorsqu'il est bloqué pendant le débogage ou l'optimisation, la communauté peut mieux vous aider à le refactoriser.Demander du code directement comme celui-ci n'est guère plus que du plagiat.
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut Eric, Ron et PMroz,
Merci à tous pour votre participation.
Malheureusement, ma compétence JSL n'est pas à un niveau qui me permette de prendre toutes vos entrées et de créer un script fonctionnel.
Je n'ai pas été en mesure de déterminer la logique et la séquence de vos 3 entrées. Je suis toujours confus, mais à un niveau supérieur
Mes efforts ne renvoient des données que pour la dernière plaquette de ma liste "wafers.jmp".
Que diriez-vous de prendre un exemple beaucoup plus facile pour qu'au moins je ne sois pas confus.
J'ai une liste de wafers dans un fichier nommé "wafers.jmp":
XC6A49L410.1
XC6A49L411.1
XC6A49L412.1
XC6A49L413.1
XC6A49L414.1
XC6A49L415.1
XC6A49L416.1
XC6A49L417.1
XC6A49L418.1
J'ai besoin de collecter le WIPSTATUS des wafers répertoriés en utilisant le SQL approprié :
SELECT WaferNR,WIPSTATUS
DE "DISCSET"
WHERE WaferNR = (toutes les tranches de la liste ci-dessus)
Pour ce faire, je dois configurer la chaîne de connexion :
"DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;ODA=F;TSZ=8192;"
J'ai besoin d'établir la variable "wafer_id" '^WAFER_ID^' .........
mettre en place une boucle pour construire le SQL requis qui collectera les données requises, une plaquette à la fois ........
ouvrir la connexion à la base de données...
exécuter le SQL "munged" ........
collecter toutes les données dans un tableau de données . ........
se déconnecter de la base de données ??
En utilisant l'exemple simple ci-dessus, pourriez-vous aider à construire un script qui pourrait être testé afin que je puisse essayer de travailler moi-même sur le cas le plus avancé.
Cordialement,
Philippe
PS Veuillez noter qu'il ne s'agit que d'un exemple simple de ce que je veux faire. Cette acquisition de données prend des millisecondes alors que le cas avancé prend actuellement de nombreuses heures à éventuellement des jours, car je n'ai pas la possibilité d'extraire des données pour "une plaquette à la fois". temps".
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Merci Jef pour tes bons conseils.
Cette acquisition de données particulière est en effet assez difficile et nécessite une planification minutieuse car les données sont extraites de nombreuses tables de base de données contenant de nombreux To de données.
3 de nos propres administrateurs DB ainsi que 2 sociétés externes ont travaillé à son optimisation.
D'où la raison de rechercher cette approche "une plaquette à la fois".
Cette approche a récemment été démontrée avec succès, en utilisant le même SQL par Denodo, mais pour le moment, nous n'avons pas encore de logiciel Denodo disponible.
Cordialement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Si vous exécutez de nombreuses instructions SQL dans une boucle, vous devez adopter une approche différente :
dbc = ouvrir la connexion à la base de données ( "" ) ;
pour chaque ligne (
sql = ...
exécuter sql ( dbc , sql ) ;
) ;
fermer la connexion à la base de données ( dbc ) ;
De cette façon, vous ne vous connectez qu'une seule fois à la base de données, ce qui peut vous faire gagner un peu de temps.
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Je suggérerais également, respectueusement, que vous vous assuriez que votre SQL est optimisé de manière appropriée.
Comme EricHill souligne qu'une requête sans JOIN aboutit généralement à un produit cartésien correspondant à chaque ligne de chaque table avec chaque ligne de toutes les autres tables. Cela peut demander beaucoup de temps et de ressources. L'exemple de code que vous avez fourni n'a pas de JOIN. Si cela est représentatif de votre code réel, il peut être utile de déterminer si vous pouvez améliorer le SQL ainsi que le JSL.
-Jeff
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut Eric,
Merci pour le script que j'ai essayé de modifier pour le SQL d'origine.
La longue chaîne SQL est créée à partir de la liste des plaquettes dans wafers.jmp, mais pour une raison ou une autre, je n'obtiens que des résultats d'une seule plaquette.
Même si je duplique plusieurs fois l'ID d'une plaquette, je n'obtiens toujours que la valeur d'une seule plaquette ou les résultats des tests.
J'espère que ma compréhension est bonne...
J'ai d'abord mis en place le modèle, selon votre exemple....
Ensuite, j'ai configuré le répertoire par défaut où "wafers.jmp" est stocké .....
Lancez la boucle.....
pour chaque ligne(
wafer_id = :WaferID ;
sql = Eval Insert( sqlTemplate );
Imprimer( sql );
);
Connectez-vous à la base de données et exécutez le sql ???
Ouvrir la base de données(
"DSN=TESTING;UID=tepo;PWD=password;DBQ=Production;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST =T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0 ;ODA=F;TSZ=8192;",
Insertion d'évaluation (sql)
);
;
C'est cette dernière partie dont je ne suis pas sûr.
Toutes les idées, suggestions.
Il semble que nous soyons assez proches....
Cordialement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Merci Ron pour le lien.
En tant que nouveau venu dans JMP et les scripts, je ne comprends pas encore complètement la logique, mais je vais essayer de la comprendre.
Cordialement,
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Merci pour le pointeur, Ron, qui m'a fait gagner du temps.Donc, en utilisant l'exemple indiqué par Ron, j'ai placé les identifiants de tranches d'intérêt dans une table de données nommée wafers.jmp, puis j'ai écrit ce script :
modèle sql = "\[
SÉLECTIONNER
I.PRODUCTNR,
T.TESTUNITNR,
T.POINT DE MESURENR,
T.CREATIONTIME,
T.RESULT_PARAM1,
T.RESULT_PARAM2
DEPUIS
" ARTICLES " D,
"RESULTATS DU TEST" T,
TRR "TESTRESULTROWS",
"TESTROW" TR,
OÙ I.IDNR = T.IDNR
ET T.TESTRESULTNR = TRR.TESTRESULTNR
ET TRR.TESTROWIDNR = TR.TESTROWIDNR
ET I.LOTIDNR = L.LOTIDNR
ET T.VALIDITE = '1'
ET D.WAFERNR = '^wafer_id^'
ET (T.TESTUNITNR COMME ('HENE%')
ET TR.VARIABLENAME DANS
('ACÉNUM',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF' )
;
]\" ;
ouvrir ( "wafers.jmp" ) ;
pour chaque ligne (
wafer_id = : WaferID ;
sql = Insertion d'évaluation ( modèle sql ) ;
Imprimer ( sql ) ;
) ;
Cela imprime bien sûr le SQL munged; vous pouvez ajouter du code pour soumettre le SQL à votre base de données.
HTH,
Éric
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut jpol ,
Peut-être que cet exemple peut être utile :
https://community.jmp.com/message/223900#223900
Ron
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut, Philippe,
OK, désolé, je voulais juste m'assurer.Je vais travailler sur un exemple de bouclage.
Éric
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut Eric.
Merci pour votre inquiétude.
Comme indiqué, il s'agit d'un Sql factice qui est beaucoup plus court que l'original.
J'espérais simplement présenter le cas d'un point de vue JSL plutôt que SQL.
Rgds
Philippe
Re : Comment insérer une boucle dans SQL qui est utilisée dans un script JSL ?Salut, Philippe,
La boucle est certainement possible, mais tout d'abord : telle qu'elle est écrite, votre instruction SQL génère un produit cartésien, ce qui pourrait expliquer l'augmentation exponentielle de la taille.Est-ce nécessaire ?
Éric