C# - переменные не доступны в текущем контексте, как поправить?

Voland700

Новичок
Регистрация
29.01.2024
Сообщения
16
Благодарностей
1
Баллы
3
При написании шаблона парсера, использую библиотеку EPPlus. На первых шагах – действиях создается Excel – файл, где в первой строке заголовки, названия данных. Использую действие-кубик “Свой C#”:
C#:
FileInfo file = new FileInfo(project.Directory + "/data.xlsx");

if (file.Exists)
{
    project.SendInfoToLog("Файл существует, пеерсоздание", true);
    file.Delete();
    file = new FileInfo(project.Directory + "/data.xlsx");
}else{
    project.SendInfoToLog("Файл не существует, создадим!", true);
    file = new FileInfo(project.Directory + "/data.xlsx");
}

var package = new ExcelPackage(file);
ExcelWorksheet tabletest = package.Workbook.Worksheets.Add("Data");

tabletest.SetValue(1,1,"URL");
tabletest.SetValue(1,2,"name");
tabletest.SetValue(1,3,"catecory");
tabletest.SetValue(1,4,"scu");
tabletest.SetValue(1,5,"description");
tabletest.SetValue(1,6,"img");
tabletest.SetValue(1,7,"more");
tabletest.SetValue(1,8,"video");
tabletest.SetValue(1,9,"json_propeties");

//package.Save();
Excel файл создается успешно.

После парсинга, сбора и обработки данных, пытаюсь добавить полученные данные в созданный Excel – файл, из другого кубика действия с C# кодом,
C#:
tabletest.SetValue(1,int.Parse(project.Variables["colomn"].Value),project.Variables["propety_definition"].Value);
обращаюсь к переменным из ранее созданного кода, но получаю ошибку:

Компиляция кода Ошибка в действии "CS0103" "The name 'tabletest' does not exist in the current context". [Строка: 1; Cтолбец: 1]
Полагаю, что объявленные на первых этапах переменные в C# -коде шаблона не видны в коде других кубиках шаблона, находятся в разных областях видимости.

Как в ZenoPoster решить проблему, чтобы созданные переменные были доступны глобально во всех действиях шаблона?
 

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
392
Баллы
63
Как в ZenoPoster решить проблему, чтобы созданные переменные были доступны глобально во всех действиях шаблона?
Никак, это же функции, вот они только внутри функций и видны.
По изучай направления - общий код, глобальные переменные и контекст. а там уже выберешь где и что удобнее для твоих задач.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 786
Благодарностей
1 951
Баллы
113
Полагаю, что объявленные на первых этапах переменные в C# -коде шаблона не видны в коде других кубиках шаблона, находятся в разных областях видимости.

Как в ZenoPoster решить проблему, чтобы созданные переменные были доступны глобально во всех действиях шаблона?
Если используете переменные в кубиках C# то они в другом кубике не видны.

Если значения переменных - строки (текст) то используйте переменные проекта. Внутри кубика используете их (читаете, задаете значения ) и в другом кубике используете значения из них.

Ну или используйте общий код (при его использовании в кубиках свои нюансы) и пишите весь код там, тогда проблем с видимостью будет меньше.

Или используйте контекст проджекта (тоже свои нюансы)
 

Voland700

Новичок
Регистрация
29.01.2024
Сообщения
16
Благодарностей
1
Баллы
3
Никак, это же функции, вот они только внутри функций и видны.
По изучай направления - общий код, глобальные переменные и контекст. а там уже выберешь где и что удобнее для твоих задач.
Или используйте контекст проджекта (тоже свои нюансы)
Благодарю всех откликнувшихся. Задача решена.

Возможно, кому-нибудь пригодится, опишу решение.

В коде на начальном этапе, в действии “Свой C#” , где инициализируется необходимая в дальнейшем переменная tabletest, добавил строку: project.Context["tabletest"] = tabletest;

C#:
var package = new ExcelPackage(file);
ExcelWorksheet tabletest = package.Workbook.Worksheets.Add("Data");
project.Context["tabletest"] = tabletest;
В других кубиках – действиях, по ходу шаблона получал доступ к переменной в контексте:
C#:
var tabletest = project.Context["tabletest"];
В моем случае работает, задача решена.
 

kfil

Client
Регистрация
09.09.2016
Сообщения
18
Благодарностей
16
Баллы
3
Как еще один вариант - можно сделать класс в общем коде со статической переменой, таким образом она будет доступна во всех кубиках проекта

В общий код:
namespace ZennoLab.OwnCode
{
namespace ZennoLab.OwnCode
{
    public class myClass
    {
        public static int myVar = 0;
    }
}
в "Директивы Using":
using static ZennoLab.OwnCode.myClass;
первый кубик "Свой C# код":
//используем переменную как будто она глобальная
myVar=10;
другой кубик "Свой C# код":
//используем переменную значение которой присвоены в первом кубике
project.SendInfoToLog("myVar = "+myVar.toString());
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: Voland700

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
392
Баллы
63
Как еще один вариант - можно сделать класс в общем коде со статической переменой, таким образом она будет доступна во всех кубиках проекта

В общий код:
namespace ZennoLab.OwnCode
{
namespace ZennoLab.OwnCode
{
    public class myClass
    {
        public static int myVar = 0;
    }
}
в "Директивы Using""Директивы Using":
using static ZennoLab.OwnCode.myClass;
первый кубик "Свой C# код""Свой C# код":
//используем переменную как будто она глобальная
myVar=10;
другой кубик "Свой C# код""Свой C# код":
//используем переменную значение которой присвоены в первом кубике
project.SendInfoToLog("myVar = "+myVar.toString());
отличное решение, для работы в один поток :ay:
 
  • Спасибо
Реакции: BAZAg

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)