| |
|
|
| | Доброго времени суток =) и все у меня было хорошо пока не перешел я на 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
|
недавно кстате на форуме его обсуждали... и что... не работает... как только не поключался...
что посоветуйте.... блин... обкатка вот вот, а у меня все отчета по запросам... это вообще жопа будет.... | |
| |
| |
| |
|
|
| | Жалуется на строчку
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 =) | |
| |
| |
| |
|
|
| | может я какие библиотете нре полключил? подскажете? | |
| |
| |
|
|
| |
|
|
| | 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
|
Я просто тупо не могу понять как мне написать запрос.... | |
| |
| |
| |
|
|
| | В 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 ) | |
| |
| |
| |
|
|
| | Мюллер, а можно пример на данном запросе с использованием CurrentProject? если не сложно конечно... =) буду век должен =) | |
| |
| |
| |
|
|
| | ох...
Вам совершенно не нужно никаких ODBC
нужно вместо dao использовать ADO
Кроме того при работе с ADP замена текста сохраненного запроса уже не является штатной операцией, т.к. для этого нужно всем дать права на изменение сохраненных прцедур, а это не есть хорошо. | |
| |
| |
| |
|
|
| | Осмор, а можно пример написания подобной функции на ADO?
Я понимаю что я не прав с DAO но реализацию в ADO не знаю, хелпу конечно почитал, но как все это изобразить в одной функции не знаю....
И еще, я привел пример простого запроса, он в будущем может и не будет существовать... Основная проблема в том, что все отчеты печатаются из динамически собранного запроса, я хотел разобрать и уже переписывать их... | |
| |
| |
| |
|
|
| | вообще конечно лучше что-то почитать про 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
|
ну и конечно на замечание Мюллера обратите внимание. | |
| |
| |
| |
|
|
| | Осмор, спасибо огромное... Что то подобное научился сегодня на работе...
Только вот вопрос, мне этот запрос нужно распечатать... Раньше я генерил физичекски лежащий запрос и из него передавал данные в эксель... А сейчас как? физически то его нигде нет... Или пока он создан импортировать данные... хм... нужно попробывать... =) | |
| |
| |
| |
|
|
| | о =) разобралсо =) теперь моя душенька спокойна =) можно ложиться спать =) еще раз спасибо ! вы очень помогли! ну и вопрос на последок, может я и неправильно разобралсо =)
я печатаю так
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 | |
| |
| |
| |
|
|
| | 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
не может добавить запись, пишет БД или объект открыты в режиме чтения, хотя вхожу под админов, права все сделал вроде... | |
| |
| |
| |
|
|
| | зачем вы откываете дополнительное соединение да еще по 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
|
| |
| |
| |
| |
|
|
| | И еще один вопрос чтобы не плодить темы...
Копирую рекордсет в ексель вот таким кодом
xlsheet.Range("A2").CopyFromRecordset rst
только проблема в том что таблица содержит ссылки на другие таблицы (по ключу) и вместо текстовых значений печатаются их id... Как быть?
то есть
Таблица город Таблица область
идГород идОбласть
Наименование Наименование
идОбласть
печатаю через рекордсет таблицу город получается
1 Москва 1
а должно
1 Москва Московская область | |
| |
| |
| |
|
|
| | нужно создать запрос ну ли строку SQL в котором Join 'м объединить нужные таблицы и потом по этому запросу или строке SQL открывать recordset
Например 2 таблицы:
Клиенты
КодКлиента
Название
Адрес
....
Заказы
КодЗаказа
КодКлиента
ДатаЗаказа
НомерЗаказа
....
нужно вывести заказы с указанием фио и адреса клиента
запрос будет таким:
Select Заказы.*, Клиенты.Название, Клиенты.Адрес
From Заказы INNER JOIN Клиенты ON заказы.кодклиента = клиенты.кодКлиента
|
| |
| |
| |
| |
|
|
| | я так и делаю... вот весь код
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"
|
почему так?
у меня просто через * не получиться, т.к. беру значения и из других таблиц
вобщем, нужно связи расставлять... схему нужно сделать, аксесовская удалилась я так понял =)
Спасибо осмор... Ты мне подарил счастливые выходные =))) | |
| |
| |