Hallo,
Ich arbeite an einem Add-In, um Werte aus dem OSIsoft-PI-Konnektor horizontal zu verketten, da es jedes Tag in einer separaten Tabelle öffnet, für die Spalte (1) der Zeitstempel und Spalte (2) der Wert des Tags ist.Ich habe eine Problemumgehung mit gefunden "Aktualisieren" die funktioniert gut . Mein ursprünglicher Plan war jedoch die Verwendung "Verbinden" um das Sammeln von Zeilen zu vermeiden, wenn Zeitstempel falsch ausgerichtet sind, und um den letzten Schritt des Löschens von Zeilen wie bei der „Update“-Strategie zu vermeiden.Leider bin ich auf verschiedene Fehlermeldungen gestoßen und würde es gerne besser verstehen wie man den Join funktioniert (für weitere Scripting-Arbeiten). Im Anhang finden Sie ein Word-Dokument mit weiteren Details zu Schritten und Fehlern sowie Skripts (Update funktioniert, während Join fehlschlägt) und Datentabellen.
Vielen Dank für die Hilfe, ich bin offen für ein Teammeeting oder eine Dokumentation.
Emmanuel
Bonjour, @Emmanuel_Romeu ,
Ich sehe das von Ihnen erwähnte Word-Dokument nicht.
Hallo Emmanuel, Sie könnten dies versuchen, das den Join-Prozess durchläuft und nur eine minimale Ausdrucksbehandlung hat.
Names Default To Here( 1 );
// List of opened files
file = Get Data Table List();
n_files = N Items( file );
joinCol = "Timestamp";
joinedDt = file[1];
For Each( {i}, 2 :: (n_files), // i =2;
Eval(
Eval Expr(
joinedDt = joinedDt << Join(
With( file[i] ),
By Matching Columns( Expr( Parse( Eval Insert( ":^joinCol^" ) ) ) = Expr( Parse( Eval Insert( ":^joinCol^" ) ) ) ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
invisible
)
)
);
//set first column to join column name
Column( joinedDt, 1 ) << set name( joinCol );
//delete working files and prepare for next time through loop
Close( file[i], nosave );
Try( Close( oldJoin, nosave ) );
oldJoin = joinedDt;
);
Close( file[1], nosave );
//remove extra join columns
For Each( {i}, N Col( joinedDt ) :: 2,
If( Lowercase( Left( Column( joinedDt, i ) << get name, 9 ) ) == Lowercase( joincol ),
joinedDt << delete columns( i )
)
);
joinedDt << show window( 1 );
Danke Brady, Es klappt .
Jetzt gehe ich ins Bett und morgen (oder Montag) werde ich es versuchen verstehe exakt wie es funktioniert
.
Vielen Dank.
Bitte lassen Sie mich wissen, wenn Sie nach der Durchsicht noch Fragen haben, ich werde gerne näher darauf eingehen / einen Anruf tätigen.
Prost,
Brady
Reparieren Script_Concatenate_Tags_w_JOIN_Fail_2 :
Ändern Sie Zeile 70 in: Ausdruck (dt_joined = dt_joined << Join(
Zeile 80 löschen: Ausdr (dt_joined), aktuelle Datentabelle() ,
Meiner Meinung nach, Aktuelle Datentabelle() sollte nur verwendet werden, um die aktuelle Tabelle zu Beginn des Skripts abzurufen, da dies eines der wenigen Male ist, in dem Sie sicher wissen, auf welche Tabelle es sich bezieht (die letzte, die der Benutzer berührt hat). In vielen anderen Fällen kann sich die aktuelle Tabelle von Lauf zu Lauf unterscheiden, je nachdem, welche Operationen stattfinden, wie lange sie dauern, ob der Benutzer während der Verarbeitung eine andere Tabelle berührt hat, ob Änderungen im zugrunde liegenden Code verursacht haben, was der aktuelle war Tabelle in einer Version ändern, um sie in der nächsten zu ändern usw. So wie du es gewohnt bist Aktuelle Datentabelle() Deshalb hat Ihr Skript „funktioniert“ (es hat die zweite Tabelle aus der Datei mit der von Ihnen ausgewählten Tabelle verknüpft). Ich bin der festen Überzeugung, dass Tabellen nur explizit referenziert werden sollten. Dies geschieht in der neuen Zeile 70, wo Sie mit Sicherheit wissen, dass es sich sowohl um die Tabelle handelt, an die eine Nachricht gesendet wird, als auch an die Variable, an die die resultierende Tabelle übergeben wird.
Das Eingeben von Spaltennamen in Plattformen mithilfe von Ausdrücken ist schwierig, insbesondere wenn das Argument mehrere Spalten umfassen kann. Ich muss fast immer ein paar verschiedene Dinge ausprobieren, bevor ich etwas finde, das funktioniert. Ich bin mir ziemlich sicher, dass sich diese Funktionalität im Laufe der Jahre weiterentwickelt hat und sich glücklicherweise zum Besseren (flexibler) verändert hat. Trotzdem ist es eine Herausforderung. @Mark_Bailey hat ein schöner Artikel über die Arbeit mit Spalten die ich zum Lesen empfehle.
In dem Script_Concatenate_Tags_w_JOIN_Fail_1 Skript, das erste Verbinden Block, das Problem ist nicht mit Analysieren , aber mit dem Versuch, einen Verweis auf die Spalte in eine Liste einzufügen (JMP kann die Spalte nicht finden). Während Sie mehrere Anweisungen in haben können Ersatz (Ich mache das häufig), brauchen Sie in diesem Fall nicht. Du kannst es direkt eintragen Verbinden Verwenden Sie seinen Namen anstelle seiner Nummer (die ich nicht zur Arbeit bringen konnte). Darüber hinaus können Sie alle Spalten aus der verknüpften Tabelle und alle bis auf die erste aus der Tabelle greifen, um sie zu verknüpfen. Ich habe den Code neu angeordnet, damit ich explizit auf die Tabellen und Spalten verweisen und die Tabelle löschen kann, die ich nicht sofort benötige.
name = Get Data Table List(); <BR />For(i=1,i<=N Items(name),i++, name[i] = Head Name(name[i]));<BR /><BR />join1 = Data Table(1);
for (f=2, f<= N Items(name),f++,
colList1 = join1 << Get Column Names();
colList2 = Remove(Data Table(name[f]) << Get Column Names(),1);
Eval(
Substitute(
Expr (
dt_joined = join1 << Join(
With( join2 ),
Select(cl1),
SelectWith( cl2 ),
By Matching Columns( join1Col1 = join2Col1),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)
) ,
Expr (join2), Data Table(name[f]),
Expr(cl1), Name Expr(colList1),
Expr(cl2), Name Expr(colList2),
Expr (join1Col1), Column(join1,1),
Expr (join2Col1), Column(Data Table(name[f]),1),
)
);
Close(join1,No Save);
Close(Data Table(name[f]),No Save);
join1 = dt_joined;
);
Ich habe die Dinge oben im Code aufgeräumt, Sie müssen keine Tabelle erstellen, um die Tabellennamen zu sammeln. Es ist viel einfacher, die Namen in eine Liste zu schreiben und von dort aus zu arbeiten. Das kann etwas unhandlich sein, wenn die Tische groß sind. Am besten verwenden Unsichtbar oder Privatgelände um die Zwischentabellen auszublenden. Das Problem ist, dass es meines Wissens nach keine Möglichkeit gibt, den Abschlusstisch mithilfe von Nachrichten einzublenden. Sie könnten ein Subset erstellen, indem Sie die gesamte Tabelle verwenden, um sie erneut anzuzeigen.
Hallo Don, danke !!
*zum Script_Concatenate_Tags_w_JOIN_Fail_2, wie Sie sagten, habe ich verwendet aktuelle Datentabelle () um es zum Laufen zu bringen, aber ich hatte den Verdacht, dass es nicht der beste Weg ist, es zu tun. Jetzt verstehe ich, dass die Lösung mit dt_joined = dt_joined << Join() sehr nah war, aber ich wäre nie alleine darauf gekommen (jetzt verstehe ich "the Tabelle, die gemeldet wird, und die Variable, an die die resultierende Tabelle übergeben wird" werde ich hoffentlich in Zukunft darüber nachdenken).
*für Script_Concatenate_Tags_w_JOIN_Fail_1 ist es in der Tat viel einfacher, wenn Sie den richtigen Befehl verwenden (zB name[i] = Head Name(name[i] or colList2 = Remove(Data Table(name[f]) << Get Column Names(),1 )
anstatt komplexe Dinge zu bauen, um dies zu erreichen (gut zu wissen).
Danke nochmal.