Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo,
Ich muss für viele Produktionswafer parametrische Testdaten auf Chipebene von Endtestern sammeln.
Jeder Wafer verfügt über ca. 3000 Chips und 10 Parameter.
Für diese Hilfeanfrage habe ich ein Dummy-SQL erstellt:
WÄHLEN
I.PRODUKTNR,
T.TESTUNITNR,
T.MEASUREMENTPOINTNR,
T.CREATIONTIME,
T.RESULT_PARAM1,
T.RESULT_PARAM2.
.
.
.
AUS
„ITEMS“ D,
„TESTRESULTS“ T,
„TESTRESULTROWS“ TRR,
„TESTROW“ TR,
.
.
WO I.IDNR = T.IDNR
UND T.TESTRESULTNR = TRR.TESTRESULTNR
UND TRR.TESTROWIDNR = TR.TESTROWIDNR
UND I.LOTIDNR = L.LOTIDNR
AND T.VALIDITY = '1'
UND D.WAFERNR IN
(
'WAF43K309A',
'WAF43K310A',
'WAF43K311A',
'WAF43K312A',
'WAF43K313A',
'WAF43K314A',
., ., ., ., .,
'WAF43K315A',
'WAF43K316A',
'WAF43K317A',
'WAF43K319A',
'WAF43K320A',
'WAF43K321A'
)
AND (T.TESTUNITNR LIKE ('HENE%')
UND TR.VARIABLENAME IN
( 'ACENUM',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF',
......)
GRUPPIERE NACH ...
Wenn ich alle Daten für den ersten aufgeführten Wafer (WAF43K309A) sammle, beträgt die Erfassungs-/Abrufzeit ~ 90 Sekunden.
Wenn ich alle Daten für die ersten beiden aufgelisteten Wafer sammle (WAF43K309A, WAF43K310A), beträgt die Erfassungs-/Abrufzeit ca. 4 Minuten
Wenn ich alle Daten für die ersten drei aufgelisteten Wafer sammle (WAF43K309A, WAF43K310A, WAF43K311A), beträgt die Erfassungs-/Abrufzeit ca. 7 Minuten
Ich bin mir sicher, dass Sie das Problem erkennen: Die Sammel-/Abrufzeit wächst exponentiell mit der Anzahl der Wafer.
Irgendwann muss ich das am Wochenende machen!!
Wenn ich den SQL-Operator „Union All“ verwende und Daten für jeweils einen Wafer erfasse, kann ich die Daten für jeden Wafer ungefähr mit der gleichen Zeit abrufen.
Das ist in Ordnung, wenn ich nur ein paar Wafer in meiner Liste habe. Leider muss ich oft Daten von mehreren Zehnern, sogar Hunderten von Wafern sammeln.
Mit einer inneren Auswahl könnte ich eine Liste der Wafer erstellen:
z.B
.....
UND D.WAFERNR IN (
WÄHLEN SIE WAFERNR aus ARTIKEL
WO TESTDATE > SYSDATE-5)
Die resultierende Waferliste wäre:
WAF43K309A
WAF43K310A
WAF43K311A
WAF43K312A
WAF43K313A
WAF43K314A
WAF43K315A
WAF43K316A
WAF43K317A
WAF43K319A
WAF43K320A
WAF43K321A
Ist es mit JSL möglich, diese Auflistung zu verwenden, indem man die Liste durchläuft und Daten für jeweils einen Wafer sammelt?
Ich bin gespannt, welche kreativen Lösungen die Community zu bieten hat
Eine Lösung wäre ein tolles Weihnachtsgeschenk
Mit freundlichen Grüßen,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo Yosef,
Danke für deinen Beitrag.
Mir gefällt die Art und Weise, wie Sie die Liste für die Verwendung in SQL-Skripten erstellt haben, und ich bin sicher, dass ich sie bei Bedarf verwenden kann.
In diesem speziellen Fall besteht die Idee darin, die Verwendung einer Wafer-Liste in der SQL zu vermeiden, da diese die Datenerfassung im Vergleich zum Ansatz mit jeweils einem Wafer nach dem anderen verlangsamt.
Mit freundlichen Grüßen,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo
Ich verwende das folgende Skript, um eine Zeile zu erstellen, die eine Losliste enthält
lot_list = Spalte ( 1 ) << Holen Sie sich Werte ;
in_list = "('" || Concat-Elemente ( lot_list , "','" ) || "')" ;
sql_string = "WO \!"VIEL\!" IN " || in_list ;
// / Wenn Sie die Zeichenfolge sehen möchten / / /
zeigen ( sql_string ) ;
*Wenn die Losnummer irgendwo ein Leerzeichen enthält und Sie nach „wie“ „%Lotnummer“ suchen müssen, funktioniert das in SQL nicht. Sie müssen ein anderes Skript erstellen
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo msharp,
Vielen Dank für Ihren Beitrag.
Ich habe jetzt diesen „vertikalen Verbindungs“-Abschnitt des Skriptabschnitts in das Hauptskript integriert und es funktioniert hervorragend
Der Zeitaufwand für die Datenextraktion hat sich auf einen Bruchteil dessen verringert, was zuvor erforderlich war. Durch die Möglichkeit, den gesamten Vorgang per Skript zu automatisieren und zu automatisieren, kann ich dies auch nachts tun, wenn unsere Server weniger ausgelastet sind.
Mit freundlichen Grüßen,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Es gibt viele Möglichkeiten, diese letzte Frage zu beantworten.Die wahrscheinlich einfachste und einfachste Lösung ist nicht sehr intuitiv.Sie möchten eine Tabellenliste erstellen und dann jede Datentabelle in die Liste verschieben. Dann können Sie die Liste auf einmal verketten.Hier ist die Gliederung:
myTables = {} ;
Für ( ich = 1...
dt = SQL ausführen ( ... ) ;
Einfügen in ( myTables , dt ) ;
) ;
dtAll = Neuer Tisch ( "Alle Daten" ) ;
dtAll << Verketten (
evalu ( myTables ) ,
Ausgabetabelle ( "Alle Daten" )
) ;
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo PMroz,
Vielen Dank für Ihre Unterstützung und Ihre Geduld.
Basierend auf Ihren Eingaben sowie denen von EricHill , Ron Horne Und msharp Jetzt kann ich die verschachtelte SQL-Abfrage wie erhofft einrichten.
Diese Methode ist direkt auf die am Anfang dieses Beitrags erwähnte komplexere Datenerfassungsaufgabe übertragbar und erspart viele Stunden des Wartens auf die Rückgabe der Daten vom Server.
Ich habe bei dieser Übung viel gelernt und schätze all Ihre Bemühungen.
Eine letzte Frage....
Nachdem ich nun alle Daten in separaten Datentabellen gesammelt habe (um die Datenerfassung zu beschleunigen), gibt es eine Möglichkeit, eine Verkettung für alle offenen Tabellen durchzuführen, ohne alle Datentabellen speichern zu müssen, damit ich die Daten einfacher verarbeiten kann Analysen?
Ich kann dies bereits tun, indem ich alle Datentabellen speichere und JSL verwende, um sie beim erneuten Öffnen zu verketten, aber es erscheint mir albern, es auf diese Weise tun zu müssen.
Ich wünsche Ihnen allen frohe Weihnachten,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Ich denke, das wird den Zweck erfüllen:
// Beispieltabelle – Sie müssen diesen Schritt nicht ausführen, wenn die Tabelle bereits vorhanden ist. Aber Sie sollten erstellen
// eine Variable, die darauf zeigt.
wafer_dt = Neuer Tisch ( „Wafer-Nummern“ ,
Zeilen hinzufügen ( 9 ) ,
Neue Spalte ( „Wafer-Nummer“ ,
Charakter ,
Nominell ,
Werte festlegen (
{ „XC6A49L410.1“ , „XC6A49L411.1“ , „XC6A49L412.1“ , „XC6A49L413.1“ ,
„XC6A49L414.1“ , „XC6A49L415.1“ , „XC6A49L416.1“ , „XC6A49L417.1“ ,
„XC6A49L418.1“ }
)
)
) ;
// Wenn Ihre Tabelle beispielsweise „Wafer Numbers“ heißt, weist diese Anweisung dieser Tabelle eine Variable zu
// Wafer_dt = Datentabelle("Wafer Numbers");
// Wafernummern in einer Liste speichern
wafer_list = Spalte ( wafer_dt , „Wafer-Nummer“ ) << Werte erhalten ;
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;" ;
// Erstellen Sie eine SQL-Anweisung, bei der die Wafer-Nummer eine Variable ist, die während der Schleife ersetzt wird
sql_statement = evalinsert (
"\[ SELECT WaferNR,WIPSTATUS
VON „DISCSET“
WHERE WaferNR = '^one_wafer^']\" ) ;
// Eine Verbindung zur Datenbank herstellen
dbc = Datenbankverbindung erstellen ( dsn_string ) ;
für ( ich = 1 , ich <= nitems ( wafer_list ) , ich ++,
one_wafer = wafer_list [ ich ] ;
// Benennen Sie die Tabelle genauso wie den Wafer.Passen Sie es an Ihre Bedürfnisse an
Tabellenname = one_wafer ;
// Daten für einen Wafer abrufen
dt = SQL ausführen ( dbc , sql_statement , Tabellenname ) ;
) ;
// Jetzt sind wir damit fertig, alle Wafer in separate Tabellen abzurufen
// Verbindung zur Datenbank schließen
Datenbankverbindung schließen ( dbc ) ;
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Ihnen fehlt eindeutig die Botschaft UND Absicht dessen, was ich gesagt habe.
Wie auch immer, es gibt keinen Grund, warum dieser Forumsbeitrag länger sein muss als der Beitrag von Ron Horne, da er auf ein Forum verweist, in dem ich dieses Problem bereits Schritt für Schritt gelöst habe.
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Ich entschuldige mich, MSHARP, wenn ich Sie mit meiner direkten Bitte um Hilfe auf die eine oder andere Weise beleidigt habe.
Wie ich selbst bereits gesagt habe, bin ich leider kein Experte für JSL, aber ich habe auf der Grundlage der von dieser Community angebotenen Inhalte einiges erreicht.
Ich habe tatsächlich an einem zweitägigen JMP-JSL-Kurs teilgenommen, aber leider gab es viele technische Probleme und es ging in den beiden Tagen viel Zeit verloren, weil er von einem lokalen Büro in Europa für einen amerikanischen Lehrer mit einem sehr internationalen Kurs organisiert wurde. So bleibt ein großer Teil des Materials und der Trainings nicht abgedeckt.
Ich habe bisher gutes Feedback von anderen Mitgliedern dieser Community erhalten und arbeite tatsächlich mit JMP an einem bevorstehenden Tutorial, das auf einem Bereich basiert, in dem ich über mehr Wissen und Erfahrung verfüge.
Zu keinem Zeitpunkt habe ich die von anderen Mitgliedern angebotene Hilfe als meine eigene Arbeit beansprucht. Ich habe offen dargelegt, woher die Unterstützung kommt und wie großartig es sich anfühlt, zu einer so unterstützenden Gruppe zu gehören, in der man die Lernkurve schneller und weiter erklimmen kann als in anderen Gemeinschaften.
Ich kann nur hoffen, dass andere meine Meinung teilen und weiterhin die weniger Fähigen unterstützen und unterrichten.
Aufrichtig,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Du hast es verstanden, mach es.
Ich denke, Sie haben einen falschen Ansatz. Wenn Sie von der JMP-Community den Code für den einfachen Fall manuell erhalten müssen, gibt es keine Möglichkeit, ihn für den komplizierten Fall zu implementieren. Es scheint, als hätten Sie ein Projekt übernommen, das Ihnen völlig zu viel wird.In diesem Fall würde ich Ihnen empfehlen, den Scripting Guide zu lesen oder einen Kurs zu besuchen.
Um das Beste aus einer Community herauszuholen, sollten Sie zunächst selbst einen Code entwickeln. Wenn Sie dann beim Debuggen oder Optimieren nicht weiterkommen, kann Ihnen die Community besser bei der Umgestaltung helfen.So direkt nach Code zu fragen, ist kaum mehr als ein Plagiat.
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo Eric, Ron und PMroz,
Vielen Dank an alle für Ihren Beitrag.
Leider sind meine JSL-Kompetenzen nicht so weit, dass ich alle Ihre Eingaben berücksichtigen und ein funktionierendes Skript erstellen kann.
Ich konnte die Logik und Reihenfolge Ihrer drei Eingaben nicht ermitteln. Ich bin immer noch verwirrt, aber auf einem höheren Niveau
Meine Bemühungen geben nur Daten für den letzten Wafer in meiner „wafers.jmp“-Liste zurück.
Wie wäre es, wenn ich ein viel einfacheres Beispiel nehme, damit ich zumindest nicht verwirrt werde?
Ich habe eine Liste von Wafern in einer Datei namens „wafers.jmp“:
XC6A49L410.1
XC6A49L411.1
XC6A49L412.1
XC6A49L413.1
XC6A49L414.1
XC6A49L415.1
XC6A49L416.1
XC6A49L417.1
XC6A49L418.1
Ich muss den WIPSTATUS der aufgelisteten Wafer mithilfe der entsprechenden SQL erfassen:
WÄHLEN Sie WaferNR,WIPSTATUS
VON „DISCSET“
WHERE WaferNR = (alle Wafer in der Liste oben)
Dazu muss ich die Verbindungszeichenfolge einrichten:
"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;"
Ich muss die Variable „wafer_id“ ‚^WAFER_ID^‘ einrichten .........
Richten Sie eine Schleife ein, um das erforderliche SQL zu erstellen, das die erforderlichen Daten Wafer für Wafer sammelt.
Öffnen Sie die Datenbankverbindung...
Führen Sie das „munged“ SQL aus ........
Sammeln Sie alle Daten in eine Datentabelle . ........
Von der Datenbank trennen??
Anhand des einfachen Beispiels oben könnt ihr mir bitte dabei helfen, ein Skript zu erstellen, das getestet werden kann, damit ich versuchen kann, selbst an dem fortgeschritteneren Fall zu arbeiten.
Mit freundlichen Grüßen,
Philipp
PS Bitte beachten Sie, dass dies nur ein einfaches Beispiel für das ist, was ich tun möchte. Diese Datenerfassung dauert Millisekunden, während der fortgeschrittene Fall derzeit viele Stunden bis möglicherweise Tage dauert, da ich nicht die Möglichkeit habe, Daten für „einen Wafer nach dem anderen“ abzurufen Zeit".
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Vielen Dank, Jeff, für deinen guten Rat.
Diese spezielle Datenerfassung ist in der Tat ziemlich anspruchsvoll und erfordert eine sorgfältige Planung, da die Daten aus vielen DB-Tabellen abgerufen werden, die viele TB an Daten enthalten.
Drei unserer eigenen DB-Administratoren sowie zwei externe Unternehmen haben an der Optimierung gearbeitet.
Daher der Grund für die Suche nach diesem „Ein-Wafer-für-einen“-Ansatz.
Dieser Ansatz wurde kürzlich erfolgreich demonstriert, wobei dasselbe SQL von Denodo verwendet wurde, aber im Moment ist die Software von Denodo noch nicht verfügbar.
Mit freundlichen Grüßen,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Wenn Sie viele SQL-Anweisungen in einer Schleife ausführen, sollten Sie einen anderen Ansatz wählen:
dbc = offene Datenbankverbindung ( „“ ) ;
Für jede Reihe (
sql = ...
SQL ausführen ( dbc , sql ) ;
) ;
Datenbankverbindung schließen ( dbc ) ;
Auf diese Weise stellen Sie nur einmal eine Verbindung zur Datenbank her, was Ihnen etwas Zeit sparen kann.
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Ich würde auch respektvoll vorschlagen, dass Sie sicherstellen, dass Ihr SQL entsprechend optimiert ist.
Als EricHill weist darauf hin, dass eine Abfrage ohne JOIN normalerweise zu einem kartesischen Produkt führt, das jede Zeile jeder Tabelle mit jeder Zeile jeder anderen Tabelle übereinstimmt. Dies kann sehr zeit- und ressourcenintensiv sein. Der von Ihnen bereitgestellte Beispielcode verfügt über keinen JOIN. Wenn dies für Ihren tatsächlichen Code repräsentativ ist, lohnt es sich möglicherweise zu untersuchen, ob Sie sowohl SQL als auch JSL verbessern können.
-Jeff
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo Eric,
Vielen Dank für das Skript, das ich für das ursprüngliche SQL zu ändern versucht habe.
Die lange SQL-Zeichenfolge wird aus der Wafer-Liste in „wafers.jmp“ erstellt, aber aus irgendeinem Grund erhalte ich nur Ergebnisse von einem Wafer.
Selbst wenn ich die eine Wafer-ID mehrmals dupliziere, erhalte ich immer noch nur den Wert oder die Testergebnisse eines Wafers.
Hoffentlich ist mein Verständnis richtig...
Ich habe zuerst die Vorlage gemäß Ihrem Beispiel eingerichtet ...
Dann richte ich das Standardverzeichnis ein, in dem „wafers.jmp“ gespeichert ist .....
Setze die Schleife in Gang.....
Für jede Reihe(
wafer_id = :WaferID;
sql = Eval Insert( sqlTemplate );
Print( sql );
);
Stellen Sie eine Verbindung zur Datenbank her und führen Sie die SQL aus ???
Datenbank öffnen(
"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;",
Evaluierungseinfügung (SQL)
);
;
Bei diesem letzten Teil bin ich mir nicht sicher.
Irgendwelche Ideen, Vorschläge.
Es scheint, dass wir ziemlich nah dran sind...
Mit freundlichen Grüßen,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Danke Ron für den Link.
Als Neuling in JMP und Scripting verstehe ich die Logik noch nicht vollständig, werde aber versuchen, sie herauszufinden.
Mit freundlichen Grüßen,
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Danke für den Hinweis, Ron, das hat mir etwas Zeit gespart.Anhand des Beispiels, auf das Ron hingewiesen hat, habe ich die interessierenden Wafer-IDs in eine Datentabelle namens „wafers.jmp“ eingefügt und dann dieses Skript geschrieben:
sqlTemplate = „\[
WÄHLEN
I.PRODUKTNR,
T.TESTUNITNR,
T.MEASUREMENTPOINTNR,
T.CREATIONTIME,
T.RESULT_PARAM1,
T.RESULT_PARAM2
AUS
„ITEMS“ D,
„TESTRESULTS“ T,
„TESTRESULTROWS“ TRR,
„TESTROW“ TR,
WO I.IDNR = T.IDNR
UND T.TESTRESULTNR = TRR.TESTRESULTNR
UND TRR.TESTROWIDNR = TR.TESTROWIDNR
UND I.LOTIDNR = L.LOTIDNR
AND T.VALIDITY = '1'
AND D.WAFERNR = '^wafer_id^'
AND (T.TESTUNITNR LIKE ('HENE%')
UND TR.VARIABLENAME IN
( 'ACENUM',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF' )
;
]\" ;
offen ( „wafers.jmp“ ) ;
Für jede Reihe (
wafer_id = : WaferID ;
sql = Evaluierungseinlage (sqlTemplate) ;
Drucken (SQL) ;
) ;
Das druckt natürlich nur das mungierte SQL aus; Sie können Code hinzufügen, um die SQL an Ihre Datenbank zu übermitteln.
HTH,
Erik
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo jpol ,
Vielleicht kann dieses Beispiel nützlich sein:
https://community.jmp.com/message/223900#223900
Ron
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo, Philip,
Okay, tut mir leid, ich wollte nur sichergehen.Ich werde ein Beispiel für eine Schleife ausarbeiten.
Erik
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo Eric.
Danke für dein Besorgnis.
Wie bereits erwähnt, handelt es sich hierbei um ein Dummy-SQL, das viel kürzer als das Original ist.
Ich hatte gehofft, den Fall nur aus der JSL-Perspektive und nicht aus der SQL-Perspektive darzustellen.
Rgds
Philipp
Betreff: Wie füge ich eine Schleife in SQL ein, die in einem JSL-Skript verwendet wird?Hallo, Philip,
Eine Schleife ist sicherlich möglich, aber das Wichtigste zuerst: Wie geschrieben generiert Ihre SQL-Anweisung ein kartesisches Produkt, das für den exponentiellen Größenanstieg verantwortlich sein könnte.Ist das notwendig?
Erik