Имя: Пароль:
1C
1С v8
Вопрос по DBF
0 medvejohnok
 
27.12.11
08:28
Подскажите пожалуйста. Можно ли в существующем DBF-файле изменить значение одного из полей не прибегая к переопределению полей для сохранения? Если можно то как?
1 miki
 
27.12.11
08:36
что ты вкладываешь в "значение поля"?
2 ДенисЧ
 
27.12.11
08:36
Получить нужную строку, задать значение, записать?
3 medvejohnok
 
27.12.11
08:38
(1)значение типа число или строка
4 medvejohnok
 
27.12.11
08:39
(2) да, но у меня почему-то не получается.
5 miki
 
27.12.11
08:56
не взлетит...
Как вариант - сделать нужное поле строкой, при необходимости - преобразовывать строку к числу (при считывании).
6 medvejohnok
 
27.12.11
09:00
(5) Считывать не надо. Уже считали. Надо прочитав DBF, сравнить ТЗ и записать измененное значение в нужное поле.
7 miki
 
27.12.11
09:03
прочитать DBF == считать значения полей в записях :)
Сравнивать положено однотипные значения.
Так что либо приводить считанные из DBF значения к типу в ТЗ, либо згначения из ТЗ к типу DBF.
Число к строке всегда можно привести, наоборот - не всегда.
8 medvejohnok
 
27.12.11
09:28
(7) понял. Делаю открытие с полным доступом. Этого хватит для изменения?
9 miki
 
27.12.11
09:31
должно
10 medvejohnok
 
27.12.11
09:33
(9) хе хе ... должно ... а есть код по этому вопросу?
11 miki
 
27.12.11
09:34
полно
12 medvejohnok
 
27.12.11
09:37
можеш выложить примерчик?
13 miki
 
27.12.11
09:39
14 medvejohnok
 
27.12.11
09:51
(13) например этот не пойдет. Там заново определяется структура файла, а у в моем случае надо использовать структуру существующего  файла.
15 vmv
 
27.12.11
10:01
советую делать так, четко разделяя кодом создание, заполнение и запись, тогда куски кода легко модифицировать/клонировать при измененении форматов и т.д.

пример для одной из табл персонификации Укр, под банки таже щняга должна быть


Процедура СоздатьСтруктуру_xB_05(xB)
   
   xB.Поля.Добавить("PERIOD_M"   ,"N",2  ,0);
   xB.Поля.Добавить("PERIOD_Y"   ,"N",4  ,0);
   
   xB.Поля.Добавить("ROWNUM"     ,"N",6  ,0);
   
   xB.Поля.Добавить("UKR_GROMAD" ,"N",1  ,0);
   xB.Поля.Добавить("ZO"         ,"N",2  ,0);
   
   xB.Поля.Добавить("NUMIDENT"   ,"S",10 ,0);
   xB.Поля.Добавить("LN"         ,"S",100,0);
   xB.Поля.Добавить("NM"         ,"S",100,0);
   xB.Поля.Добавить("FTN"        ,"S",100,0);
   xB.Поля.Добавить("START_DT"   ,"N",2  ,0);
   xB.Поля.Добавить("END_DT"     ,"N",2  ,0);
   xB.Поля.Добавить("PID_ZV"     ,"S",150,0);
   
КонецПроцедуры
Функция ДобавитьЗаписи_xB_05(xB, ПрефиксТаблицы)
   Перем ТаблицаДанных, КоличествоЗаписейНаЛисте;
   Перем Строка, ТекущийНомерЗаписиНаЛисте;
       
   ТаблицаДанных = ЭтаФорма["Таблица" + ПрефиксТаблицы];
   КоличествоЗаписейНаЛисте = ЭтаФорма["КоличествоЗаписейНаЛисте" + ПрефиксТаблицы];

   ТекущийНомерЗаписиНаЛисте = 0;
   
   Для Каждого Строка Из ТаблицаДанных Цикл
       
       ТекущийНомерЗаписиНаЛисте = ТекущийНомерЗаписиНаЛисте + 1;
       
       Если ТекущийНомерЗаписиНаЛисте > КоличествоЗаписейНаЛисте Тогда
           ТекущийНомерЗаписиНаЛисте = 1;
       КонецЕсли;
       
       xB.Добавить();
       
       xB.УстановитьЗначениеПоля("PERIOD_M"  ,ПреобразоватьВЧисло(Строка.PERIOD_M));
       xB.УстановитьЗначениеПоля("PERIOD_Y"  ,ПреобразоватьВЧисло(Строка.PERIOD_Y));
       
       xB.УстановитьЗначениеПоля("ROWNUM"  ,ПреобразоватьВЧисло(ТекущийНомерЗаписиНаЛисте));
       
       xB.УстановитьЗначениеПоля("UKR_GROMAD"  ,ПреобразоватьВЧисло(Строка.UKR_GROMAD));
       xB.УстановитьЗначениеПоля("ZO"          ,ПреобразоватьВЧисло(Строка.ZO));
       
       xB.УстановитьЗначениеПоля("NUMIDENT",Строка.NUMIDENT);
       xB.УстановитьЗначениеПоля("LN"      ,Строка.LN);
       xB.УстановитьЗначениеПоля("NM"      ,Строка.NM);
       xB.УстановитьЗначениеПоля("FTN"     ,Строка.FTN);
       xB.УстановитьЗначениеПоля("START_DT",ПреобразоватьВЧисло(Строка.START_DT));
       xB.УстановитьЗначениеПоля("END_DT"  ,ПреобразоватьВЧисло(Строка.END_DT  ));
       xB.УстановитьЗначениеПоля("PID_ZV"  ,Строка.PID_ZV);
       
       xB.Записать();
           
   КонецЦикла;
   
   Возврат Истина;
   
КонецФункции

Процедура ПолучитьСводнуюDBF(Элемент)
   Перем ПерефиксТаблицы;
   Перем КаталогDBF, ИмяФайлаDBF, ПолноеИмяФайлаDBF, xB;
       
   ПрефиксТаблицы = Прав(Элемент.Имя, 2);
       
   ИмяФайлаDBF = "DBF_" + ПрефиксТаблицы + ".DBF";  
   
   КаталогДанных = ЭтаФорма.КаталогДанных;
   КаталогDBF    = КаталогДанных + "\" + "DBF";
   Если Не СуществуетФайл(КаталогDBF) Тогда
       СоздатьКаталог(КаталогDBF);
   Иначе
       УдалитьФайлы(КаталогDBF, ИмяФайлаDBF);
   КонецЕсли;
   
   ПолноеИмяФайлаDBF = КаталогDBF + "\" + ИмяФайлаDBF;
   
   xB = Новый xBase();
   
   Если ПрефиксТаблицы = "05" Тогда
       СоздатьСтруктуру_xB_05(xB);
   ИначеЕсли ПрефиксТаблицы = "06" Тогда
       СоздатьСтруктуру_xB_06(xB);
   ИначеЕсли ПрефиксТаблицы = "07" Тогда    
       СоздатьСтруктуру_xB_07(xB);
   ИначеЕсли ПрефиксТаблицы = "08" Тогда
       СоздатьСтруктуру_xB_08(xB);
   КонецЕсли;

   xB.СоздатьФайл(ПолноеИмяФайлаDBF);
   
   Если Не xB.Открыта() Тогда  
       Предупреждение("Не удалось создать и открыть указанный файл >> " + ПолноеИмяФайлаDBF);  
       Возврат;
   КонецЕсли;  
   
   Если ПрефиксТаблицы = "05" Тогда
       ДобавленыЗаписи = ДобавитьЗаписи_xB_05(xB, ПрефиксТаблицы);
   ИначеЕсли ПрефиксТаблицы = "06" Тогда
       ДобавленыЗаписи = ДобавитьЗаписи_xB_06(xB, ПрефиксТаблицы);
   ИначеЕсли ПрефиксТаблицы = "07" Тогда    
       ДобавленыЗаписи = ДобавитьЗаписи_xB_07(xB, ПрефиксТаблицы);        
   ИначеЕсли ПрефиксТаблицы = "08" Тогда
       ДобавленыЗаписи = ДобавитьЗаписи_xB_08(xB, ПрефиксТаблицы);        
   КонецЕсли;
   
   Если ДобавленыЗаписи Тогда
      ЭлементыФормы["ндСводнаяТаблица" + ПрефиксТаблицы].Заголовок = "Сводная таблица " + ПрефиксТаблицы + " >> " + ПолноеИмяФайлаDBF;
   Иначе  
      xB.ОчиститьФайл();    
   КонецЕсли;
   
   xB.ЗакрытьФайл();
     
КонецПроцедуры
16 medvejohnok
 
29.12.11
01:51
(15) все это хорошо и понятно. Но есть маленькое но ... нужно изменить значение в поле существующей строки записи существующего DBF-файла не переопределяя заново структуру и не записывая новый файл, т.е. прочитать, изменить, записать.
17 HeroShima
 
29.12.11
01:58
(0) да
18 medvejohnok
 
29.12.11
03:11
(17) А кодом можно это "ДА" подкрепить?
19 H A D G E H O G s
 
29.12.11
03:13
(18) Лениво.
20 medvejohnok
 
29.12.11
03:22
(19) а писать это было не лениво ...
21 vah1
 
29.12.11
03:22
структуру наэбать конечно можно, только вот задним числом без ведома ГБ ничего делать не нужно, цифры уже все сданы - а переделка вроде как найоп
22 Дядя Васька
 
29.12.11
03:24
(20) А чем (15) не устроило?
23 medvejohnok
 
29.12.11
03:33
неужели так трудно запостить несколько строк кода, а не вступать в бесполезный треп.
24 medvejohnok
 
29.12.11
03:33
(22) (16)
25 medvejohnok
 
29.12.11
06:23
Спасибо, что не помогли. В очередной раз убедился в .... а это останется со мной.
26 vah1
 
29.12.11
06:48
анек вспомнился про мужика, медведя и -ну что, тебе помогло?
27 HeroShima
 
29.12.11
10:43
(23) разве код на питоне тебя устроит?
Ошибка? Это не ошибка, это системная функция.