Имя: Пароль:
1C
 
Посоветуйте с таблицей dbf
0 rt2000
 
30.03.16
09:45
Уже второй день думаю над задачей.
Нужен взгляд со стороны:
Делаю выгрузку в dbf в цикле.
Поставил условие, что бы в некотором случае одну запись делал два раза, только с разным кодом.
Выгрузка завершилась, все записалось. Нашел одну строчку, из-за которой файл не открывается в редакторе dbf.

т.е. Выборка с информацией по контрагенту "ИП Иванов":
1) Создал строчку dbf
2) Создал в этой же выборке строчку dbf, только с другим кодом контрагента.
Если не записывать первую строчку по этому контрагенту, то таблица хорошо получилась.
Для эксперимента, записывал их с одинаковым кодом, то же самое
1 ДенисЧ
 
30.03.16
09:46
Поток сознания. Похмеляться надо... (с)

Где-то есть кривые символы...
2 Mikeware
 
30.03.16
09:49
второй день думать....сильнО!
3 Garykom
 
гуру
30.03.16
09:50
Не факт что если опохмелиться то лучше будет поток.

В каком еще редакторе ДБФ оно не открывается? И сразу показал бы выложил файл, быстрее бы ответили.
И каким еще образом в дбф то выгружаешь?
4 Woldemar177
 
30.03.16
09:53
кидай файл, я заценю
5 rt2000
 
30.03.16
09:57
Вот код. Если первую часть за комментировать, то все норм  

ПерЗ = 0;   КонтрДуб = "";
      пока Выборка.Следующий() цикл
        если ПустаяСтрока(Выборка.Поле12) тогда
            Продолжить;
        КонецЕсли;
        /////////////////////////////////////////////////////////////
        //1)Первая часть
        если КонтрДуб <> Выборка.Ссылка и ПерЗ < 10 тогда
            ПерЗ = ПерЗ + 1;  
            если ПерЗ <> 66 тогда        
                ДБФ.Добавить();    
                ДБФ.OL_ID = 0;
                //если ПустаяСтрока(Выборка.Поле12) тогда
                    ДБФ.OL_Code = Выборка.Ссылка.Код;
                //иначе    
                //    ДБФ.OL_Code = Выборка.Поле12;    //Выборка.Ссылка.Код;        
                //КонецЕсли;
                ДБФ.Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
                ДБФ.Trade_Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
                ДБФ.Записать();
            иначе
                Сообщить(" ОШИБОЧНЫЙ Конт " + Выборка.Ссылка +" - " + Выборка.Ссылка.Код +";");
                //Продолжить;
            КонецЕсли;
            Сообщить("Конт " + Выборка.Ссылка +" - " + Выборка.Ссылка.Код +";");
        КонецЕсли;
        КонтрДуб = Выборка.Ссылка;            
        /////////////////////////////////////////////////////////////
        //2)Вторая часть
        ДБФ.Добавить();    
        ДБФ.OL_ID = 0;
        если ПустаяСтрока(Выборка.Поле12) тогда
            ДБФ.OL_Code = Выборка.Ссылка.Код;
        иначе    
            ДБФ.OL_Code = Выборка.Поле12;    //Выборка.Ссылка.Код;        
        КонецЕсли;
        ДБФ.Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
        ДБФ.Trade_Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
        ДБФ.Записать();
    КонецЦикла;
6 rt2000
 
30.03.16
09:58
Без лишних условий так:
ПерЗ = 0;   КонтрДуб = "";
      пока Выборка.Следующий() цикл
        если ПустаяСтрока(Выборка.Поле12) тогда
            Продолжить;
        КонецЕсли;
        /////////////////////////////////////////////////////////////
        //1)Первая часть
        если КонтрДуб <> Выборка.Ссылка  тогда        
                ДБФ.Добавить();    
                ДБФ.OL_ID = 0;
                //если ПустаяСтрока(Выборка.Поле12) тогда
                    ДБФ.OL_Code = Выборка.Ссылка.Код;
                //иначе    
                //    ДБФ.OL_Code = Выборка.Поле12;    //Выборка.Ссылка.Код;        
                //КонецЕсли;
                ДБФ.Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
                ДБФ.Trade_Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
                ДБФ.Записать();

        КонецЕсли;
        КонтрДуб = Выборка.Ссылка;            
        /////////////////////////////////////////////////////////////
        //2)Вторая часть
        ДБФ.Добавить();    
        ДБФ.OL_ID = 0;
        если ПустаяСтрока(Выборка.Поле12) тогда
            ДБФ.OL_Code = Выборка.Ссылка.Код;
        иначе    
            ДБФ.OL_Code = Выборка.Поле12;    //Выборка.Ссылка.Код;        
        КонецЕсли;
        ДБФ.Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
        ДБФ.Trade_Name = Выборка.Ссылка.НаименованиеПолное; //Выборка.Представление;
        ДБФ.Записать();
    КонецЦикла;
7 Garykom
 
гуру
30.03.16
10:00
заремь ДБФ.OL_Code = Выборка.Поле12;
8 rt2000
 
30.03.16
10:00
(4) давай попробуем
http://www.fayloobmennik.net/6003694
9 Ёпрст
 
30.03.16
10:00
(5) >>>Выборка.Ссылка.Код;
Это же полный ПЭ.
получай код и прочую шляпу в самом запросе.
10 Garykom
 
гуру
30.03.16
10:01
(7)+ * заремь=закомментируй
11 Garykom
 
гуру
30.03.16
10:06
(8) DBF Navigator ругается но ексель и либреофис открывают без проблем
12 Mikeware
 
30.03.16
10:08
Еще один борец с SalesWorks :-)
13 Garykom
 
гуру
30.03.16
10:10
Символ с кодом 1A в каком то поле подставляется у тя
14 Ёпрст
 
30.03.16
10:10
15 Ёпрст
 
30.03.16
10:10
хз, всё открывается
16 rt2000
 
30.03.16
10:11
(11) Вот именно! Тем людям, которым надо отправить, используют DBF Navigator.
Будут какие предположения, как это можно поправить?
17 Garykom
 
гуру
30.03.16
10:11
(13)+ в ООО "ТК АНТЭК"
18 Garykom
 
гуру
30.03.16
10:12
(16) везде попробуй "ДБФ.Trade_Name = СокрЛП(Выборка.Ссылка.НаименованиеПолное);"
19 rt2000
 
30.03.16
10:13
(15) (17) Проблема в предпоследней строчке с ID_CODE "ЦБ000037"
20 Ёпрст
 
30.03.16
10:13
(16) удали последнюю строчку, она пустая у тебя
21 Ёпрст
 
30.03.16
10:14
будет открывать и дбф нафигатор
22 Garykom
 
гуру
30.03.16
10:14
(15) оно у тя порезано, там еще 2 записи после Антэк
23 Ёпрст
 
30.03.16
10:17
24 Ёпрст
 
30.03.16
10:17
(22) ничего там не порезано, просто в экран всё не влезает
25 rt2000
 
30.03.16
10:17
(20) (22) Как вы узнали, что там еще строчка есть?
Как это посмотреть?
26 Ёпрст
 
30.03.16
10:18
(25) тебе не пофик ли ?
Если че, дбф редакторов, помимо дбф нафигатора - ваго и маленькая тележка
27 Garykom
 
гуру
30.03.16
10:19
(25) сделай (18)

у тя в поле полное наименование в конце после есть левый символ "стрелка вправо" с кодом 1A
28 Ёпрст
 
30.03.16
10:19
(27) причина в (20)
29 Ёпрст
 
30.03.16
10:19
не надо ничего больше.
30 Garykom
 
гуру
30.03.16
10:20
(29) а может откроешь hex редактором то и глянешь?
31 rt2000
 
30.03.16
10:26
СокрЛП - сделал. Символа лишнего не вижу
И где видите лишнию строчку, если их 179 всего
http://www.image123.net/3mun5icp48g4pic.html
32 Ёпрст
 
30.03.16
10:28
33 Ёпрст
 
30.03.16
10:28
ты видишь суслика ? А он есть ©дмб
34 Woldemar177
 
30.03.16
10:30
(31) Вот в какой то записи у тебя стрелочка: http://jpegshare.net/f2/92/f292232e8a3426ff61020a0c5acc2cc4.png.html

Выкини ее и все номрально будет ;))))
35 Garykom
 
гуру
30.03.16
10:39
(34) причем эта стрелочка очень хитро что то при записи делает, потому что если заменить ее на " "(20) то не помогает, видать смешение произошло
может еще там что кроме этой стрелочки
36 Garykom
 
гуру
30.03.16
10:39
(35)+ *смещение
37 Fedor-1971
 
30.03.16
11:39
(34)(35) Не саму "стрелочку", а всё до конца файла вместе с ней.
Как-то очень похоже на старую проблему из DOS: дописывание символа 1А в файл при просмотре редактором. Бывали случаи записи оного в середину файла, так, что структура DBF ломалась до конца файла.
38 rt2000
 
30.03.16
11:48
(37) Я до сих пор не нашел проблему.
Точнее нашел одну строчку, которую исключить из выгрузки и все нормально.
Что за символ 1А?
Искал в условии, не нашел:

если Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ВК) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ВТаб) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.НПП) > 0  или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ПС) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ПФ) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.Таб) > 0 тогда
            Сообщить("ЕСТЬ Символ");
        КонецЕсли;
39 Ёпрст
 
30.03.16
11:50
(38) Не можешь найти последнюю строку в выгрузке ?
Это очень сложно ?
40 rt2000
 
30.03.16
11:55
(39) В данной таблице 180 строк, мой редактор показывает 179 (31), одна строчка пустая, и где она?
Через какой редактор.
И по условию не могла добавиться строчка и не записаться. Ошибок в коде не находилось.
41 Garykom
 
гуру
30.03.16
11:59
(38) >Точнее нашел одну строчку, которую исключить из выгрузки и все нормально.

вот в этой строчке есть в каком то поле левые символы, открой вручную эту номенклатуру и проверь все поля (наименование, полное наименование), нет ли там чего левого
42 Woldemar177
 
30.03.16
12:00
(38) Эта стрелочка наверно копируется из 1с
43 aka AMIGO
 
30.03.16
12:00
Вообще по старинным описаниям работы СУБД,  оператор
DBF.Добавить()
добавляет в конец файла пустую запись
а оператор
DBF.Записать()
укладывает значения в эту запись.
Если почему-либо "Записать" не выполнено, то пустая запись остается в файле.

Я видел эту ситуацию при работе с FoxPro.
44 Fedor-1971
 
30.03.16
12:02
(38) посмотри (34), когда-то давно, когда на компах жил DOS некоторые редакторы дописывали этот символ как признак конца файла

(40) после "Стрелочки" твоя 170 строка. Некоторые DBF смотрелки просто используют структуру файла и выводят целые строки, в твоём случае 169 шт.

(42) Дописывается 1С, хотя, не факт.
46 aka AMIGO
 
30.03.16
12:08
(43) + вот насчет счетчика записей в хидере - не уверен, что там добавляется единичка до "Записать". Если единица не добавлена - последняя запись не будет показана
47 rt2000
 
30.03.16
12:35
Через какой редактор открыть, что бы увидеть все 180 строк из 179 целых строк?
48 ЧеловекДуши
 
30.03.16
12:41
(0) >>> файл не открывается в редакторе dbf

Предлагаю удалить редактор, скачать другой :)
49 ЧеловекДуши
 
30.03.16
12:43
(16) Выслать файл в формате XLSX
50 aka AMIGO
 
30.03.16
12:43
(47) Я открывал в LibreOffice Calc, всего 180 строк, с учетом того, что первая строка - заголовки, то видно 179 инфо-строк
51 Ёпрст
 
30.03.16
12:47
sdbf, например
52 aka AMIGO
 
30.03.16
12:47
Жалко, FoxPro2.0 несовместим с Win-7 64х. Другой у меня нет, мог-бы посмотреть.
Кстати, где-то в инете выложена работающая версия FoxPro 2.0
Вполне можно воспользоваться.
Она ДОСовская.
53 ЧеловекДуши
 
30.03.16
12:51
(40) Удали вообще файл, создай новый. Бывает так, что ты все время ерзаешь какой либо старый файлик и мучаешься почем зря :)
54 aka AMIGO
 
30.03.16
13:21
Почитал в 7.7
    ДБФ = СоздатьОбъект("XBase");
    ДБФ.ОткрытьФайл("C:\И\диск D\Tools\FoxPro20\OUTLETS.DBF",,);
    Сообщить(ДБФ.КоличествоЗаписей());
    ДБФ.ЗакрытьФайл();

Сообщает: 179


в winDBFview первым делом выскакивает сообщение о нарушенном заголовке, но игнорируется, и кажет 179 записей.

в sdbf видна пустая запись, 180-я.

Больше доверия у меня к 1С-овскому отчетику.

в sdbf, скорей всего, 180-я строка - заготовка под редактор. Не удаляется. Но добавлять можно, через Insert

Т.О. в файле 179 строк. Пустой строки нет. Установить, нарушен-ли заголовок файла - установить нет возможности. Но ругается только winDBFview, а 1С и sdbf воспринимают нормально.
55 aka AMIGO
 
30.03.16
13:34
DBFNavigator не открывает. Видимо, строже подходит к структуре заголовка, либо файл из-под 1С-овской xBase "не той системы" ©
56 aka AMIGO
 
30.03.16
13:42
Тем людям, которым надо отправить, используют DBF Navigator.
Будут какие предположения, как это можно поправить?


winDBFview - наиболее подходящая для твоих файлов. Скажи Тем людям, чтобы пользовались этой утилитой, или той, которая таки открывает.
Но sdbf - неверная подруга.. Будут твои "Те люди" ломать голову над пустой строкой"
57 Garykom
 
гуру
30.03.16
14:05
У меня мысля.

ТС плиз покажи полный код, в т.ч. как создаешь заголовок файла.
58 rt2000
 
30.03.16
14:09
(57)
Полный код, без запроса выглядит следующим образом на данный момент:

ДБФ = Новый XBase;        
    ДБФ.Кодировка = КодировкаXBase.OEM;// OEM - правильная кодировка    
    ДБФ.Поля.Добавить("OL_ID","N",20);              //уник ИД в системе SalemWork  Значение "0"
    ДБФ.Поля.Добавить("OL_Code","S",25);            //Уникальный код
    ДБФ.Поля.Добавить("SubType_ID","N",11);         //Значение 6
    ДБФ.Поля.Добавить("Area_ID","N",11);            //0
    ДБФ.Поля.Добавить("Name","S",254);              //Юр назв торг точки
    ДБФ.Поля.Добавить("Trade_Name","S",254);        //Короткое название торг точки
    
    ДБФ.Поля.Добавить("Director","S",50);           //Директор торг точки "-"
    ДБФ.Поля.Добавить("Address","S",254);           //Адрес торг точки
    ДБФ.Поля.Добавить("Deliv_Addr","S",254);        //Адрес доставки
    ДБФ.Поля.Добавить("Telephone","S",20);          //тел "-"
    ДБФ.Поля.Добавить("Fax","S",20);                //факт "-"
    ДБФ.Поля.Добавить("EMail","S",50);              //"-"
    ДБФ.Поля.Добавить("Accountant","S",50);         //"-" бухг торг точки
    ДБФ.Поля.Добавить("Acc_Phone","S",20);          //тел бухг "-"
    ДБФ.Поля.Добавить("M_Manager","S",50);          //"-"
    ДБФ.Поля.Добавить("MM_Phone","S",20);           //"-"
    
    ДБФ.Поля.Добавить("P_Manager","S",50);          //ФИО тогр представителя
    ДБФ.Поля.Добавить("Open_Time","S",5);           //"00:00"
    ДБФ.Поля.Добавить("Close_Time","S",5);          //"00:00"
    ДБФ.Поля.Добавить("Break_From","S",5);          //"00:00"
    ДБФ.Поля.Добавить("Break_To","S",5);            //"00:00"
    ДБФ.Поля.Добавить("ZKPO","S",20);               //ОКПО "-"
    ДБФ.Поля.Добавить("IPN","S",20);                //ИНН
    ДБФ.Поля.Добавить("VATN","S",20);               //Номер плательщика НДС "-"
    ДБФ.Поля.Добавить("RR","S",20);                 //расчетный счет "-"
    ДБФ.Поля.Добавить("BankCode","S",20);           //код банк
    ДБФ.Поля.Добавить("BankName","S",50);           // банка
    ДБФ.Поля.Добавить("BankAddr","S",50);           //адрес банка
    ДБФ.Поля.Добавить("DTLM","S",14);               //Дата и время модификации
    ДБФ.Поля.Добавить("Owner_ID","N",11);           //Значение 0
    
    ДБФ.Поля.Добавить("CONTR_NUM","S",50);          //Номер договора "-"             НЕТ
    ДБФ.Поля.Добавить("CONTR_DATE","D",8);          //Дата договора                 НЕТ
    ДБФ.Поля.Добавить("CNTR_DT_F","D",8);           //Дата окончания договора         НЕТ
    ДБФ.Поля.Добавить("Status","N",11);             //статус 2- активные ТТ, 9-для закрывшихся ТТ
    ДБФ.Поля.Добавить("PComp_Code","S",25);         //Внешний код         НЕТ
    ДБФ.Поля.Добавить("DC_Allow","N",3);            //    НЕТ
    
    ДБФ.Поля.Добавить("Lic_Usage","N",5);              //    Значение 0   ОШИБОЧНОЕ ПОЛЕ

    ДБФ.Поля.Добавить("OLDistCent","S",25);         //    НЕТ
    ДБФ.Поля.Добавить("OLDistShar","N",7,3);        //    НЕТ
    ДБФ.Поля.Добавить("DC_Deliver","L",1);            //    НЕТ
    ДБФ.Поля.Добавить("DC_Payer","L",1);              //    НЕТ
    //ДБФ.Поля.Добавить("Lic_Usage","N",5);              //    Значение 0
    ////ДБФ.Поля.Добавить("","S",20);
    
    ДБФ.СоздатьФайл("D:\123\OUTLETS.dbf");
    ДБФ.АвтоСохранение = Истина;
    Выборка = Запрос.Выполнить().Выбрать();
   ТЗДр = новый ТаблицаЗначений;
   ТЗДр.Очистить();
   ТЗДр.Колонки.Добавить("Ссылка");
   ТЗДр.Колонки.Добавить("ОКПО");
   ТЗДр.Колонки.Добавить("Представление");  
   ПерЗ = 0;   КонтрДуб = "";
   пока Выборка.Следующий() цикл
        //если Найти(Выборка.Ссылка.НаименованиеПолное, "АНТЭК") = 0 тогда
        //   Продолжить;
        //КонецЕсли;
        если ПустаяСтрока(Выборка.Поле12) тогда
            Продолжить;
        КонецЕсли;
        если Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ВК) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ВТаб) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.НПП) > 0  или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ПС) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.ПФ) > 0 или
            Найти(Выборка.Ссылка.НаименованиеПолное, Символы.Таб) > 0 тогда
            Сообщить("ЕСТЬ Символ");
        КонецЕсли;
                
        /////////////////////////////////////////////////////////////
        //2)Вторая часть
        ДБФ.Добавить();    
        ДБФ.OL_ID = 0;
        если ПустаяСтрока(Выборка.Поле12) тогда
            ДБФ.OL_Code = Выборка.Ссылка.Код;
        иначе    
            ДБФ.OL_Code = Выборка.Поле12;    //Выборка.Ссылка.Код;        
        КонецЕсли;
        ДБФ.Name = СокрЛП(Выборка.Ссылка.НаименованиеПолное); //Выборка.Представление;
        ДБФ.Trade_Name = СокрЛП(Выборка.Ссылка.НаименованиеПолное); //Выборка.Представление;
        ДБФ.Lic_Usage = 0;
        ДБФ.Записать();
        
        /////////////////////////////////////////////////////////////
        //1)Первая часть
        //Сообщить("-"+Выборка.Ссылка.НаименованиеПолное + "-" + Выборка.Ссылка.Код+";");
        если КонтрДуб <> Выборка.Ссылка тогда    
            ПерЗ = ПерЗ + 1;
            если ПерЗ = 6 тогда
                Сообщить("ОШИБОЧНЫЙ " + Выборка.Ссылка);
                КонтрДуб = Выборка.Ссылка;
                //Продолжить;
            КонецЕсли;
                ДБФ.Добавить();    
                ДБФ.OL_ID = 0;
                //если ПустаяСтрока(Выборка.Поле12) тогда
                КодКон = Выборка.Ссылка.Код;
                    ДБФ.OL_Code = "СТ555"; //КодКон;
                //иначе    
                //    ДБФ.OL_Code = Выборка.Поле12;    //Выборка.Ссылка.Код;        
                //КонецЕсли;
                //ДБФ.Name = СокрЛП(Выборка.Ссылка.НаименованиеПолное); //Выборка.Представление;
                //ДБФ.Trade_Name = СокрЛП(Выборка.Ссылка.НаименованиеПолное); //Выборка.Представление;
                ДБФ.Lic_Usage = 0;
                ДБФ.Записать();

        КонецЕсли;
        КонтрДуб = Выборка.Ссылка;    
    КонецЦикла;
    Сообщить("Кол записаей " + ДБФ.КоличествоЗаписей());

Количество записей 179
59 rt2000
 
30.03.16
14:11
Сейчас нашел строку:
ДБФ.Поля.Добавить("Lic_Usage","N",5);              //    Значение 0   ОШИБОЧНОЕ ПОЛЕ

если ее за комментировать, то выгрузка нормальная.
Но мне это поле надо для нормальной выгрузкой
60 Mikeware
 
30.03.16
14:11
(58) почто SalesWorks верблюдОм обозвал? :-)
61 Garykom
 
гуру
30.03.16
14:16
(58) Добавь в конце
ДБФ.ЗакрытьФайл();

XBase.ЗакрытьФайл (XBase.CloseFile)
XBase (XBase)
ЗакрытьФайл (CloseFile)
Синтаксис:

ЗакрытьФайл()
Описание:

Закрывает ранее открытую или созданную таблицу базы данных формата DBF.

Доступность:

Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Пример:

Если xB.Открыта() Тогда
    xB.ЗакрытьФайл();
КонецЕсли;


ЗЫ а автосохранение можешь отрубить
62 rt2000
 
30.03.16
14:31
(61) Этот вариант тоже не помогает