• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

перенос данных из Dbf

  • Автор темы lira89
  • Дата начала
L

lira89

Код:
//*******************************************
Процедура Выполнить()
ДатаОбр = РабочаяДата(); 
ДБФ		= СоздатьОбъект("Xbase"); 

Табл=СоздатьОбъект("ТаблицаЗначений");	
Табл.НоваяКолонка("КодФак","Число",2,0,"Код факультета",7); 
Табл.НоваяКолонка("КратНаимен","Строка",15,,"Краткое наименование",15); 
Табл.НоваяКолонка("ПолноеНаимен","Строка",25,,"Полное наименование",25); 
Табл.НоваяКолонка("КратНаименБел","Строка",15,,"Краткое наименование на белорусском языке",15); 
Табл.НоваяКолонка("ПолноеНаименБел","Строка",25,,"Полное наименование на белорусском языке",25); 

ИмяФайла="FACULTS.DBF";
ИмяПути = СокрЛП(КаталогИБ())+"perenos\";
ПутьДБ=ИмяПути + ИмяФайла;						 
Если ФС.СуществуетФайл(ПутьДБ)=1 тогда	
Сообщить("Файл существует");
ДБФ.ОткрытьФайл(ПутьДБ);
ДБФ.Первая();
Пока ДБФ.ВКонце()=0 Цикл 
Сообщить("Записываем в аблицу значений");
Табл.НоваяСтрока();
Табл.КодФак 	= ДБФ.ПолучитьЗначениеПоля(1); 
Табл.КратНаимен	= ДБФ.ПолучитьЗначениеПоля(2);
Табл.ПолноеНаимен	= ДБФ.ПолучитьЗначениеПоля(3);
Табл.КратНаименБел	= ДБФ.ПолучитьЗначениеПоля(4);
Табл.ПолноеНаименБел	= ДБФ.ПолучитьЗначениеПоля(5);
ДБФ.Следующая();
КонецЦикла;	
КонецЕсли;		 
ДБФ.ЗакрытьФайл();

Табл.Сортировать("ПолноеНаимен"); 

Ном1=0;
Ном=0;
СпрФакультеты = СоздатьОбъект("Справочник.Факультеты"); 
СпрФакультеты.ИспользоватьДату(ДатаОбр);
СпрФакультеты.ПорядокНаименований();
СпрФакультеты.ВыбратьЭлементы();
Пока СпрФакультеты.ПолучитьЭлемент() = 1 Цикл
Если СпрФакультеты.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;

Призн=0;
Табл.ВыбратьСтроки();
Пока Табл.ПолучитьСтроку() = 1 Цикл 
Если ЗаноситьДанные=1 Тогда		 
Сообщить("ЗаноситьДанные=1");
СпрФакультеты.КодФак =		Табл.КодФак;  
СпрФакультеты.КратНаимен =	Табл.КратНаимен;
СпрФакультеты.ПолноеНаимен = Табл.ПолноеНаимен;
СпрФакультеты.КратНаименБел = Табл.КратНаименБел;
СпрФакультеты.ПолноеНаименБел = Табл.ПолноеНаименБел;
Сообщить("Записали в справочник");		
СпрФакультеты.Записать(); 
Призн=1;
КонецЕсли;	
КонецЦикла;	
Если Призн=0 Тогда  
Ном1=Ном1+1;  
Сообщить("Перешли на след номер");
КонецЕсли;
КонецЦикла;  

КонецПроцедуры

Не могу найти проблему: вроде бы все считывает из файла, но справочник остается пустым. Никаких ошибок не возникает. Реализация 7,7. Подскажите пожалуйста решение.
 
K

kaa

1. Посмотреть в отладчике заполняется Табл или нет
2. А есть ли в справочнике СпрФакультеты элементы ибо если нет то в цикл и не заходит
3. А не может ли быть что ЗаноситьДанные всегда равно 0
 
C

Chemist

А где создание нового элемента справочника?

После:
Если ЗаноситьДанные=1 Тогда

Ставишь:
СпрФакультеты.Новый();
 
N

nikakoy

сам смысл кода...
перебор элементов справочника и перезапись каждого из них по всем строкам таблицы... если элементы есть, то у каждого значения из последней строки таблицы....
о_О
или я чего то не понимаю???
 
V

vbs

Если есть желание переписать элементы справочника, написано неправильно, если добавить новые, то тоже неправильно
 
T

TimeDontWait

СпрФакультеты.ИспользоватьДату(ДатаОбр);
СпрФакультеты.ПорядокНаименований();
СпрФакультеты.ВыбратьЭлементы();
Пока СпрФакультеты.ПолучитьЭлемент() = 1 Цикл
Если СпрФакультеты.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Ето зачем ?
Для записи используй в цикле
Код:
СпрФакультеты.Новый();
СпрФакультеты.использоватьДату(НекаяДата);
 
L

lira89

Спасибо всем, я учла все замечания и все заработало :ya_lamo:
Однако у меня появился еще один вопрос насчет подчиненного справочника. При загрузке из dbf двух справочников (один из них подчиненный) в отладчике все проходит отлично, однако в базе подчиненный справочник, после выбора соответствующего элемента из главного справочника, остается пустым. Я плохо ориентируюсь с методами справочников, которые определяют владельцев и т .п., возможно кто-нибудь поможет исправить этот недочет. В конфигураторе в справочниках установлена связка подчиненности. Ниже код, все таже реализация 7.7. Модуль выполнен в обработке. Заранее благодарна
Код:
Процедура Выполнить()
ДатаОбр = РабочаяДата(); 
ДБФ		= СоздатьОбъект("Xbase"); 
Табл=СоздатьОбъект("ТаблицаЗначений");	
Табл.НоваяКолонка("КодФак","Строка",2,0,"Код факультета",7); 
Табл.НоваяКолонка("КратНаимен","Строка",15,,"Краткое наименование",15); 
Табл.НоваяКолонка("Наименование","Строка",25,,"Полное наименование",25); 
Табл.НоваяКолонка("КратНаименБел","Строка",15,,"Краткое наименование на белорусском языке",15); 
Табл.НоваяКолонка("ПолноеНаименБел","Строка",25,,"Полное наименование на белорусском языке",25); 
ИмяФайла="FACULTS.DBF";  
ИмяПути = СокрЛП(КаталогИБ())+"perenos\";
ПутьДБ=ИмяПути + ИмяФайла;						 
Если ФС.СуществуетФайл(ПутьДБ)=1 тогда	
Сообщить("Файл существует");
ДБФ.ОткрытьФайл(ПутьДБ);
ДБФ.Первая();
Пока ДБФ.ВКонце()=0 Цикл 
Сообщить("Записываем в таблицу значений");
Табл.НоваяСтрока();
Табл.КодФак 	=СокрЛП(ДБФ.ПолучитьЗначениеПоля(1)); 
Табл.КратНаимен	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(2));
Табл.Наименование	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(3));
Табл.КратНаименБел	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(4));
Табл.ПолноеНаименБел	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(5));
ДБФ.Следующая();
КонецЦикла;	
//Табл.Сортировать("Наименование"); 
Таб=СоздатьОбъект("Таблица"); 
Таб.ВывестиСекцию("Шапка");
Ном=0;
СпрФакультеты = СоздатьОбъект("Справочник.Факультеты"); // справочник владелец
//СпрФакультеты.ПорядокНаименований();
Табл.ВыбратьСтроки();
Пока Табл.ПолучитьСтроку() > 0 Цикл	
Если СпрФакультеты.НайтиПоРеквизиту("КодФак",Табл.КодФак,1)=1 тогда 
Сообщить("Запись факультета"""+Табл.Наименование+""" с кодом"""+Табл.КодФак+""" уже существует.");
Продолжить;	 
Иначе
Сообщить("ЗаноситьДанные");
СпрФакультеты.Новый(); 
СпрФакультеты.ИспользоватьДату(ДатаОбр);
СпрФакультеты.КодФак =СокрЛП(Табл.КодФак);  
СпрФакультеты.КратНаимен =	СокрЛП(Табл.КратНаимен);
СпрФакультеты.Наименование = СокрЛП(Табл.Наименование);
СпрФакультеты.КратНаименБел = СокрЛП(Табл.КратНаименБел);
СпрФакультеты.ПолноеНаименБел = СокрЛП(Табл.ПолноеНаименБел);
Ном=Ном+1; 
Сообщить("Записали в справочник");		
СпрФакультеты.Записать();	 

Таб.ВывестиСекцию("Факультеты"); 
КонецЕсли;	
КонецЦикла;	
//  Таб.Показать();
Иначе 
Сообщить ("Файла с факультетами в папке """+ИмяПути +""" не существует!!!");
СтатусВозврата(0);
КонецЕсли;		
ДБФ.ЗакрытьФайл();
/////////ДОБАВЛЕНИЕ ЗАПИСЕЙ В СПРАВОЧНИК "ГРУППЫ" (подчиненный справочник )
ДБФ1		= СоздатьОбъект("Xbase"); 
Табл1=СоздатьОбъект("ТаблицаЗначений");	
Табл1.НоваяКолонка("КодГруппы","Строка",5,0,"Код группы",7); 
Табл1.НоваяКолонка("ФормаОбучения","Строка",1,,"Формы обучения",5); 
Табл1.НоваяКолонка("КодКвалификации","Строка",3,,"Код квалификации",5); 
Табл1.НоваяКолонка("ГодГруппы","Число",4,,"Год группы",5); 
Табл1.НоваяКолонка("Наименование","Строка",10,,"Наименование группы",10); 
Табл1.НоваяКолонка("ЧислоСтудентов","Число",2,,"Число студентов в группе",3); 
Табл1.НоваяКолонка("ФамСтаросты","Строка",25,,"Фамилия и инициалы старосты",25); 
Табл1.НоваяКолонка("КодФакультета","Строка",2,0,"Код факультета",7); 
ИмяФайла="УчГруппы.DBF";
ИмяПути = СокрЛП(КаталогИБ())+"perenos\";
ПутьДБ=ИмяПути + ИмяФайла;						 
Если ФС.СуществуетФайл(ПутьДБ)=1 тогда	
Сообщить("Файл существует");
ДБФ.ОткрытьФайл(ПутьДБ);
ДБФ.Первая();
Пока ДБФ.ВКонце()=0 Цикл 
Сообщить("Записываем в таблицу значений учебную группу"); 
Табл1.НоваяСтрока();
Табл1.КодГруппы 	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(1)); 
Табл1.ФормаОбучения	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(2));
Табл1.КодКвалификации	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(3));
Табл1.ГодГруппы	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(4));
Табл1.Наименование	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(5)); 
Табл1.ЧислоСтудентов	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(6)); 
Табл1.ФамСтаросты	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(7)); 
Табл1.КодФакультета	= СокрЛП(ДБФ.ПолучитьЗначениеПоля(8)); 
ДБФ.Следующая();
КонецЦикла;	
Ном1=0;
СпрУчебГруппы = СоздатьОбъект("Справочник.Группы"); 
//			 СпрУчебГруппы.Родитель(СпрФакультеты);
СпрФакультеты.ВыбратьЭлементы();
Пока СпрФакультеты.ПолучитьЭлемент()=1 Цикл
СпрУчебГруппы.ИспользоватьВладельца(СпрФакультеты.ТекущийЭлемент());
Табл1.ВыбратьСтроки();
Пока Табл1.ПолучитьСтроку() > 0 Цикл	 
Если СпрФакультеты.КодФак = Табл1.КодФакультета тогда 
Если СпрУчебГруппы.НайтиПоРеквизиту("КодГруппы",Табл1.КодГруппы,0)=1 тогда 
Сообщить("Запись группы"""+Табл1.Наименование+""" с кодом"""+Табл1.КодГруппы+""" уже существует.");
Продолжить;	 
Иначе
Сообщить("ЗаноситьДанные учебных групп");
СпрУчебГруппы.Новый(); 
//	СпрУчебГруппы.Владелец = СпрФакультеты.ТекущийЭлемент();
СпрУчебГруппы.ИспользоватьДату(ДатаОбр); 
СпрУчебГруппы.КодГруппы =Табл1.КодГруппы;  
СпрУчебГруппы.ФормаОбучения =Табл1.ФормаОбучения;
СпрУчебГруппы.Квалификация = Табл1.КодКвалификации;
СпрУчебГруппы.ГодНачала = Табл1.ГодГруппы;
СпрУчебГруппы.Наименование = Табл1.Наименование;  
СпрУчебГруппы.ЧислоСтудентов = Табл1.ЧислоСтудентов;
СпрУчебГруппы.Староста = Табл1.ФамСтаросты;  
СпрУчебГруппы.КодФакультета = Табл1.КодФакультета; 
Ном1=Ном1+1; 
Сообщить("Записали в справочник учебную группу");		
СпрФакультеты.Записать(); 
Таб.ВывестиСекцию("Группы");	 
КонецЕсли;	 
КонецЕсли; 
КонецЦикла;
КонецЦикла;	
Иначе 
Сообщить ("Файла УчебныеГруппы в папке """+ИмяПути +""" не существует!!!");
СтатусВозврата(0);
КонецЕсли;		
ДБФ1.ЗакрытьФайл();	
Таб.Показать();					

КонецПроцедуры
 
V

vbs

Весь код сотри, оставь только то, что вызывает сомнения или вопросы. Никому не интересно читать сотню бессмысленных строк
 
T

TimeDontWait

СпрУчебГруппы.Новый();
// СпрУчебГруппы.Владелец = СпрФакультеты.ТекущийЭлемент();
СпрУчебГруппы.ИспользоватьДату(ДатаОбр);
СпрУчебГруппы.КодГруппы =Табл1.КодГруппы;
СпрУчебГруппы.ФормаОбучения =Табл1.ФормаОбучения;
СпрУчебГруппы.Квалификация = Табл1.КодКвалификации;
СпрУчебГруппы.ГодНачала = Табл1.ГодГруппы;
СпрУчебГруппы.Наименование = Табл1.Наименование;
СпрУчебГруппы.ЧислоСтудентов = Табл1.ЧислоСтудентов;
СпрУчебГруппы.Староста = Табл1.ФамСтаросты;
СпрУчебГруппы.КодФакультета = Табл1.КодФакультета;
Ном1=Ном1+1;
Сообщить("Записали в справочник учебную группу");
СпрФакультеты.Записать();
Таб.ВывестиСекцию("Группы");
Убери коментарий
ИспользоватьВладельца() - для поиска, выборки, перебора
Владелец - для записи
И почему
СпрФакультеты.Записать();
Ты ведь записываеш в справочник СпрУчебГруппы...
 
K

kazak85

а есть у кого нить пример переноса из dbf только для 8 версии???
 
V

vitfil

kazak85, а какие у вас возникли проблемы?
 
Д

Дайнеко

Смотрел тему. Хотел принять участие. Глянул по диагонали тексты. Расхотел.

lira89! Хорошая Вы девочка, любознательная такая, спрашиваете так активно. Но уж скажу прямо, глядя на тему: это то, что называется "нагружаете".
Влоб начинаете с текста модуля, что правила не рекомендуют. А чтоб мало не показалось, получите ишчо на 2 листа.
Вам пишут: "Весь код сотри, оставь только то, что вызывает сомнения или вопросы. Никому не интересно читать сотню бессмысленных строк".
Получается, что Вы не совета просите, а просите поковыряться вместо себя. Да, бывает, что проблема в программе не находится. Тогда подайте обществу вопрос компактно и красиво.

Примите мое ворчание как пожелание успешной работы.
 
U

unknown181538

kazak85
Есть конечно. Но он и в СП есть.
 

Вложения

  • DBF.rar
    24,2 КБ · Просмотры: 113
V

vbs

Странный человек :)
Неужели ты думаешь, что такое описание достаточно, чтобы дать дельный совет ?
 
L

lira89

....Получается, что Вы не совета просите, а просите поковыряться вместо себя. Да, бывает, что проблема в программе не находится. Тогда подайте обществу вопрос компактно и красиво.
Примите мое ворчание как пожелание успешной работы.
Спасибо за замечание. Просто с моим очень маленьким опытом сложно было выделить какую-то определенную часть (особенно когда точно не знаешь где ошибка). В следующий раз буду внимательнее и не буду так "нагружать" :) , сама понимаю, что рыться в большом коде (да еще и в чужом) не очень хочется :) .
И спасибо всем за советы и замечания, очень помогают ;) .
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!