Как написать следующий код на C#?

uRusure

Client
Регистрация
07.07.2018
Сообщения
40
Благодарностей
14
Баллы
8
Ребят, помогите пожалуйста, написать следующий код на C#.

Дано: Таблица с множеством строк и несколькими столбцами, в одном из которых "timestamp_unix" лежит значение в формате юникс времени (секунды) для каждой строки разные.

Необходимо: Проверять во всех строках столбец "timestamp_unix" который содержит разные юникс значения для каждой строки на то, прошло ли уже 900 секунд или больше с момента текущего юникс значения, если такая строка с таким значением есть, то брать из этой строки значение столбца "username" и класть это значение в переменную и после этого как-то помечать, что эта строка уже отработана. Я думаю можно писать в столбце "checked" типо true или false, чтобы эта строка больше не проверялась. (true - с этой строки уже брали "username"; false - с этой строки еще не брали значение "username"). Возможно вы знаете как лучше? Хотелось бы не создавать никаких дополнительных таблиц, а все делать в этой.


43498
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
C#:
var table = project.Tables["Таблица 1"];
int timenow = int.Parse(project.Variables["timenow"].Value);
List<string> unix = table.GetColumn(2).ToList();
List<int> cor = new List<int>();
for(int tabi = 1 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    for(int i = 1; i<unix.Count; i++)
    cor.Add(int.Parse(unix[i]));
    for(int j = 0 ; j < cor.Count; j++) {
        if(cor[j]-timenow > 900) {
            table.SetCell(3,j+1,"yes");
            return project.Variables["test"].Value = table.GetCell(1,j+1);
        }
        else {
            table.SetCell(3,j+1,"no");
            continue;
        }
    }
}
else continue;
}
2019-10-21_09-14-24.png

Почему-то не получилось сходу для всей таблицы применить. Я уверен что дело в полном цикле...

Я так понял пропущена логика, где надо все значения обрабатывать, а так мой берет только первое совпадение, которое удовлетворяет условию, и собственно return заканчивает цикл полностью. Не пойму только почему Проверка на != yes не сработала... Наверное тут лучше применить метод .Contains().... ща попробую..
 
  • Спасибо
Реакции: uRusure

intagens

Client
Регистрация
28.09.2015
Сообщения
207
Благодарностей
31
Баллы
28
C#:
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
    if(intDateTimeNow - intTableTime > 900) {
        table.SetCell(3,tabi,"yes");
        project.SendInfoToLog(table.GetCell(1,tabi));
        project.Variables["user_name"].Value = table.GetCell(1,tabi);
       
        //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
       
        //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
    }
    else {
        table.SetCell(3,tabi,"no");
        continue;
    }
}
else continue;
}
 
  • Спасибо
Реакции: uRusure

uRusure

Client
Регистрация
07.07.2018
Сообщения
40
Благодарностей
14
Баллы
8
C#:
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
    if(intDateTimeNow - intTableTime > 900) {
        table.SetCell(3,tabi,"yes");
        project.SendInfoToLog(table.GetCell(1,tabi));
        project.Variables["user_name"].Value = table.GetCell(1,tabi);
      
        //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
      
        //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
    }
    else {
        table.SetCell(3,tabi,"no");
        continue;
    }
}
else continue;
}
Спасибо большое, сейчас затесчу.
 

uRusure

Client
Регистрация
07.07.2018
Сообщения
40
Благодарностей
14
Баллы
8
C#:
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
    if(intDateTimeNow - intTableTime > 900) {
        table.SetCell(3,tabi,"yes");
        project.SendInfoToLog(table.GetCell(1,tabi));
        project.Variables["user_name"].Value = table.GetCell(1,tabi);
      
        //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
      
        //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
    }
    else {
        table.SetCell(3,tabi,"no");
        continue;
    }
}
else continue;
}
Не пойму в чем проблема, но при попытке выполнить кубик с этим кодом выдает такую ошибку :(
43593
 

intagens

Client
Регистрация
28.09.2015
Сообщения
207
Благодарностей
31
Баллы
28
код отрабатывает нормально. ищи ошибку в проекте. ты к таблице привязался? "первая сторока - заголовки" галку поставил?
1571874122050.png
 

uRusure

Client
Регистрация
07.07.2018
Сообщения
40
Благодарностей
14
Баллы
8
код отрабатывает нормально. ищи ошибку в проекте. ты к таблице привязался? "первая строка - заголовки" галку поставил?
Посмотреть вложение 43613
Да, у меня все стоит правильно. Ошибку методом перебора нашел в 5 строке кода. Исправил с "int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));" на "int intTableTime = int.Parse(table.GetCell(2,tabi));".

Но есть еще одна проблема, которую мне так и не удалось решить. Это если условие не выполняется, то есть пока еще не прошло более 15 минут ни для одной из строк, либо все строки уже отработаны (то есть имеют status "yes"), то в этом случае не получается завершить кубик по красной линии. Хотя я пытался в самом конце после закрывающей фигурной скобки дописать: "throw new Exception("Все строки отработаны, либо еще не прошло 15 мин");", но в этом случае даже если главное условие выполняется, то кубик все-равно завершается по красной линии :(
 

intagens

Client
Регистрация
28.09.2015
Сообщения
207
Благодарностей
31
Баллы
28
Исправил с "int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));" на "int intTableTime = int.Parse(table.GetCell(2,tabi));".
хм ... непонятно почему у тебя Convert не работает

Но есть еще одна проблема, которую мне так и не удалось решить
попробуй так
C#:
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
int intStatus=0;
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
    if(table.GetCell(3,tabi) != "yes") {
        int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
        if(intDateTimeNow - intTableTime > 900) {
            table.SetCell(3,tabi,"yes");
            project.SendInfoToLog(table.GetCell(1,tabi));
            project.Variables["user_name"].Value = table.GetCell(1,tabi);
       
            //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
       
            //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
        }
        else {
            intStatus++;
            table.SetCell(3,tabi,"no");
            continue;
        }
    }
    else{
        intStatus++;
        continue;
    }
}
if(intStatus==table.RowCount){
    throw new Exception("Все строки отработаны, либо еще не прошло 15 мин");
}
 
  • Спасибо
Реакции: uRusure

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