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

lira89

Well-known member
12.03.2010
154
0
#1
Код:
//*******************************************
Процедура Выполнить()
ДатаОбр = РабочаяДата(); 
ДБФ		= СоздатьОбъект("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
#2
1. Посмотреть в отладчике заполняется Табл или нет
2. А есть ли в справочнике СпрФакультеты элементы ибо если нет то в цикл и не заходит
3. А не может ли быть что ЗаноситьДанные всегда равно 0
 
C

Chemist

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

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

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

nikakoy

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

vbs

Well-known member
18.02.2007
1 708
1
#5
Если есть желание переписать элементы справочника, написано неправильно, если добавить новые, то тоже неправильно
 
T

TimeDontWait

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

lira89

Well-known member
12.03.2010
154
0
#7
Спасибо всем, я учла все замечания и все заработало :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.ЗакрытьФайл();	
Таб.Показать();					

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

vbs

Well-known member
18.02.2007
1 708
1
#8
Весь код сотри, оставь только то, что вызывает сомнения или вопросы. Никому не интересно читать сотню бессмысленных строк
 
T

TimeDontWait

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

kazak85

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

Дайнеко

Well-known member
19.11.2009
951
0
#13
Смотрел тему. Хотел принять участие. Глянул по диагонали тексты. Расхотел.

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

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

vbs

Well-known member
18.02.2007
1 708
1
#18
Странный человек :)
Неужели ты думаешь, что такое описание достаточно, чтобы дать дельный совет ?
 

lira89

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