|
Посоветуйте с таблицей 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) Этот вариант тоже не помогает
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |