Cosa c'è di sbagliato nella mia chiamata di funzione?Sto imparando a scrivere e chiamare una funzione in JMP (proveniente da Matlab).
Tentativo di estrarre i dati per una parte testata dal database tramite una query SQL.
Ha scritto due script separati. Uno è una funzione con PartID come variabile di input e la tabella dei dati di test come output.
Un altro script è la chiamata alla funzione, ma non mi sembra di essere in grado di passare il partID alla funzione. Dove sto sbagliando?
La mia chiamata di funzione
partDataTable = getDataTable4partID("PART16.0009")La mia funzione
getDataTable4PartID = Function( {PartID},{partDataTable},
Open Database(
"Driver=SQL Server;
Server=XAB-SQL02;
DATABASE=TBSDF;
Trusted_Connection=Yes;",
"SELECT * FROM dbo.View_BBX a WHERE a.Part like 'PartID' AND a.TestDateTime > '2021-02-01'",
"partDataTable" // name of the output data table
);
);La query SQL stessa funziona quando PartID viene sostituito dal numero di parte effettivo PART16.0009 e viene eseguito separatamente sputando la tabella dati desiderata, ma quando utilizzo la chiamata di funzione, la tabella dati ha ancora "PartID" negli script Source/ Update From DB nella tabella dati vuota.
Tabella datiScriptingfinestreRe: Cosa c'è di sbagliato nella mia chiamata di funzione?Controlla la funzione da Scripting Index e da Funzioni di programmazione - Funzione . Controlla anche Guida agli script
Attualmente hai PartID come unico argomento e partDataTable come variabile locale per getDataTable4PartID che non usi. Molto probabilmente vuoi che la funzione sia definita con qualcosa del genere per avere argomenti:
getDataTable4PartID = Function( {PartID, partDataTable},
Dopo aver risolto il problema, devi capire come utilizzare gli argomenti nell'espressione all'interno della funzione. Per PartID vuoi concatenarlo nella query SQL e partDataTable che vuoi usare direttamente in Open Database:
Open Database(
"Driver=SQL Server;
Server=XAB-SQL02;
DATABASE=TBSDF;
Trusted_Connection=Yes;",
"SELECT * FROM dbo.View_BBX a WHERE a.Part like '"||PartID||"' AND a.TestDateTime > '2021-02-01'",
partDataTable // no need for quotes here
);
Re: Cosa c'è di sbagliato nella mia chiamata di funzione?Grazie. Questo funziona. Tuttavia, ho notato che anche avere partDataTable con le virgolette funziona bene. Dovrebbe essere così?
Re: Cosa c'è di sbagliato nella mia chiamata di funzione?Se lo hai tra virgolette, molto probabilmente chiamerà il tuo datatable partDataTable e non con il nome che volevi (se volevi averlo come argomento).
Re: Cosa c'è di sbagliato nella mia chiamata di funzione?@jthi . Hmm, ma sto ottenendo il nome che voglio che venga chiamata la tabella dei dati di output (cioè lo stesso del mio partID).Questa è la mia chiamata di funzione.
partDataTable = getDataTable4partID("PART16.0009","PART16.0009")
Re: Cosa c'è di sbagliato nella mia chiamata di funzione?Ho appena realizzato una cosa e devo confermare se è davvero così. Dopo aver apportato una modifica alla funzione, sembra che sia necessario eseguire la funzione una volta per applicare le modifiche. Il solo risparmio sembra non essere sufficiente. È corretto?
Avevo applicato le virgolette a partDataTable e ho salvato la mia funzione. La chiamata alla funzione ha funzionato come previsto con il nome della tabella dati che desidero. Ma dopo aver eseguito la funzione una volta, quando eseguo di nuovo la chiamata alla funzione, ottengo ciò che hai detto che avrei ottenuto, ovvero partDataTable come nome del file della tabella dati generato.
Re: Cosa c'è di sbagliato nella mia chiamata di funzione?Sì (se capisco la domanda), la funzione "function(...)" deve essere eseguita per sostituire la funzione compilata nella variabile a cui è assegnata, getDataTable4PartID nel tuo esempio.
Se non era chiaro come sembra, chiedi di nuovo...
Scrivi le tue funzioni potrebbe essere anche interessante.
Re: Cosa c'è di sbagliato nella mia chiamata di funzione?Sì, dovrai eseguire la funzione una volta per "aggiornarla".
Se vuoi che il datatable abbia lo stesso nome di PartID, puoi usare solo un argomento nella funzione. Ecco un esempio un po' più completo con la versione con virgolette e senza virgolette:
Names Default To Here(1);
getDataTable4PartID_withQuotes = Function({PartID},
Open Database("connectionstring",
"
select '" || PartID || "' as value
from dual
",
"PartID"
);
);
partDataTable_withQuotes = getDataTable4PartID_withQuotes("PART16.0009");
Show(partDataTable_withQuotes);
getDataTable4PartID = Function({PartID},
Open Database("connectionstring",
"
select '" || PartID || "' as value
from dual
",
PartID
);
);
partDataTable = getDataTable4PartID("PART16.0009");
Show(partDataTable);Per me questi sono stampati sul registro:
partDataTable_withQuotes = DataTable("PartID");
partDataTable = DataTable("PART16.0009");
JMP restituirà il datatable dalla funzione (dato che è l'"ultima" riga), ma non mi sento a mio agio a fidarmi di esso, quindi userei il riferimento locale nella funzione e quindi restituirei il riferimento e la funzione finale sarebbe qualcosa del tipo:
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);