0
На рассмотрении

В коде алгоритма, как получить РВ по виду с другим источником

Алексей Панчихин 4 недели назад в Прочее обновлен Гашков Николай (Эксперт) 4 недели назад 23

Добрый день!

В коде алгоритма возникла необходимость получить РВ по виду с другим источником, работая с матрицей:

int rowMy=poiskosnkodprop(CodeMy,rowkod,0,Prop);

получив нужную row...

Как прежде чем воспользоваться  функцией

GetTime(row,?)

получить правильную колонку?

На рассмотрении

Добрый день!

С помощь prop вы задаете нужный фильтр..

Например, нужен источник Б :

var Prob = CreateObject("APropBE");
Prob.Init(ExtSrcToInt("Б") ,CLL_TOTAL_SUBJECT,CLL_TOTAL_PODR,CLL_TOTAL_COMBINE);

источник заранее не известен, просто ищу действующий вид с любым источником  в тек. периоде

перебирал в отладчике GetTime(row,col) 

создалось впечатление, что в найденной row с разными col получаю РВ разных периодов

1)как можно искать РВ по "неизвестному источнику"?

2)что такое col?

Опишите задачу более конкретно. Услуги экстрасенсов нынче дороги..

рассчитывается вид начисления с определенной суммовой базой с учетом РВ, которое можно взять из оклада, но оклад может быть на другом источнике

вид начисления с определенной суммовой базой с учетом РВ

что это значит?

col - колонка матрицы с1, если я правильно понимаю из описания функции GetTime(int Row,int Col )

Список прочих функций

Возвращает значение рабочего времени для строки Н-У по ее номеру в матрице c1 и номеру столбца

Матрицу с1 я получил выше приведенной функцией

Матрицу с1 я получил выше приведенной функцией

1)poiskosnkodprop() - это функция для поиска строк НУ.

2)Зная номер нужной вам строки, вы получаете точный код вида: 

double code = GetCode(row);

3)РВ по виду определяется так:

double rv=0;
rvvid("=",code,0,rv);

з.ы. Так и не увидел описание того, что хотите получить в конечном итоге..

Если вопрос по конкретной функции - напишите ее название.

Если задача более сложная - не надо ее пытаться описывать с помощью функций.. 

Опишите задачу "словами бухгалтера".. 

Конкретный пример ЛС с суммами - укорит процесс

Обращаю внимание на ошибку в вашем коде

int rowMy=poiskosnkodprop

функция возвращает не номер строки, а количество найденных строк!

номера строк записываются в массив rowkod

rvvid("=",code,0,rv); - дает "0",т.к. работает по источнику расчетной строки - проверено!
Требуется РВ из строки, найденной в массиве(матрице) полученном функцией poiskosnkodprop()

не придумывайте..

rvvid работает по точному коду, который вы ей передали.

Источник в этой функции не анализируется

Image 8782

что тут еще можно придумать...

можно не придумывать, а выложить сохраненку с ЛС

переименуйте rowMy в rowCount иначе потом сами запутаетесь

jrow я был переименовал в rowIndex и инициализировал внутри цикла:

for( int rowIndex=0; rowIndex<rowCount;rowIndex++ )
{
}

дату начала  и окончания строки можно определять так

var dbRow=KDateFromD(GetBegDate(rowkod[rowIndex]));
var deRow=KDateFromD(GetEndDate(rowkod[rowIndex]));

объявление jrow или rowIndex специально вынес вне тела цикла, т.к. требуется обработать случай когда не сработал break, 

if (Jrow==rowMy)

break там кажется по ошибке стоит, должен быть continue

а после того как нашли нужную строку в заданном период -  запоминаете row и ставите break

break прерывает цикл в нужный момент, когда найдена строка с действующим видом в тек. периоде.

Но если такой строки не найдется, требуется обработка случая, иначе можно поймать ошибочный результат.

Правильнее поместить код, который ищет нужную строку, в отдельную функцию

TryFindCodeValidOnDate(comb,extCode,kDate)
{
  var Prob = CreateObject("APropBE");
  Prob.Init(CLL_TOTAL_SRC,CLL_TOTAL_SUBJECT,CLL_TOTAL_PODR,comb); //инициализируем APropBE вн.кодом совместительства
  int rowkod[ROWMAX];//массив с номерами строк
  int cntrow=poiskosnkodProp(Extern_To_Intern(extCode),rowkod,0,Prob);//получаем список строк с кодом==kod
  FiltrRowkod(rowkod,cntrow, kDate.GetAbs(), 1); //отфильтровываем из массива недействующие
  for (int row=0; row < cntrow; row++)  
  {
    double ikod=GetCode(rowkod[row]);
    var dbRow=KDateFromD(GetBegDate(rowkod[row]));
    var deRow=KDateFromD(GetEndDate(rowkod[row]));
    if (dbRow.IsValid() && dbRow.GT(kDate)) //вид еще не открыт
      continue;
    
    if (deRow.IsValid() && deRow.LT(kDate)) //вид закрыт
      continue;
      
    return rowkod[row];  
  }
  return -1;  
}

и обработать ситуацию, когда строку не нашли ( функция вернула -1)

rowCode742=TryFindCodeValidOnDate(CLL_TOTAL_COMBINE,742,kDate);
if (rowCode742!=-1)//нашли вид 742
   return GetIDCombineOfCod(GetCode(rowCode742));

И все-таки, выше приведенный код работает, но из найденной строки не могу получить РВ!

В отладчике проверял значения

GetTime(row,0)

GetTime(row,1)

GetTime(row,2)

...

все имеют разное значение и только третье из них равно 167

Как понять что оно именно в третьем, а не в перво и не во втором .... и не в пятом, десятом...?

У вас на GetTime свет клином сошелся?

Почему вы игнорируете мой совет выложить сохраненку с кодом, который не работает при использовании rvvid?

Из приведенного выше скрина видно, что  rvvid не дает желаемого результата, поэтому нет смысла высылать сохраненку! Даже полное досье параметров продемонстрировано - не убедительно?

Если других вариантов получения РВ из уже найденной строки нет, а то что она найдена тоже видно из скрина по коду вида, спасибо за вариант кода, подобного не встречал в скриптах, возьму на вооружение!

поэтому нет смысла высылать сохраненку

А я не вижи смысла в дальнейшем обсуждении вопроса.


З.ы.Вы когда в автосервис приезжаете - тоже препятствуете доступу специалиста в подкапотное пространство для точной диагностики поломки?

Хотел-бы уточнить, возможно Вы не поняли место применения кода, он выполняется в скрипте usalg по ветке номера алгоритма, где имеем дело с "фоновым" окружением расчетной строки с видом, вызывающим алгоритм его расчета. Вероятно это обстоятельство влияет на результат работы rvvid().

Сервис поддержки клиентов работает на платформе UserEcho