Стандартные функции для работы с маркерами

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Один Из Вас
Посетитель
Сообщения: 43
Зарегистрирован: 18 мар 2015, 13:35

Стандартные функции для работы с маркерами

Сообщение Один Из Вас »

Просм помощи в части понимания работы Стандартной функции для работы с маркерами и/или по-возможности подкорректировать код.
Попробывали на JS получить список МЦ с использование ограничения "По аналитикам" с помощью стандартных функции для работы с маркерами:
Для этого определили объект по прототипу:
прототип aMarker
метод Init(Name) инициализация маркера под именем Name, если параметр не указан, то создается пустой маркер.
метод Done(Name) сохранение элементов маркера под именем Name, если параметр не указан, то элементы не сохраняются.
метод Add(Item) вставляет новый элемент в маркер.
метод Item(Index) возвращает элемент маркера с индексом Index, индексация элементов от 0 до Count()-1
метод Count() возвращает количество элементов маркера.
метод Clear() удаление всех элементов маркера.
метод AtDelete(Index) удаление элемента маркера по индексу.
метод Delete(Item) удаление элемента маркера.
метод Check(Item) поиск элемента маркера, если элемент найден, возвращается номер элемента в маркере, в противном случае возвращается 0.
*/

Код: Выделить все МЦ, которые связаны с некоей ролью "Диаметр" - rDiametr

Код: Выделить всё

aaa = new aMarker;
aaa.Init("mRole");
aaa.Add(rDiametr);
aaa.Done("mRole");
Debug.Print( aaa.Count() + ';  ' + aaa.Item[0] );
KatMC.toMarker( false, "mRole", "" , "" );   // Хотим получить список МЦ, которые связаны с некоей ролью "Диаметр" - rDiametr, аналогично фильтру по аналитикам в каталоге МЦ при указании только роли
for( KatMC.getFirst(); ResultOfNavigation; KatMC.getNext())
{
  Debug.Print(ValueName(  kauMC, KatMC.nRec ));
}
Получаем: NaN; undefined

Просьба указать и исправить наши косяки. Далее попробуем сами.
Заранее благодарим.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Стандартные функции для работы с маркерами

Сообщение edward_K »

а почему вы сначала делаете aaa.Done("mRole"); а потом выводите?
И JS вроде показывал номер строки в которой идет ошибка.
Один Из Вас
Посетитель
Сообщения: 43
Зарегистрирован: 18 мар 2015, 13:35

Re: Стандартные функции для работы с маркерами

Сообщение Один Из Вас »

JS ошибки не определяет. Только при выводе значений Debug.Print(ValueName( kauMC, KatMC.nRec )); получаем неопределенность: NaN; undefined
Почему делаем так, а не иначе, ответ простой - мы по ходу внедрения Галактики учимся программированию на JS . :)
Для желающих помочь профессионалов привожу сгенерированный системой код:

Код: Выделить всё

// AnalyticsAndRole - стандартная функция
function RoleName(aRole)
{
  VIP.CallMethod("AnalyticsAndRole", "RoleName", aRole, "")
  return VIP.ArgValue(3)
}
function KauName(aKau)
{
  VIP.CallMethod("AnalyticsAndRole", "KauName", aKau, "")
  return VIP.ArgValue(3)
}
function ValueName(aKau, aValue)
{
  VIP.CallMethod("AnalyticsAndRole", "ValueName", aKau, aValue, "")
  return VIP.ArgValue(4)
}

function RoleName_()
{
  VIP.CallMethod("AnalyticsAndRole", "RoleName", this.Role, "")
  return VIP.ArgValue(3)
}
function KauName_()
{
  VIP.CallMethod("AnalyticsAndRole", "KauName", this.MainKau, "")
  return VIP.ArgValue(3)
}
function ValueName_()
{
  VIP.CallMethod("AnalyticsAndRole", "ValueName", this.Kau, this.Value, "")
  return VIP.ArgValue(4)
}
function RoleSelect_()
{
  VIP.CallMethod("AnalyticsAndRole", "RoleSelect", this.Role, this.MainKau, "")
  this.Role = VIP.ArgValue(2)
  return Boolean(Number(VIP.ArgValue(4)))
}
function KauSelect_()
{
  VIP.CallMethod("AnalyticsAndRole", "KauSelect", this.Role, this.MainKau, "")
  this.MainKau = VIP.ArgValue(3)
  if( VIP.ArgValue(4) = "1" ) this.Value = 0
  return Boolean(Number(VIP.ArgValue(4)))
}
function ValueSelect_()
{
  VIP.CallMethod("AnalyticsAndRole", "ValueSelect", this.MainKau, this.Kau, this.Value, "")
  this.Kau = VIP.ArgValue(3)
  this.Value = VIP.ArgValue(4)
  return Boolean(Number(VIP.ArgValue(5)))
}
// - constructor 
function KauWorkLine(aRole, aMainKau, aKau, aValue)
{
  this.Role = aRole
  this.MainKau = aMainKau
  this.Kau = aKau
  this.Value = aValue
  this.RoleName = RoleName_
  this.KauName = KauName_
  this.ValueName = ValueName_
  this.RoleSelect = RoleSelect_
  this.KauSelect = KauSelect_
  this.ValueSelect = ValueSelect_
}
function GetCodeUserAnVal(aValue)
{
  VIP.CallMethod("AnalyticsAndRole", "GetCodeUserAnVal", aValue, "")
  return VIP.ArgValue(3)
}
function CreateNextKauValueNum(aKau)
{
  VIP.CallMethod("AnalyticsAndRole", "CreateNextKauValueNum", aKau, "")
  return VIP.ArgValue(3)
}
function CreateNewSpKau(aKau, aName, aCode, aLevelCode)
{
  VIP.CallMethod("AnalyticsAndRole", "CreateNewSpKau", aKau, aName, aCode, aLevelCode, "")
  return VIP.ArgValue(6)
}

//*** описание объекта маркер:
function InitMarker(Name)
{ VIP.CallMethod(this.Inter,'InitMarker', this.NoTable, Name) }
function DoneMarker(Name)
{ VIP.CallMethod(this.Inter,'DoneMarker', this.NoTable, Name) }
function AddMarkerItem(Item)
{ VIP.CallMethod(this.Inter,'AddMarkerItem', this.NoTable, Item) }
function GetMarkerItem(Index)
{ VIP.CallMethod(this.Inter,'GetMarkerItem', this.NoTable, Index); return VIP.ArgValue(2) }
function CountMarkerItem()
{ VIP.CallMethod(this.Inter,'CountMarkerItem', this.NoTable); return parseFloat(VIP.ArgValue(2)) }
function ClearMarkerItem()
{ VIP.CallMethod(this.Inter,'ClearMarkerItem', this.NoTable) }
function AtDeleteMarkerItem(Index)
{ VIP.CallMethod(this.Inter,'AtDeleteMarkerItem', this.NoTable, Index) }
function DeleteMarkerItem(Item)
{ VIP.CallMethod(this.Inter,'DeleteMarkerItem', this.NoTable, Item) }
function SearchMarker(Item)
{ VIP.CallMethod(this.Inter,'SearchMarker', this.NoTable, Item); return VIP.ArgValue(2) }
function aMarker()
{
this.Inter = 'iJS_Marker'
this.NoTable = 0
this.Init = InitMarker
this.Done = DoneMarker
this.Add = AddMarkerItem
this.Item = GetMarkerItem
this.Count = CountMarkerItem
this.Clear = ClearMarkerItem
this.AtDelete = AtDeleteMarkerItem
this.Delete = DeleteMarkerItem
this.Check = SearchMarker
}
//*** конец описания объекта маркер
//***

// Сервисные функции и объекты

// константы
rDiametr = "281474976710698"
// объекты
var ResultOfNavigation = false;
var PositionOfNavigation = "";
function NavigateCallMethod()
{
  VIP.ArgValue(0) = "StdObjectConst"
  VIP.ArgValue(1) = "StdCallMethod"
  VIP.ArgValue(2) = this.EntityNumber
  VIP.ArgValue(3) = ""
  VIP.ArgValue(4) = ""
  iCount = NavigateCallMethod.arguments.length        
  for(var i=0;i<iCount;i++)                           
  VIP.ArgValue(3+i) = NavigateCallMethod.arguments[i] 
  VIP.CallMethodEx();
  ResultOfNavigation = Boolean(VIP.ArgValue(3))
  PositionOfNavigation = VIP.ArgValue(4)
  this.reread()
  return ResultOfNavigation
}
function ObjectConstFirst()
{
  return this.NavigateCallMethod(20001)
}
function ObjectConstNext()
{
  return this.NavigateCallMethod(20002)
}
function ObjectConstLast()
{
  return this.NavigateCallMethod(20003)
}
function ObjectConstPrev()
{                         
  return this.NavigateCallMethod(20004)
}                         
function ObjectConstPos(Pos)
{                         
  return this.NavigateCallMethod(20005, Pos)
}                         
function rereadtKatMC()
{
  VIP.ArgValue(0) = "StdObjectConst"
  VIP.ArgValue(1) = "StdReread"
  VIP.ArgValue(2) = this.EntityNumber
  VIP.CallMethodEx();
}
function rewritetKatMC()
{
  VIP.ArgValue(0) = "StdObjectConst"
  VIP.ArgValue(1) = "StdRewrite"
  VIP.ArgValue(2) = this.EntityNumber
  VIP.CallMethodEx();
}
function toMarker(toMarker_Par_1, toMarker_Par_2, toMarker_Par_3, toMarker_Par_4)
{
  VIP.CallMethod("StdObjectConst","StdCallMethod", this.EntityNumber, 4006, toMarker_Par_1, toMarker_Par_2, toMarker_Par_3, toMarker_Par_4)
}
function tKatMC(EntityNumber) // constructor tKatMC
{
  this.EntityNumber = EntityNumber
  this.TableNumber = "1"
  this.NavigateCallMethod = NavigateCallMethod
  this.getFirst = ObjectConstFirst
  this.getNext = ObjectConstNext
  this.getLast = ObjectConstLast
  this.getPrev = ObjectConstPrev
  this.setPosition = ObjectConstPos
  this.reread = rereadtKatMC
  this.rewrite = rewritetKatMC
  this.toMarker = toMarker
}
var KatMC = new tKatMC("1")
// Текст скрипта
/*
прототип aMarker
метод Init(Name) инициализация маркера под именем Name, если параметр не указан, то создается пустой маркер.
метод Done(Name) сохранение элементов маркера под именем Name, если параметр не указан, то элементы не сохраняются.
метод Add(Item) вставляет новый элемент в маркер.
метод Item(Index) возвращает элемент маркера с индексом Index, индексация элементов от 0 до Count()-1
метод Count() возвращает количество элементов маркера.
метод Clear() удаление всех элементов маркера.
метод AtDelete(Index) удаление элемента маркера по индексу.
метод Delete(Item) удаление элемента маркера.
метод Check(Item) поиск элемента маркера, если элемент найден, возвращается номер элемента в маркере, в противном случае возвращается 0.
*/

// Код: Выделить все МЦ, которые связаны с некоей ролью "Диаметр" - rDiametr

aaa = new aMarker;
aaa.Init("mRole");
aaa.Add(rDiametr);
aaa.Done("mRole");
Debug.Print( aaa.Count() + ';  ' + aaa.Item[0] );
KatMC.toMarker( false, "mRole", "" , "" );   // Хотим получить список МЦ, которые связаны с некоей ролью "Диаметр" - rDiametr, аналогично фильтру по аналитикам в каталоге МЦ при указании только роли
for( KatMC.getFirst(); ResultOfNavigation; KatMC.getNext())
{
  Debug.Print(ValueName(  kauMC, KatMC.nRec ));
}
Один Из Вас
Посетитель
Сообщения: 43
Зарегистрирован: 18 мар 2015, 13:35

Re: Стандартные функции для работы с маркерами

Сообщение Один Из Вас »

Благодарю, edward_K.
Похоже aaa.Done("mRole") записывает и забывает. :)
Правильный код:

Код: Выделить всё

aaa = new aMarker;
//  aaa.Clear();
aaa.Done("mRole");
aaa.Init("mRole");
aaa.Add( rDiametr ); // Роль Диаметр проволоки
//aaa.Done("mRole");
Debug.Print( aaa.Count() + ';  ' + aaa.Item(0) + ';  ' + aaa.Item(1) );
aaa.Done("mRole");
//aa = new aMarker;
aaa.Init("mCode");
aaa.Clear();
aaa.Add( kauDiametr ); // КАУ Диаметр проволоки
Debug.Print( aaa.Count() + ';  ' + aaa.Item(0) );
aaa.Done("mCode");
//a = new aMarker;
aaa.Init("mValue");
aaa.Clear();
aaa.Add( vDiametr ); // Значение Диаметр проволоки  vDiametr
Debug.Print( aaa.Count() + ';  ' + aaa.Item(0) );
aaa.Done("mValue");
KatMC.toMarker( false, "mRole", "mCode" , "mValue" );   
for( KatMC.getFirst(); ResultOfNavigation; KatMC.getNext())
{
  Debug.Print(ValueName(  kauMC, KatMC.nRec ));
}     
Ответить