Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 3)

Автор: AndVGri
Дата сообщения: 18.10.2011 09:19
unit4
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\folder;Extended Properties=dBASE IV;User ID=Admin;Password=;

Цитата:
"create table REPORT (LCODE int(10), CODE int(16), SECTION int(20), KOL int(12), SUM double(30), PRTSH int(12))"

Названия полей SECTION и SUM недопустимы
для int, integer, double, float не допустимо указание размера, только для Numeric, char, text и по подобных
Автор: unit4
Дата сообщения: 18.10.2011 10:07
AndVGri
Пздц, а почему SECTION и SUM то нельзя? Как тогда разработчики программы умудрились сделать импорт dbf с такими полями? Или это в vba недопустимо?

Добавлено:
Понял я почему недопустимы. Плохо...
Автор: AndVGri
Дата сообщения: 18.10.2011 10:13
unit4
Ограничение ADODB.Connection (SUM зарезервированное слово для функции суммирования)
можешь обойти, используя []
"create table REPORT (LCODE int, CODE integer, [SECTION] integer, KOL integer, [SUM] double, PRTSH integer)"
Автор: unit4
Дата сообщения: 18.10.2011 10:23
AndVGri
Так это не обход, [] все равно присутствует в имени столбца((
Автор: AndVGri
Дата сообщения: 18.10.2011 10:34
unit4
нет не присутствует, посмотри в результате, [] для нестандартных названий столбцов
Автор: unit4
Дата сообщения: 18.10.2011 11:01
AndVGri
Не могу пока посмотреть. У меня что то вылетает на

Код:
DBConn.Execute ("Insert into REPORT Values(" + rec!skln_cd + ",'',''," + CInt(OQ(i).Text) * CInt(rec!nmEi_QtOsn) + "," + OUGP(i).Text + ",'')")
Автор: rrromano
Дата сообщения: 18.10.2011 17:25
unit4
Маленький совет: старайтесь использовать полную форму insert:

INSERT INTO Table1 (Column1, Column2, Column3…)
VALUES (Value1, Value2, Value3…)
Автор: unit4
Дата сообщения: 19.10.2011 05:28
rrromano
ок, спасибо)

Добавлено:
Что то я не пойму. У меня артикул имеет вид 1111/2222, а в dbf файл он записывается в виде 8.11754170300083E-02 т.е. делиться одно число на другое, хотя тип стоит varchar. Как такое может быть?
Автор: AndVGri
Дата сообщения: 19.10.2011 07:27
unit4
1111/2222 видимо воспринимаются как вычисление, запиши как '1111/2222'
Автор: unit4
Дата сообщения: 19.10.2011 07:56
AndVGri
Гуд, все работает) Спасибо большое, что то я сам не додумался попробовать))
Автор: rrromano
Дата сообщения: 19.10.2011 11:42
unit4
Не за что особо )
Просто грабли там часто лежат.)))
Автор: unit4
Дата сообщения: 19.10.2011 12:05
Можно ли так писать?

Код:
Call DBConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\trash\'; Extended Properties='DBASE 5'; codepage='OEM'")
Автор: AndVGri
Дата сообщения: 20.10.2011 02:37
unit4
Extended Properties='dBASE 5.0'
codepage='OEM' - убрать, ругается
А чем dBase IV не устроило?
Автор: unit4
Дата сообщения: 20.10.2011 04:33
AndVGri
codepage='OEM' мне необходим, потому что я в dbf записываю русские буквы, а у меня в нутри оказываются крякозяблик.
Автор: AndVGri
Дата сообщения: 20.10.2011 04:56
unit4
Microsoft.Jet.OLEDB.4.0 пишет в DOS кодировке cp866, если надо в Windows 1251, то потребуется установить другого провайдера Microsoft OLE DB Provider for Visual FoxPro 9.0
Автор: unit4
Дата сообщения: 20.10.2011 05:05
AndVGri

Цитата:
то потребуется установить другого провайдера Microsoft OLE DB Provider for Visual FoxPro 9.0

Таким образом, мне клиенту тоже необходимо устанавливать этот драйвер? Другого способа нет?
Автор: AndVGri
Дата сообщения: 20.10.2011 05:15
unit4
Ну, почему нет! Пишешь свой перекодировщик dbf из DOS в Windows, после выполнения работы твоего кода по созданию dbf таблицы и вперёд. Можешь что то и по гуглить. Я, правда, когда мне было нужно ничего другого не нащёл
А самое главное. Если клиент читает таблицу через Microsoft.Jet.OLEDB.4.0, то ему не всё ли равно в какой кодировке там строки?
Если он читает таблицу софтом, который понимает в dbf только Windows 1251, то ему то драйвер Visual Foxpro зачем?
Автор: unit4
Дата сообщения: 20.10.2011 05:25
AndVGri
Ох, что то непонятно ничего)) Точнее я понимаю, что чтение в итоге ложиться на плечи той проги которая читает dbf. Вот только получается, что она (эта прога) не умеет из dbf DOS конвертировать в dbf Win.
Автор: AndVGri
Дата сообщения: 20.10.2011 05:32
unit4
Ну, так Microsoft OLE DB Provider for Visual FoxPro 9.0 тебе в помощь. Он как раз и делает dbf с Win кодировкой.
Автор: unit4
Дата сообщения: 20.10.2011 09:25
AndVGri
так, а если заморочиться со сменой значения бита ? Получиться?
Автор: AndVGri
Дата сообщения: 21.10.2011 01:43
unit4

Цитата:
так, а если заморочиться со сменой значения бита ? Получиться?

И что это даст? Может всё-таки детальнее опишешь задачу в части создания dbf?
Автор: unit4
Дата сообщения: 21.10.2011 04:30
AndVGri
Да куда уж детальней. Необхоимо создать dbf файл в котором будет заказ от поставщика передаваться в КИС (ИС ПРО). Есть поле с единицами измерения, так как в КИС базовая ЕИ штуки, а заказ приходит в коробках, то для удобства хочу указывать эти самые ЕИ. ЕИ в поле указывается как "шт","бл","кор". Проблема заключается в том, что когда втягивается этот dbf в КИС, то КИС не понимает чего там в поле ЕИ указали и ругается.

Сейчас сделал через FPOLEDB.1 провайдер, но он почему то ругается, если в строке insert в поле с данными стоит кавычка одинарная.


Код:
Call DBConn.Open("Provider=VFPOLEDB.1;Data Source='D:\trash\';CursorLocation=adUseClient;BackgroundFetch=Yes;Collate=Russian ")
DBConn.Execute ("create table REPORT (LCODE varchar, CODE int, [SECTION] char(2), KOL int," + _
"[SUM] double, PRTSH char(1), EI char(3))")

i = 0
While Not rec.EOF And SIC.Length - 1

DBConn.Execute ("Insert into REPORT (LCODE,[SECTION],KOL,[SUM],EI) " + _
"Values(" + _
rec!skln_cd + _
",01," + _
OQ(i).Text + "," + _
OUGP(i).Text + _
",'кор')" _
)

OUGP(i).Text

i = i + 1

rec.MoveNext
Автор: AndVGri
Дата сообщения: 21.10.2011 07:34
unit4

Цитата:
но он почему то ругается, если в строке insert в поле с данными стоит кавычка одинарная.

Неправда

Код:
Option Explicit
Dim DBConn

Set DBConn = CreateObject("ADODB.Connection")

DBConn.Open "Provider=VFPOLEDB.1;Data Source='c:\temp\';CursorLocation=adUseClient;BackgroundFetch=Yes;Collate=Russian"
DBConn.Execute "create table REPORT (LCODE varchar, CODE int, [SECTION] char(2), KOL int, [SUM] double, PRTSH char(1), EI char(3))"

DBConn.Execute "Insert Into Report (LCODE, [SECTION], KOL, [SUM], EI)" & _
             "Values('код1', 'шт', 123, 234.5, 'кор')"
DBConn.Execute "Insert Into Report (LCODE, [SECTION], KOL, [SUM], EI)" & _
             "Values('код2', 'бл', 34, 641.17, 'упк')"
Автор: unit4
Дата сообщения: 21.10.2011 08:20
AndVGri
Спасибо, учту ваше пожелание. Буду пробовать.
Автор: AndVGri
Дата сообщения: 21.10.2011 08:57
unit4
Как вариант (только изменил для поля LCODE тип с varchar на char(254)

Код:
Option Explicit

Const adUseClient = 3
Const adOpenStatic = 3
Const adCmdTable = 2
Const adLockOptimistic = 3
Dim DBConn, DBRSet

Set DBConn = CreateObject("ADODB.Connection")

DBConn.Open "Provider=VFPOLEDB.1;Data Source='c:\temp\';Collate=Russian"
DBConn.Execute "Create Table REPORT (LCODE char(254), CODE int, [SECTION] char(2), KOL int, [SUM] double, PRTSH char(1), EI char(3))"

Set DBRSet = CreateObject("ADODB.Recordset")
DBRSet.CursorLocation = adUseClient
DBRSet.Open "REPORT", DBConn, adOpenStatic, adLockOptimistic, adCmdTable

DBRSet.AddNew
DBRSet("LCODE") = "код1"
DBRSet("SECTION") = "шт"
DBRSet("KOL") = 123
DBRSet("SUM") = 234.56
DBRSet("EI") = "кор"
DBRSet.Update
Автор: unit4
Дата сообщения: 21.10.2011 10:12
AndVGri
Я когда пытаюсь открыть созданный файл excel'ем, то у меня там такая ерунда, совсем не то, что было когда через Jet создавал или dbf надо самим foxPro открывать?

Кстати почему то у меня всего одна позиция записывается, хотя вроде цикл сделал


Код:
Const adUseClient = 3
Const adOpenStatic = 3
Const adCmdTable = 2
Const adLockOptimistic = 3
Dim DBConn, DBRSet

Set DBConn = CreateObject("ADODB.Connection")

DBConn.Open "Provider=VFPOLEDB.1;Data Source='D:\trash\';Collate=Russian"
DBConn.Execute "Create Table REPORT (LCODE char(254), CODE int, [SECTION] char(2), KOL int, [SUM] double, PRTSH char(1), EI char(3))"

Set DBRSet = CreateObject("ADODB.Recordset")
DBRSet.CursorLocation = adUseClient
DBRSet.Open "REPORT", DBConn, adOpenStatic, adLockOptimistic, adCmdTable
i = 0
DBRSet.AddNew
While Not rec.EOF And SIC.Length - 1

DBRSet("LCODE") = rec!skln_cd
DBRSet("SECTION") = "01"
DBRSet("KOL") = OQ(i).Text
DBRSet("SUM") = OUGP(i).Text
DBRSet("EI") = "кор"

i = i + 1
rec.MoveNext

Wend
DBRSet.Update
Автор: AndVGri
Дата сообщения: 21.10.2011 10:17
unit4
Да ну... вызовы DBRSet.AddNew, DBRSet.Update должны быть в теле цикла. Добавляем и обновляем же запись.
Excel и Access работают через Provider=Microsoft.Jet.OLEDB.4.0, который пишет кодировку DOS, поэтому они и отображают кракозяблы.
Насколько я понял, программа, которая будет использовать dbf требует кодировку Win 1251 или всё же нужно для Excel, Access? Вопрос так и не прояснён.

Автор: unit4
Дата сообщения: 21.10.2011 10:40
AndVGri
Вы знаете, я сам до конца не в курсе, какая кодировка нужна. На Excel, Access - пофиг.
Я могу приложить файл, который мне прислала служба поддержки, я у них спросил, какая кодировка то нужна, они сказали смотреть в файл О_о. Может вы знаете как посмотреть кодировку dbf?))


Добавлено:
Я думаю надо попробовать три кодировки ANSI, OEM и Win. Насколько я понял, Jet пишет ANSI/OEM в зависимости от того как там в реестре стоит ключик.
Автор: gjf
Дата сообщения: 21.10.2011 11:05
Вопрос к гуру.

Есть файл-таблица Excel. В нём в ячейках находится текст. Текст не простой, а гиперссылка. Задача такова: скачать контент всех гиперссылок в папку, где находится искомый файл-таблица, после чего поменять все гиперссылки на локальный путь. То есть сделать онлайн-форму документа офлайн-формой.

Такое же повторить и для других листов.
Автор: data man
Дата сообщения: 21.10.2011 11:33

Цитата:
Вопрос к гуру.


Цитата:
ткните в ветку, где пасутся такие помощники

Если гуру считают себя пасущимися здесь, то, конечно, помогите "не гуру".

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.