Разработка программы, которая по указанному идентификатору изделия выполняет рекурсивный обход сборки, страница 2

// проверка на существование item'а

ITEM_find_item(item_id,&item);

if(item==NULLTAG)

{    

printf("\nitem %s не найден.\n",item_id);

shutdown_ITK_environment();

return ITK_ok;

}

// проверка на существование правила модификации

CFM_find(pm,&rul);

if(rul==NULLTAG)

{    

printf("\nправило модификации %s не найдено.\n",pm);

shutdown_ITK_environment ();

return ITK_ok;

}

ITEM_ask_latest_rev(item,&item_rev); //получение последней ревизии по правилу модификации

ITEM_find_revision(item,"C",&rev); //получение номера ревизии "С" для сборки

//Создание окна структуры изделия

BOM_create_window(&window);

BOM_set_window_config_rule(window,rul); //установка правила модификации

BOM_set_window_top_line(window,item,item_rev,NULLTAG,&top_line);

///////////////////////////////////////////

BOM_create_window (&window2);//Создание окна структуры сборки

CFM_find( "Расцеховано", &rul2 ); //поиск правила модификации

CFM_rule_copy(rul2,"my_rule",&rul3 ); //копирование правила

ITEM_find_item ("T7-95", &end_item_tag); //поиск конечного изделия

//проверка на существование конечного изделия

if (end_item_tag == null_tag)

{

printf("\nконечное изделие T7-95 не найдено.\n");

shutdown_ITK_environment ();

return ITK_ok;

}

// конФигурирование правила модификации

CFM_rule_set_end_item(rul3,end_item_tag);//установка правила для конечного изделия

CFM_rule_add_entry(rul3,CFM_entry_unit_no,&u_n_tag);

CFM_unitno_entry_set_no(u_n_tag,rul3);

BOM_set_window_config_rule( window2, rul3 ); //установка правила модификации

out=fopen("D:\\users\\Rogozin\\sborka.txt","w"); // файл для вывода данных

rekurs(top_line,0,out);

return ITK_ok;

}

//////////////////////////////////////////////////////////////////////////////////

void rekurs(tag_t BOM_line, int level, FILE *out)

{

tag_t prop_tag, prop_tag2, process_item,top_line2, proc_rev;

int count,i,*child_lines;

char *str, *str2, *str3,item_rid, *arr;

fprintf(out,"\nУровень %d",level);

//чтение данных строки

PROP_ask_property_by_name(BOM_line,"bl_item_item_id",&prop_tag);

PROP_ask_value_string(prop_tag,&str);

fprintf(out,"\n%s",str);

///////////////////////

sprintf(&item_rid,"r%s",str);//преобразование идентификатора

ITEM_find_item(item_rid,&process_item); //поиск сборки

BOM_set_window_top_line(window2,process_item,NULLTAG,NULLTAG,&top_line2);

//получение названия ревизии

PROP_ask_property_by_name(top_line2,"bl_item_revision_number",&prop_tag2);

PROP_ask_value_string(prop_tag2,&str2);

ITEM_find_rev(item_rid, str2, &proc_rev ); //поиск по названию ревизии

//получение массива тегов (параметров) для найденной ревизии сборки

PROP_ask_property_by_name(proc_rev ,"IMAN_METarget",&prop_tag2);

//PROP_ask_value_tags(prop_tag2,arr);

PROP_ask_value_string(prop_tag2,&arr);

//проверка на существование тегов ревизии

if(arr==NULLTAG)

{

printf("Данная ревизия не имеет параметров");

shutdown_ITK_environment ();

return ITK_ok;

}

//получение идентификатора изделия в найденной ревизии сборки

PROP_ask_property_by_name(arr[0],"item_revision_id",&prop_tag2);

PROP_ask_value_string(prop_tag2,&str3);

fprintf(out,"    Запущена в производство ревизия %s",str3);

//сравнение ревизий

if(rev==str3)

{

printf("  (ревизии совпадают)");

}

else

{

printf(" (ревизии не совпадают)");

}

//получение дочерних строк

BOM_line_ask_child_lines(BOM_line,&count,&child_lines);

P+=1;

printf("%d\n",P);

for(i=0;i<count;i++)

{

rekurs(child_lines[i],level+1,out); //рекурсивный вызов функции чтения строк

}

}

//////////////////////////////////////////////////////////////////////////////////

int startup_ITK_environment()

{

CALL( ITK_auto_login());

CALL(ITK_set_journalling (TRUE)) ;

return TRUE;

}

int shutdown_ITK_environment()

{

CALL(ITK_exit_module (TRUE));

return TRUE;

}

void get_errors()

{

int i, n_ifails;

const int *      severities;

const int *      ifails;

const char **    texts;

EMH_ask_errors(&n_ifails,&severities,&ifails,&texts);

if (n_ifails == 0) return;

printf("\nNumber of errors: %d.",n_ifails);

for ( i=0; i<n_ifails; i++ )

printf("\nAttantion!!!%d -> %s",i+1,texts[i]);

EMH_clear_errors();

}

Результат работы программы:

Уровень 0

T7.92.1000.000.000.70/C-Центроплан (view) Запущена в производство ревизия C (ревизии совпадают)

Уровень 1

T7.92.1000.050.000.70/B-Лонжерон 2 (view)    Запущена в производство ревизия B (ревизии совпадают)

Уровень 1