2

我想用一个插件创建变量,它导入一个数据库表。我正在使用以下代码来执行此操作:

SF_macro_save("_vars", "var1 var2...");
SF_macro_save("_types", "type1 type2...");
SF_macro_save("_formats", "format1 format2...");
SF_macro_save("_obs", "obs1 obs2...");

这可以很好地创建变量,但我不知道如何为变量或值赋予标签。

我需要使用哪个 C++ 函数来创建标签?或者如何从 C++ 调用 Stata 函数?(如果重要的话,我正在使用 Visual Studio 10)

我想从插件中调用这个Stata函数:

标签变量 var1 label1

标签定义 var1_label 1 "label1" 2 "label2" 标签值 var1 var1_label

谢谢

4

2 回答 2

1

这是可能的,但并不容易。基本上,您在代码中创建一个 .do 文件(下面的 C# 示例),然后执行该 .do 文件。这是一个运行 .do 文件然后使用 ODBC 将结果放入 SQL Server 数据库的示例。您可以使用 Stat/Transfer 执行类似的操作,将数据和变量标签加载到数据库中。

            string m_stcmd_valuelabels = Server.MapPath("~/Data/Cmd/Stata/") + m_filename_noex + "_valuelables.do";

            using (StreamWriter m_sw_stcmd_valuelabels = new StreamWriter(m_stcmd_valuelabels, false))
            {

                m_sw_stcmd_valuelabels.WriteLine("clear");
                m_sw_stcmd_valuelabels.WriteLine("set mem 500m");
                m_sw_stcmd_valuelabels.WriteLine("set more off");
                m_sw_stcmd_valuelabels.WriteLine("use  \"" + m_fullpath.Replace(".zip", ".dta") + "\"");
                m_sw_stcmd_valuelabels.WriteLine("valtovar _all, dis");
                m_sw_stcmd_valuelabels.WriteLine("uselabel");
                m_sw_stcmd_valuelabels.WriteLine("ren lname varname");
                m_sw_stcmd_valuelabels.WriteLine("drop trunc");
                m_sw_stcmd_valuelabels.WriteLine("odbc insert, dsn(\"MyData\") table(\"" + m_filename_noex + "_valuelabels\") create " + m_statadsn_conn);
                m_sw_stcmd_valuelabels.WriteLine("exit");
                m_sw_stcmd_valuelabels.WriteLine();
            }

            string str_PathValueLabels = Server.MapPath("~/Data/Stata12/StataMP-64.exe");

            ProcessStartInfo processInfoValueLabels = new ProcessStartInfo("\"" + str_PathValueLabels + "\"");
            processInfoValueLabels.Arguments = " /e do \"" + m_stcmd_valuelabels + "\"";
            processInfoValueLabels.UseShellExecute = false;
            processInfoValueLabels.ErrorDialog = false;

            Process batchProcessValueLabels = new Process();
            batchProcessValueLabels.StartInfo = processInfoValueLabels;
            batchProcessValueLabels.Start();
于 2013-12-06T11:35:16.150 回答
0

你不能从插件中做到这一点。您不能创建变量、标签。等等..从你的 dll 中,数据集必须在你调用插件之前定义,你可能已经知道了。您可以将数据值存储回变量中,但如果您愿意,则无​​需添加“列”。您可以将所需的名称存储在宏中,但它将落在您的“.do”文件中以将它们分配给 Stata 中的变量,对不起。

于 2015-03-14T05:24:52.200 回答