¿Qué está mal en mi llamada de función?Estoy aprendiendo a escribir y llamar a funciones en JMP (procedente de Matlab).
Intentando extraer datos de una parte probada de la base de datos a través de una consulta SQL.
Escribió dos guiones separados. Una es una función con PartID como variable de entrada y la tabla de datos de prueba como salida.
Otro script es la llamada a la función, pero parece que no puedo pasar el partID a la función. ¿Dónde voy mal?
Mi llamada de función
partDataTable = getDataTable4partID("PART16.0009")Mi función
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 consulta SQL en sí funciona cuando PartID se reemplaza por el número de pieza real PART16.0009 y se ejecuta por separado escupiendo la tabla de datos deseada, pero cuando uso la llamada a la función, la tabla de datos todavía tiene 'PartID' en los scripts de Source / Update From DB en la tabla de datos vacía.
Tabla de datosScriptingVentanasRe: ¿Qué hay de malo en mi llamada de función?Verifique la función desde el índice de secuencias de comandos y desde Funciones de programación - Función . También comprobar Guía de secuencias de comandos
Actualmente tiene PartID como único argumento y partDataTable como variable local para getDataTable4PartID que no usa. Lo más probable es que desee tener la función definida con algo como esto para tener argumentos:
getDataTable4PartID = Function( {PartID, partDataTable},
Después de resolverlo, debe averiguar cómo usar los argumentos en la expresión dentro de la función. Para PartID, desea concatenarlo en la consulta SQL y partDataTable que desea usar directamente en la base de datos abierta:
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: ¿Qué hay de malo en mi llamada de función?Gracias. Esto funciona. Sin embargo, noté que tener partDataTable con comillas también funciona bien. ¿Se supone que es así?
Re: ¿Qué hay de malo en mi llamada de función?Si lo tiene entre comillas, lo más probable es que nombre su tabla de datos como partDataTable y no con el nombre que deseaba (si deseaba tenerlo como argumento).
Re: ¿Qué hay de malo en mi llamada de función?@jthi . Hmm, pero obtengo el nombre que quiero que se llame a la tabla de datos de salida (es decir, el mismo que mi partID).Esta es mi llamada de función.
partDataTable = getDataTable4partID("PART16.0009","PART16.0009")
Re: ¿Qué hay de malo en mi llamada de función?Me acabo de dar cuenta de algo y necesito confirmar si este es realmente el caso. Después de realizar un cambio en la función, parece que necesito ejecutar la función una vez para que se apliquen los cambios. Ahorrar no parece ser suficiente. ¿Es esto correcto?
Había aplicado las comillas a partDataTable y guardé mi función. La llamada a la función funcionó como se esperaba con el nombre de la tabla de datos que deseo. Pero después de ejecutar la función una vez, cuando ejecuto la llamada a la función nuevamente, obtengo lo que dijiste que obtendría, es decir, partDataTable como el nombre del archivo de tabla de datos generado.
Re: ¿Qué hay de malo en mi llamada de función?Sí (si entiendo la pregunta), la función "función (...)" debe ejecutarse para reemplazar la función compilada en la variable a la que está asignada, getDataTable4PartID en su ejemplo.
Si eso fue tan poco claro como parece, vuelva a preguntar ...
Escriba sus propias funciones también podría ser interesante.
Re: ¿Qué hay de malo en mi llamada de función?Sí, tendrá que ejecutar la función una vez para "actualizarla".
Si desea que la tabla de datos tenga el mismo nombre que PartID, puede usar un argumento en la función. Aquí hay un ejemplo un poco más completo con comillas y sin versión de comillas:
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);Para mí, estos están impresos en el registro:
partDataTable_withQuotes = DataTable("PartID");
partDataTable = DataTable("PART16.0009");
JMP devolverá la tabla de datos de la función (ya que es la "última" línea), pero no me siento cómodo confiando en él, así que usaría la referencia local en la función y luego devolvería la referencia y la función final sería algo como:
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);