Помогите с базой данных!

Программирование на Visual Basic for Applications
DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Помогите с базой данных!

Сообщение DjSaSh » 18.02.2004 (Ср) 17:51

Вот есть такое задание:
Есть база данных, написанная на парадоксе....
А также есть данные, находящиеся в Ms Word, кто может помочь с написанием кода для перевода данных с ворды в базу данных?
Заранее благодарен!

(Я ламер в VBA полный, по этому не надо говорить, что задание очень простое и ответ можно найти на форумах, все уже перерыл и конкретного ничего не нашел, а что нашел - то не работает)...

Dave
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 18.02.2004 (Ср) 11:02
Откуда: Москва

Сообщение Dave » 18.02.2004 (Ср) 17:59

Если очень надо могу скинуть код переброса данных из Excel в SQLServer, может что сходное найдешь. Мыло свое скинь на davido@bk.ru, только скину завтра - щас домой пойду :D

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 18.02.2004 (Ср) 18:06

Свой мыльник на мыло те отправил, а заодно и здесь напишу: djsash_diplom@ukr.net

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 19.02.2004 (Чт) 11:43

Благодарю за пример!
Вот смотрю на него и не могу понять, он добаваляет в базу данные или из базы их достает? на мой взгляд он их достает...
Ну ничего, сейчас в форуме покопаюсь и найду как добавить в базу...

Dave
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 18.02.2004 (Ср) 11:02
Откуда: Москва

Сообщение Dave » 19.02.2004 (Чт) 12:36

Эта прога выуживает данные из другого экселевского файла-шаблона, переносит их на лист pl_f книги, где написаны макросы и только потом перебрасывает их в БД.

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 19.02.2004 (Чт) 13:28

Понятно!
Но у меня на такой вариант ругается, что не расспознаный формат базы данных, а я использую парадоксовскую базу данных...

Dave
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 18.02.2004 (Ср) 11:02
Откуда: Москва

Сообщение Dave » 19.02.2004 (Чт) 15:14

У меня база на SQL Server

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 19.02.2004 (Чт) 15:45

Dave, а что ты используешь для работы с БД - ADO, DAO?
там ведь разница-то небольшая на этом уровне - надо параметр поменять, где коннекция открывается
Запостите кусок кода, кто-нибудь...

Для Excel пример из MSDN:
Код: Выделить всё
DAO
Sub DAOOpenISAMDatabase()

   Dim db As DAO.Database
   Set db = DBEngine.OpenDatabase(".\Sales.xls", _
      False, False, "Excel 8.0;")

End Sub

ADO
Sub ADOOpenISAMDatabase()

   Dim cnn As New ADODB.Connection

   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=.\Sales.xls" & _
      ";Extended Properties=Excel 8.0;"

End Sub


Для парадокса надо "Excel 8.0" заменить на "Paradox 3.x" или "Paradox 4.x", или "Paradox 5.x", ну и путь правильный указать вместо ".\Sales.xls"...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 19.02.2004 (Чт) 16:45

Я использовал DAO и код программы выходит такой:

Код: Выделить всё
Dim db2 As DAO.Database
Dim rs2 As DAO.Recordset
Dim dbFile As String

dbFile = "C:\test"
Set db2 = DBEngine.OpenDatabase(dbFile, False, False, "Paradox 7.X;")
SQL = "SELECT Variant FROM test.DB"
Set rs2 = db2.OpenRecordset(SQL, dbOpenDynaset)

rs2.Close
db2.Close


Если в dbFile вводить "C:\test\test.DB" он материться, что ошибочный путь.
А при строчке Set rs2 = db2.OpenRecordset(SQL, dbOpenDynaset)
из за переменной "SQL" пишет ошибку "Run-Time Error '3061' Слишком мало параметров. Требуется 1"

Что предлагаете изменить????

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 19.02.2004 (Чт) 16:55

SQL запрос неправильный
он должен быть примерно такой: "Select Field1, Field2 from MyTable"
или "Select * from MyTable", чтобы выбрать все поля из таблицы MyTable
он не знает, что такое test.db - поэтому ругается...

но вот мне не нравится, что на путь ругается...
c:\test\test.db - это полный путь к существующей парадоксовской базе?

Рекордсет открывают, чтобы достать данные из базы.
Все, что тебе нужно, это метод Execute у объекта Database
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 19.02.2004 (Чт) 17:05

Слово "Variant" - это имя поля...
Все остальное в твоем понимании - правильно...

Dave
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 18.02.2004 (Ср) 11:02
Откуда: Москва

Сообщение Dave » 19.02.2004 (Чт) 17:17

Rainbow, я коннекчусь через ODBC

Sub SendXls()

Dim wrkPbd As Workspace
Dim dbsPbd As Database

Dim parentRecId1 As String
Dim systemID1 As String
Dim importbatch1 As String
Dim name1 As String
Dim transDate1 As String
Dim accountNum1 As String
Dim offsetAccount1 As String
Dim amountCurDebit1 As String
Dim txt1 As String
Dim dim1 As String
Dim dim2 As String
Dim dim3 As String
Dim dim4 As String
Dim dim5 As String
Dim dim6 As String
Dim dim7 As String
Dim dim8 As String

Dim strSQL As String
Dim cnt As Integer
Dim retCode As Integer

mUID = name_UID
mPWD = name_PWD
mDSN = name_DSN
systemID1 = identDoc
importbatch1 = nameDoc
name1 = nameJournal
mcodAxapta = codAxapta
miRow = iRow

If miRow < 2 Then
Exit Sub
End If

Windows(F_work).Activate
Sheets("pl_f").Select

strSQL = "BEGIN TRANSACTION" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SET DATEFORMAT dmy" & Chr$(10) & Chr$(12)


strSQL = strSQL & "DELETE EXP_LedgerJournalTrans" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE" & Chr$(10) & Chr$(12)
strSQL = strSQL & "ParentRecId=" & Chr$(10) & Chr$(12)
strSQL = strSQL & "(SELECT CAST(RecNo AS Varchar(20)) FROM EXP_LedgerJournalTable" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SystemID='" & systemID1 & "' AND" & Chr$(10) & Chr$(12)
strSQL = strSQL & "Name='" & name1 & "')" & Chr$(10) & Chr$(12)


strSQL = strSQL & "DELETE EXP_LedgerJournalTable" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SystemID='" & systemID1 & "' AND" & Chr$(10) & Chr$(12)
strSQL = strSQL & "Name='" & name1 & "'" & Chr$(10) & Chr$(12)

strSQL = strSQL & "INSERT EXP_LedgerJournalTable" & _
"(State,IMPORTBATCH,SystemID,ParentRecID,Name,Dimension) VALUES (0,'" & _
importbatch1 & "','" & systemID1 & "','0','" & name1 & "','" & mcodAxapta & "')" & Chr$(10) & Chr$(12)
strSQL = strSQL & "UPDATE EXP_LedgerJournalTable" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SET ParentRecID=RecNo" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE ParentRecID='0'" & Chr$(10) & Chr$(12)


cnt = 2

Do
transDate1 = Cells(cnt, 1)
' transDate1 = Mid(transDate1, 7, 4) & Mid(transDate1, 3, 4) & Mid(transDate1, 1, 2)
accountNum1 = Cells(cnt, 2)
offsetAccount1 = Cells(cnt, 3)
amountCurDebit1 = Cells(cnt, 4)

lenAm = Len(amountCurDebit1)
cntl = 1
prAmount = "1"
Do
prAm = Mid(amountCurDebit1, cntl, 1)
If prAm = "," Then prAm = "."
prAmount = prAmount & prAm
cntl = cntl + 1
Loop While cntl <= lenAm
amountCurDebit1 = Mid(prAmount, 2, lenAm)

txt1 = Cells(cnt, 5)
dim1 = Cells(cnt, 6)
dim2 = Cells(cnt, 7)
dim3 = Cells(cnt, 8)
dim4 = Cells(cnt, 9)
dim5 = Cells(cnt, 10)
dim6 = Cells(cnt, 11)
dim7 = Cells(cnt, 12)
dim8 = Cells(cnt, 13)

strSQL = strSQL & "INSERT EXP_LedgerJournalTrans" & _
"(State,ParentRecId,TableRecNo,TransDate,AccountNum,OffsetAccount," & _
"AmountCurDebit,Txt," & _
"Dimension,Dimension2_,Dimension3_,Dimension4_," & _
"Dimension5_,Dimension6_,Dimension7_,Dimension8_)" & Chr$(10) & Chr$(12)
strSQL = strSQL & "VALUES (0,'0'," & cnt & ",'" & _
transDate1 & "','" & accountNum1 & "','" & offsetAccount1 & "'," & _
amountCurDebit1 & ",'" & txt1 & "','" & _
dim1 & "','" & dim2 & "','" & dim3 & "','" & dim4 & "','" & _
dim5 & "','" & dim6 & "','" & dim7 & "','" & dim8 & "')" & Chr$(10) & Chr$(12)
cnt = cnt + 1
Loop While cnt <= miRow

strSQL = strSQL & "UPDATE EXP_LedgerJournalTrans" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SET TableRecNo=RecNo" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE ParentRecId='0'" & Chr$(10) & Chr$(12)
strSQL = strSQL & "UPDATE EXP_LedgerJournalTrans" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SET ParentRecId=(SELECT CAST(RecNo AS Varchar(20)) from EXP_LedgerJournalTable" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE State=0 AND" & Chr$(10) & Chr$(12)
strSQL = strSQL & "SystemID='" & systemID1 & "' AND" & Chr$(10) & Chr$(12)
strSQL = strSQL & "Name='" & name1 & "')" & Chr$(10) & Chr$(12)
strSQL = strSQL & "WHERE ParentRecID='0'" & Chr$(10) & Chr$(12)


strSQL = strSQL & "COMMIT TRANSACTION" & Chr$(10) & Chr$(12)

Set wrkPbd = CreateWorkspace("", mUID, mPWD, dbUseODBC)

Set dbsPbd = wrkPbd.OpenDatabase("", , False, "ODBC;DSN=" & mDSN) dbsPbd.Execute strSQL
dbsPbd.Close

End Sub

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 19.02.2004 (Чт) 17:36

Ага...

DjSaSh, после from ты поставил имя таблицы? Насколько я понимаю, у тебя там имя базы стояло перед этим...

Поле Variant в какой таблице находится?
Выбрались у тебя данные из базы?

Строка открытия базы у тебя сейчас правильно написана - там действительно должен быть путь до каталога с парадоксовскими файлами...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 19.02.2004 (Чт) 20:04

Блин! Сколько я всего перерыл, сколько я всего испробовал, но ничего до сих пор не помогло...

Так: Есть база данных test.DB в ней поля s, Variant и id s-счетчик, остальные - не имеет значения....
Так вот: нужно в test.DB запихнуть данные в поля Varianе и id б счетчик думаю поставиться сам...

Dave
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 18.02.2004 (Ср) 11:02
Откуда: Москва

Сообщение Dave » 20.02.2004 (Пт) 11:07

Set RabObl = CreateWorkspace("", name_UID, name_PWD, dbUseJet)
Set BazDan = RabObl.OpenDatabase("путь и имя таблицы", true)

' Пишешь SQL запрос на вставку в какую-нибудь строку (типа см.
' выше в стр. StrSQL)

BazDan.Execute strSQL

BazDan.Close

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 20.02.2004 (Пт) 12:11

Да, не знаю, доборешься ли ты с парадоксом... Я тут еще знаний нашла... Сейчас поделюсь... Плохо, что проверить не могу...

Код: Выделить всё
Dim db2 As DAO.Database
Dim rs2 As DAO.Recordset

Set db2 = DBEngine.OpenDatabase("C:\test", False, False, "Paradox 7.x;")
Set rs2 = db.OpenRecordset("test#DB")

rs2.AddNew
rs2!id = 6
rs2!Variant = "New data"
rs2.Update

'или
db2.Execute "INSERT INTO test#db (id, Variant) VALUES (7, 'New data')"

rs2.Close
db2.Close


Еще в сети и MSDN бродит мысль, о том, что парадоксовские таблицы не плохо бы прилинковать к аксессовской базе. А с ней уже точно все работать умеют и быстро тебе код нужный напишут.

на мыло сейчас тебе статью кину...
Последний раз редактировалось Rainbow 20.02.2004 (Пт) 12:35, всего редактировалось 1 раз.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 20.02.2004 (Пт) 12:29

УРАААААААААААААААААААААААААААААААААААААААААААААААААААААААААА!!!

НАКОНЕЦ-ТО.... А ВСЕГО-ТО ДЕЛОВ ТО В ....

БЛАГОДАРЮ ВСЕХ ЗА ПОМОЩЬ, А В ЧАСТНОСТИ Rainbow... ВРОДЬ РАБОТАЕТ....
БЫЛИ-БЫ ВЫ В КИЕВЕ, Я БЫ ВАМ СТОЛЬКО ПИВА ВЫСТАВИЛ.... (НУ ЯЩИК НАВЕРНОЕ ТОЧНО)...

БЛАГОДАРЮ ЕЩЕ РАЗ... ТЕПЕРЬ МОИ МУЧЕНИЯ ДУМАЮ ЗАКОНЧИЛИСЬ...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 20.02.2004 (Пт) 12:34

:D :D :D :D :D :D :D :D :D :D :D
Супер!

А пиво хоть и виртуальное, но все равно спасибо :)
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 20.02.2004 (Пт) 13:15

Ну тогда можно и попить! :-)

Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение

Кстати, еще один вопросик.
Вот в базе данных есть поле BLOB, так вот какая переменная потянет это???
У меня данные не просто идут как стринги, а еще с наворотам .... (ну типа строчка в ворде там с разными регистрами и символами)... :-)

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 20.02.2004 (Пт) 16:16

А что, в обычное текстовое поле не сохраняется?
Мне казалось, что BLOB - это для картинок всяких, объектов каких-нибудь...
Для длинных текстов (больше 255 символов) в Access'е есть тип Memo. Как ты понимаешь, в Paradox'е - не знаю.

Что-то я тебе с другой стороны отвечать стала...
Давай так - что тебе хранить надо? Длинную строку?
Ты попробовал пример такой строки запихать в простое текстовое поле?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

DjSaSh
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 18.02.2004 (Ср) 17:41

Сообщение DjSaSh » 20.02.2004 (Пт) 16:52

Вот мне нуна хранить строку, но строчка заковыристая...
Строчка берется с вордовского документа, а там разные фичи - типа есть вставка разных символов, сами буквы возведены в верхний и нижний индекс... (типа там C^2 показал ^ потому, что не могу в квадрате показать) ну и такое подобное.... И все это нуна в базу данных запихнуть, а в ней парадоксовское поле является Blob(memo)

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 20.02.2004 (Пт) 20:03

хм... да, проблема понятна...

посмотри сюда
http://bbs.vbstreets.ru/viewtopic.php?t=676
там skiperski пример запостил... Использует AppendChunk и GetChunk для того, чтобы записать и достать данные
Он это делает через ADO, но в DAO точно так же...

Я пыталась достать символ из вордовского документа и записать его обратно - у меня не получилось :(. Я понимаю, что это юникод... Может, пример skiperski прокатит просто с открытием файла в бинарном виде...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList