Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: запрос в VB имея таблицы в SQL Server
 
 автор: АлаяЗаря   (28.04.2010 в 22:14)   личное сообщение
 
 

Доброго времени суток =) и все у меня было хорошо пока не перешел я на SQL Server =)

Сперва отказались работать рекордсеты, вроде как пыхтя в хелпе разобрался, подключился через ОДБС - работает - УРА!

и вот дашел до запросов. Как написать запрос в SQL знаю, как в VB знаю, а вот как через VB в SQL не знаю. =(

есть не один подобный запрос:


Function paswd()
    Dim strSelect As String
    Dim strFrom As String
    Dim strWhere As String
    Dim qqq As String
    Dim www As String
    Dim strsql As String
    
    strSelect = "SELECT "
    strSelect = strSelect & "pas.id, pas.idparol, pas.iduser, pas.idrole, pas.idnaim"
    strFrom = " FROM pas"
    strWhere = " WHERE true"

If Nz([Form_Avtorizaciy].[Пароль], 0) > 0 Then qqq = [Form_Avtorizaciy].[Пароль]
If Nz([Form_Avtorizaciy].[Логин], 0) > 0 Then www = [Form_Avtorizaciy].[Логин]

If Nz(qqq, 0) > 0 Then strWhere = strWhere & " and pas.idparol = " & """" & qqq & """"
If Nz(www, 0) > 0 Then strWhere = strWhere & " and pas.iduser = " & """" & www & """"
 
    strsql = strSelect & strFrom & strWhere & ";"
    CurrentDb.QueryDefs("password").SQL = strsql
    paswd = strsql
End Function


недавно кстате на форуме его обсуждали... и что... не работает... как только не поключался...

что посоветуйте.... блин... обкатка вот вот, а у меня все отчета по запросам... это вообще жопа будет....

  Ответить  
 
 автор: АлаяЗаря   (29.04.2010 в 02:19)   личное сообщение
 
 

Жалуется на строчку

CurrentDb.QueryDefs("password").SQL = strsql

оно и понятно - подключения то нет...
пробывал делать так

dim dbs as Database
.......
dbs = opendatabase ("myodbc",что что там, "ODBC;")
dbs.QueryDefs("password").SQL = strsql

все равно ругается... =(
почита почитал сделал так

dim dbs as connection
dbs = OpenConnection("myodbc",  dbDriverNoPrompt, , "ODBC;DATABASE=myDB;")

толку ноль....

Может кто знает как вообще запрос написать? простой....

типа Select * from mytable через VB естественно для SQL =)

  Ответить  
 
 автор: АлаяЗаря   (29.04.2010 в 03:15)   личное сообщение
 
 

может я какие библиотете нре полключил? подскажете?

  Ответить  
 
 автор: osmor   (29.04.2010 в 08:06)   личное сообщение
 
 

у вас adp или mdb?

  Ответить  
 
 автор: АлаяЗаря   (29.04.2010 в 10:12)   личное сообщение
 
 

adp

Ошибка в основном "Операция не поддерживается для объектов этого типа"
или
"Элемент не обнаружен в данном семействе" вот что написал


Function paswd1()
    Dim strSelect As String
    Dim strFrom As String
    Dim strWhere As String
    Dim qqq As String
    Dim www As String
    Dim strsql As String
    Dim dbs As Database
    Dim qdf As QueryDef
    Dim con As Connection
    Dim wrkODBC As Workspace
        
    strSelect = "SELECT "
    strSelect = strSelect & "pas.id, pas.idparol, pas.iduser, pas.idrole, pas.idnaim"
    strFrom = " FROM pas"
    strWhere = " WHERE true"

If Nz([Form_Avtorizaciy].[Пароль], 0) > 0 Then qqq = [Form_Avtorizaciy].[Пароль]
If Nz([Form_Avtorizaciy].[Логин], 0) > 0 Then www = [Form_Avtorizaciy].[Логин]

If Nz(qqq, 0) > 0 Then strWhere = strWhere & " and pas.idparol = " & """" & qqq & """"
If Nz(www, 0) > 0 Then strWhere = strWhere & " and pas.iduser = " & """" & www & """"
    
Set wrkODBC = CreateWorkspace("NewODBCWorkspace", "admin", "", dbUseODBC)
Set con = wrkODBC.OpenConnection("apexodbc", dbDriverNoPrompt, , "ODBC;DATABASE=apexDB;")
     
     strsql = strSelect & strFrom & strWhere & ";"
     con.QueryDefs("password").SQL = strsql

con.Close
wrkODBC.Close

End Function


Я просто тупо не могу понять как мне написать запрос....

  Ответить  
 
 автор: Мюллер   (29.04.2010 в 10:44)   личное сообщение
 
 

В adp нужно использовать конструкцию CurrentProject, а не CurrentDB


Function paswd()
Dim strSelect As String
Dim strFrom As String
Dim strWhere As String
Dim qqq As String
Dim www As String
Dim strsql As String

strSelect = "SELECT "
strSelect = strSelect & "pas.id, pas.idparol, pas.iduser, pas.idrole, pas.idnaim"
strFrom = " FROM pas"
strWhere = " WHERE true"

If Nz([Form_Avtorizaciy].[Пароль], 0) > 0 Then qqq = [Form_Avtorizaciy].[Пароль]
If Nz([Form_Avtorizaciy].[Логин], 0) > 0 Then www = [Form_Avtorizaciy].[Логин]

If Nz(qqq, 0) > 0 Then strWhere = strWhere & " and pas.idparol = " & """" & qqq & """"
If Nz(www, 0) > 0 Then strWhere = strWhere & " and pas.iduser = " & """" & www & """"

strsql = strSelect & strFrom & strWhere & ";"
CurrentDb.QueryDefs("password").SQL = strsql
paswd = strsql
End Function



Не самое лучшее решение. Как вы думаете, что произойдет, если в поле логин я наберу что-то вроде Миша DROP TABLE pas /* Ну плюс поиграться со скобками и кавычками
Конструкцию DROP TABLE можно заменить на delete.
С SQLсервером будьте осторожней. Да и опять же все запросы желательно реализовать используя возможности самого SQLSERVER ( см. stored procedure, function )

  Ответить  
 
 автор: АлаяЗаря   (29.04.2010 в 15:12)   личное сообщение
 
 

Мюллер, а можно пример на данном запросе с использованием CurrentProject? если не сложно конечно... =) буду век должен =)

  Ответить  
 
 автор: osmor   (29.04.2010 в 11:20)   личное сообщение
 
 

ох...
Вам совершенно не нужно никаких ODBC
нужно вместо dao использовать ADO
Кроме того при работе с ADP замена текста сохраненного запроса уже не является штатной операцией, т.к. для этого нужно всем дать права на изменение сохраненных прцедур, а это не есть хорошо.

  Ответить  
 
 автор: АлаяЗаря   (29.04.2010 в 15:04)   личное сообщение
 
 

Осмор, а можно пример написания подобной функции на ADO?

Я понимаю что я не прав с DAO но реализацию в ADO не знаю, хелпу конечно почитал, но как все это изобразить в одной функции не знаю....

И еще, я привел пример простого запроса, он в будущем может и не будет существовать... Основная проблема в том, что все отчеты печатаются из динамически собранного запроса, я хотел разобрать и уже переписывать их...

  Ответить  
 
 автор: osmor   (29.04.2010 в 16:03)   личное сообщение
 
 

вообще конечно лучше что-то почитать про SQL сервер, сохраненные процедуры и т.п.
а если в лоб, но ваш код будет будет выглядеть как-то так (возможны ошибки, потому что пишу прямо сюда без проверки
все строки добавлененные мной отмечены курсивом

Function paswd()
    Dim strSelect As String
    Dim strFrom As String
    Dim strWhere As String
    Dim qqq As String
    Dim www As String
    Dim strsql As String

    dim rst as adodb.recordset
       dim fld as adodb.field
         


    strSelect = "SELECT "
    strSelect = strSelect & "pas.id, pas.idparol, pas.iduser, pas.idrole, pas.idnaim"
    strFrom = " FROM pas"
    strWhere = " WHERE true"

If Nz([Form_Avtorizaciy].[Пароль], 0) > 0 Then qqq = [Form_Avtorizaciy].[Пароль]
If Nz([Form_Avtorizaciy].[Логин], 0) > 0 Then www = [Form_Avtorizaciy].[Логин]

If Nz(qqq, 0) > 0 Then strWhere = strWhere & " and pas.idparol = " & """" & qqq & """"
If Nz(www, 0) > 0 Then strWhere = strWhere & " and pas.iduser = " & """" & www & """"

    strsql = strSelect & strFrom & strWhere & ";"
     set rst = new adodb.recordset
     with rst
           .open strsql, currentproject.connection
           if .eof and .eob then
                       debug.print "нет записей с такими именем + пароль"
           else
                   for each fld in  .fields
                       debug.print  fld.name, fld.value
                  next
           end if
     end with
   rst.close
  set rst = nothing 

End Function


ну и конечно на замечание Мюллера обратите внимание.

  Ответить  
 
 автор: АлаяЗаря   (29.04.2010 в 19:43)   личное сообщение
 
 

Осмор, спасибо огромное... Что то подобное научился сегодня на работе...

Только вот вопрос, мне этот запрос нужно распечатать... Раньше я генерил физичекски лежащий запрос и из него передавал данные в эксель... А сейчас как? физически то его нигде нет... Или пока он создан импортировать данные... хм... нужно попробывать... =)

  Ответить  
 
 автор: АлаяЗаря   (30.04.2010 в 01:25)   личное сообщение
 
 

о =) разобралсо =) теперь моя душенька спокойна =) можно ложиться спать =) еще раз спасибо ! вы очень помогли! ну и вопрос на последок, может я и неправильно разобралсо =)

я печатаю так

xlsheet.Range("A2").CopyFromRecordset rst

вот, а наименование полей не печатаются... как сделать хорошо? =)


а все разобрался =)

Dim n As Integer
For n = 0 To rst.Fields.Count - 1
xlsheet.Cells(1, n + 1).Value = rst.Fields(n).Name
Next

  Ответить  
 
 автор: АлаяЗаря   (30.04.2010 в 11:42)   личное сообщение
 
 

Set dbs = OpenDatabase("apexodbc", dbDriverNoPrompt, False, "ODBC;")
Set wrkODBC = CreateWorkspace("ODBCWorkspace", "123", "123", dbUseODBC)
Set con = wrkODBC.OpenConnection("apexodbc", dbDriverNoPrompt, False, "ODBC;DATABASE=apexDB;")
Set rst = con.OpenRecordset("dbo.tab_codeaccess", dbOpenDynaset)
rst.AddNew

не может добавить запись, пишет БД или объект открыты в режиме чтения, хотя вхожу под админов, права все сделал вроде...

  Ответить  
 
 автор: osmor   (30.04.2010 в 12:11)   личное сообщение
 
 

зачем вы откываете дополнительное соединение да еще по odbc? в ADP этого делать не нужно, у вас уже есть DAODB.connection, он храниться в свойстве Connection объекта CurrentProject используйте его.
Еще при работе с adp ЗАБУДЬТЕ про DAO ваша икона ADODB

dim rst as adodb.recordset
set rst = new adodb.recordset
rst.open "select * from dbo.tab_codeaccess", currentproject.connection, adOpenDynamic,adLockOptimistic
rst.addew
.......
и т.д.


Кроме того может быть можно добавить запись посто запросом на добаление не октрывая рекордсет?

 currentproject.connection.execute "Insert into ......"

опять же если вы открываете рекордсет только для добавления наверное нет смысла брать все существующие записи, можно просто открыть пустой рекордсет, в случае с MDB, возможно, и не так важно, но с SLQ server....

rst.open "select * from dbo.tab_codeaccess where false", currentproject.connection, adOpenDynamic,adLockOptimistic

  Ответить  
 
 автор: АлаяЗаря   (30.04.2010 в 13:49)   личное сообщение
 
 

И еще один вопрос чтобы не плодить темы...

Копирую рекордсет в ексель вот таким кодом

xlsheet.Range("A2").CopyFromRecordset rst

только проблема в том что таблица содержит ссылки на другие таблицы (по ключу) и вместо текстовых значений печатаются их id... Как быть?

то есть
Таблица город Таблица область

идГород идОбласть
Наименование Наименование
идОбласть

печатаю через рекордсет таблицу город получается

1 Москва 1
а должно
1 Москва Московская область

  Ответить  
 
 автор: osmor   (30.04.2010 в 14:31)   личное сообщение
 
 

нужно создать запрос ну ли строку SQL в котором Join 'м объединить нужные таблицы и потом по этому запросу или строке SQL открывать recordset

Например 2 таблицы:
Клиенты
КодКлиента
Название
Адрес
....
Заказы
КодЗаказа
КодКлиента
ДатаЗаказа
НомерЗаказа
....


нужно вывести заказы с указанием фио и адреса клиента
запрос будет таким:


Select Заказы.*, Клиенты.Название, Клиенты.Адрес
From Заказы INNER JOIN Клиенты ON заказы.кодклиента = клиенты.кодКлиента

  Ответить  
 
 автор: АлаяЗаря   (30.04.2010 в 15:02)   личное сообщение
 
 

я так и делаю... вот весь код


    str = "SELECT dbo.tabl_codeaccess.idaccess, dbo.tabl_codeaccess.Nameaccess, dbo.tabl_codeaccess.gorod FROM dbo.tabl_codeaccess INNER JOIN dbo.Gorod ON dbo.tabl_codeaccess.gorod = dbo.Gorod.Kod"

Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset

Set xlApp = CreateObject("excel.Application")
Set xlbook = xlApp.Workbooks.Add
Set xlsheet = xlbook.Worksheets.Add

rst.Open str, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

xlsheet.Range("A2").CopyFromRecordset rst
xlApp.Visible = True

Set xlsheet = Nothing
Set xlbook = Nothing


а вот так заработало

str = "SELECT * FROM dbo.tabl_codeaccess INNER JOIN dbo.Gorod ON dbo.tabl_codeaccess.gorod = dbo.Gorod.Kod"

почему так?

у меня просто через * не получиться, т.к. беру значения и из других таблиц

вобщем, нужно связи расставлять... схему нужно сделать, аксесовская удалилась я так понял =)

Спасибо осмор... Ты мне подарил счастливые выходные =)))

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList