|
XBase. Перед выполнением операции нужно закрыть базу. А база то закрыта! | ☑ | ||
---|---|---|---|---|
0
batmansoft
01.10.14
✎
15:02
|
Добрый день. Выполняю такую команду:
" База = Новый XBase(Файл); если НЕ оФайл.Существует() тогда База.Поля.Добавить("supplierid","N",2); База.Поля.Добавить("supplier","S",30); База.Поля.Добавить("customer1","S",30); База.Поля.Добавить("customer2","S",30); База.Поля.Добавить("customer3","S",30); База.Поля.Добавить("customer4","S",30); База.Поля.Добавить("customer5","S",30); База.Поля.Добавить("customer6","S",30); База.Поля.Добавить("customer7","S",30); База.Поля.Добавить("customerto","S",30); База.СоздатьФайл(Файл); иначе База.ОткрытьФайл(Файл); конецесли; " В конце выполню вот такую: База.ЗакрытьФайл(); Очевидно, первый раз выполняет первую ветку, и все проходит нормлаьно. Запускаю второй раз и вылазит: "{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ОткрытьФайл) База.ОткрытьФайл(Файл); по причине: Перед выполнением операции нужно закрыть базу" Но база то закрыта. Подскажите плз, как лечить? |
|||
1
Dmitriy_76
01.10.14
✎
15:05
|
close() не ?
|
|||
2
palpetrovich
01.10.14
✎
15:08
|
(0) в середине точно нет что-нить типа Возврат?
|
|||
3
batmansoft
01.10.14
✎
15:13
|
(2) Нет, нету. Проверил отладчиком, База.ЗАкрытьФайл() выполняется.
(1) close не катит: "{Форма.Форма.Форма(111)}: Метод объекта не обнаружен (close) База.close(); " |
|||
4
palpetrovich
01.10.14
✎
15:26
|
проверил, все работает:
Процедура КнопкаВыполнитьНажатие(Кнопка) ИмяФайла = "d:\test.dbf"; оФайл = Новый Файл(ИмяФайла); База = Новый XBase(); если НЕ оФайл.Существует() тогда База.Поля.Добавить("supplierid","N",2); База.Поля.Добавить("supplier","S",30); База.СоздатьФайл(ИмяФайла); сообщить("Создан " + ИмяФайла); иначе База.ОткрытьФайл(ИмяФайла); сообщить("Открыт " + ИмяФайла); конецесли; База.ЗакрытьФайл(); КонецПроцедуры может "Файл" поменять на, к примеру, "ИмяФайла"? |
|||
5
batmansoft
01.10.14
✎
15:29
|
(4) Сделал так:
оФайл=Новый Файл(ИмяФайла); //оФайл.Имя=Файл; База = Новый XBase(ИмяФайла); если НЕ оФайл.Существует() тогда База.Поля.Добавить("supplierid","N",2); База.Поля.Добавить("supplier","S",30); База.Поля.Добавить("customer1","S",30); База.Поля.Добавить("customer2","S",30); База.Поля.Добавить("customer3","S",30); База.Поля.Добавить("customer4","S",30); База.Поля.Добавить("customer5","S",30); База.Поля.Добавить("customer6","S",30); База.Поля.Добавить("customer7","S",30); База.Поля.Добавить("customerto","S",30); База.СоздатьФайл(ИмяФайла); иначе База.ОткрытьФайл(ИмяФайла); конецесли; тоже самое |
|||
6
palpetrovich
01.10.14
✎
15:33
|
(5) проверь мой код
|
|||
7
palpetrovich
01.10.14
✎
15:34
|
+(6) запость сюда ИмяФайла
|
|||
8
batmansoft
01.10.14
✎
15:36
|
(7) ну например D:\Work82\Работа\Обработины\5.DBF
|
|||
9
batmansoft
01.10.14
✎
15:38
|
(7) странно, твой код работает
|
|||
10
vlandev
01.10.14
✎
15:39
|
А длинное имя файла не надо в кавычки дополнительно сувать?
|
|||
11
palpetrovich
01.10.14
✎
15:40
|
(9) дык, пробуй "d:\5.dbf
|
|||
12
batmansoft
01.10.14
✎
15:44
|
(10)
Сделал так: " лИмяФайла=""""+ИмяФайла+""""; оФайл=Новый Файл(лИмяФайла); //оФайл.Имя=Файл; База = Новый XBase(лИмяФайла); если НЕ оФайл.Существует() тогда База.Поля.Добавить("supplierid","N",2); База.Поля.Добавить("supplier","S",30); База.Поля.Добавить("customer1","S",30); База.Поля.Добавить("customer2","S",30); База.Поля.Добавить("customer3","S",30); База.Поля.Добавить("customer4","S",30); База.Поля.Добавить("customer5","S",30); База.Поля.Добавить("customer6","S",30); База.Поля.Добавить("customer7","S",30); База.Поля.Добавить("customerto","S",30); База.СоздатьФайл(лИмяФайла); иначе База.ОткрытьФайл(лИмяФайла); конецесли; " после этого база просто не открылась. Выдало на дальнейший код: "{Форма.Форма.Форма(107)}: Ошибка при вызове метода контекста (Добавить) База.Добавить(); по причине: Перед выполнением операции нужно открыть базу " |
|||
13
DS
01.10.14
✎
15:46
|
(12) Не нашел в листинге "База.Добавить();"
|
|||
14
palpetrovich
01.10.14
✎
15:47
|
(12) а так """"+ИмяФайла+""" ? ...пробуй, короче, разные варианты :)
|
|||
15
batmansoft
01.10.14
✎
15:47
|
(13) Вот полный листинг:
"Процедура КнопкаВыполнитьНажатие(Кнопка) лИмяФайла=""""+ИмяФайла+""""; оФайл=Новый Файл(лИмяФайла); //оФайл.Имя=Файл; База = Новый XBase(лИмяФайла); если НЕ оФайл.Существует() тогда База.Поля.Добавить("supplierid","N",2); База.Поля.Добавить("supplier","S",30); База.Поля.Добавить("customer1","S",30); База.Поля.Добавить("customer2","S",30); База.Поля.Добавить("customer3","S",30); База.Поля.Добавить("customer4","S",30); База.Поля.Добавить("customer5","S",30); База.Поля.Добавить("customer6","S",30); База.Поля.Добавить("customer7","S",30); База.Поля.Добавить("customerto","S",30); База.СоздатьФайл(лИмяФайла); иначе База.ОткрытьФайл(лИмяФайла); конецесли; База.Кодировка=КодировкаXBase.OEM; База.АвтоСохранение=Истина; //База.Добавить(); //База.supplier="Проба"; //База.ЗакрытьФайл(); //возврат; Запрос=Новый Запрос(); Запрос.Текст= "ВЫБРАТЬ | ЗначенияСвойствОбъектов.Значение |ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ | ЗначенияСвойствОбъектов.Объект = &Объект | И ЗначенияСвойствОбъектов.Свойство = &Свойство" ; Запрос.УстановитьПараметр("Объект",Организация); Запрос.УстановитьПараметр("Свойство",Константы.шапСвойствоПризнакОрганизации.Получить()); Выборка=Запрос.Выполнить().Выбрать(); если Выборка.Следующий() тогда ПризнакОрганизации=Выборка.Значение; иначе Предупреждение("Не найден признак организации");; конецесли; Запрос.Текст= "ВЫБРАТЬ | ЗапросКДанным.Контрагент, | ЗначенияСвойствОбъектов.Значение КАК Признак, | ЗапросКДанным.Счет, | ЗапросКДанным.СуммаНачальныйОстаток, | СУММА(ЗапросКДанным.СуммаОборотДт) КАК СуммаОборотДт, | СУММА(ЗапросКДанным.СуммаОборотКт) КАК СуммаОборотКт, | ЗапросКДанным.СуммаКонечныйОстаток |ИЗ | (ВЫБРАТЬ | СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотДт) КАК СуммаОборотДт, | СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаОборотКт, | ХозрасчетныйОстаткиИОбороты.Счет КАК Счет, | ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент, | СУММА(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток, | СУММА(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток | ИЗ | РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты( | &НачДата, | &КонДата, | Период, | , | Счет = &Счет62 | ИЛИ Счет = &Счет60, | , | Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты | | СГРУППИРОВАТЬ ПО | ХозрасчетныйОстаткиИОбороты.Субконто1, | ХозрасчетныйОстаткиИОбороты.Счет) КАК ЗапросКДанным | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ПО (ЗначенияСвойствОбъектов.Свойство = &Свойство) | И ЗапросКДанным.Контрагент = ЗначенияСвойствОбъектов.Объект |ГДЕ | НЕ ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL | |СГРУППИРОВАТЬ ПО | ЗапросКДанным.Счет, | ЗначенияСвойствОбъектов.Значение, | ЗапросКДанным.СуммаНачальныйОстаток, | ЗапросКДанным.СуммаКонечныйОстаток, | ЗапросКДанным.Контрагент | |УПОРЯДОЧИТЬ ПО | Признак" ; Запрос.УстановитьПараметр("Организация",Организация); Запрос.УстановитьПараметр("НачДата",НачалоДня(НачДата)); Запрос.УстановитьПараметр("КонДата",КонецДня(КонДата)); Запрос.УстановитьПараметр("Счет62",ПланыСчетов.Хозрасчетный.РасчетыСПокупателями); Запрос.УстановитьПараметр("Счет60",ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками); Запрос.УстановитьПараметр("Свойство",Константы.шапСвойствоПризнакКонтрагента.Получить()); //ТабличноеПоле1=Запрос.Выполнить().Выгрузить(); //ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки(); Выборка=Запрос.Выполнить().Выбрать(); пока Выборка.Следующий() цикл База.Добавить(); База.supplier=Организация.Наименование; База.supplierid=ПризнакОрганизации; База["customer"+Сокрлп(строка(Выборка.Признак))]=Выборка.СуммаКонечныйОстаток; конеццикла; База.ЗакрытьФайл(); КонецПроцедуры " |
|||
16
DS
01.10.14
✎
15:55
|
Принципиальное отличие данного кода от (4) в том, что в (4) имя файла пихается в XBase только тогда, когда файл существует. Может в этом и собака.
|
|||
17
batmansoft
01.10.14
✎
15:56
|
вот так еще поробовал
оФайл=Новый Файл(""""+ИмяФайла+""""); //оФайл.Имя=Файл; База = Новый XBase(лИмяФайла); если НЕ оФайл.Существует() тогда База.Поля.Добавить("supplierid","N",2); База.Поля.Добавить("supplier","S",30); База.Поля.Добавить("customer1","S",30); База.Поля.Добавить("customer2","S",30); База.Поля.Добавить("customer3","S",30); База.Поля.Добавить("customer4","S",30); База.Поля.Добавить("customer5","S",30); База.Поля.Добавить("customer6","S",30); База.Поля.Добавить("customer7","S",30); База.Поля.Добавить("customerto","S",30); База.СоздатьФайл(""""+ИмяФайла+""""); иначе База.ОткрытьФайл(""""+ИмяФайла+""""); конецесли; База.Кодировка=КодировкаXBase.OEM; База.АвтоСохранение=Истина; тоже самое |
|||
18
DS
01.10.14
✎
15:59
|
Проверять отладчиком каждую строку на "База.Открыта()" до просветления.
|
|||
19
batmansoft
01.10.14
✎
16:00
|
(16) Э... что то не понял. Это как так "имя файла пихается в XBase только тогда, когда файл существует"?
И в том и в другом случае если файл существует, он открывается если нет то создается. Вся разница в том что в (4) путь к файлу короткий. Неужели в этом дело? Но тогда как быть, если надо открыть файл с длинным путем? |
|||
20
palpetrovich
01.10.14
✎
16:03
|
(19) в (16) намек на
База = Новый XBase(лИмяФайла); База = Новый XBase(); |
|||
21
batmansoft
01.10.14
✎
16:05
|
(20) А!!!! Наступило просветление.:) Спасибо, заработало.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |