Вопрос про два запроса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alex shestov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 25.04.2005 (Пн) 12:01

Вопрос про два запроса

Сообщение alex shestov » 29.08.2005 (Пн) 15:16

Сорри перед админами но так и не придумал как грамотно назавать тему.

Суть проблемы:
Есть форма Access в которую выводяться данные. В одно из полей нужно подгрузить значение, которое считается через два запроса. Но т.к. через макрос - Задать значение этого сделать не получается (или я не знаю как правильно сделать) я пишу следующий код:

Код: Выделить всё

Private Sub EmitNameCondin_AfterUpdate()
Dim rs, pt, pt1 As DAO.Recordset
Dim strSql, r1, ptSql, pSql, p1 As String

r1 = CStr([Forms]![PayTabInfo]![EmitNameCondin])
p1 = CStr([Forms]![MainForm]![TodayDate])

strSql = ("SELECT Securities.EmitNameCondin, Securities.Nominal, Securities.DateVipusk, Securities.DateEnd, " _
        & "Securities.CurNominal, Securities.NumberReg FROM Securities WHERE (((Securities.EmitNameCondin)='" & [r1] & "'));")
       
Set rs = CurrentDb.OpenRecordset(strSql)

If rs.Fields("Nominal") <> 0 Then
Forms!PayTabInfo!Nominal = rs.Fields("Nominal")
Forms!PayTabInfo!SDate = rs.Fields("DateVipusk")
Forms!PayTabInfo!EDate = rs.Fields("DateEnd")
Forms!PayTabInfo!Cur = rs.Fields("CurNominal")
Forms!PayTabInfo!NumberReg = rs.Fields("NumberReg")
Forms!PayTabInfo!DateR = Forms!PayTabInfo!EDate - Forms!PayTabInfo!SDate
End If

pSql = ("SELECT PayTab.EmitNameCondin, PayTab.Pay_Date, PayTab.Pogash_Value " _
        & "FROM PayTab GROUP BY PayTab.EmitNameCondin, PayTab.Pay_Date, PayTab.Pogash_Value " _
        & "HAVING (((PayTab.EmitNameCondin)='" & [r1] & "') AND ((PayTab.Pay_Date)<= CVDate('" & [p1] & "')));")

Set pt1 = CurrentDb.OpenRecordset(pSql)

ptSql = ("SELECT pt1.Fields(EmitNameCondin), Max(pt1.Fields(Pay_Date) AS [Max-Pay_Date], " _
        & "Sum(pt1.Fields(Pogash_Value) AS [SumPogash_Value], Securities.Nominal, Securities.Nominal-[Sum-Pogash_Value] AS Dlt " _
        & "FROM Securities INNER JOIN pt1 ON Securities.EmitNameCondin = pt1.Fields(EmitNameCondin); " _
        & "GROUP BY pt1.Fields(EmitNameCondin), Securities.Nominal;")
       
Set pt = CurrentDb.OpenRecordset(ptSql)

Forms!PayTabInfo!TNominal = pt.Fields("Dlt")

End Sub

pSql - это порвый запрос где идет выборка и группировка по полям.
ptSql - тот запрос в котором и делается расчетное значение. Построение он над первым запросом. Избавиться от первого не получается.

Так вот: подскажите как заставить всю эту конструкцию работать? То что я изобразил в "ptSql " это уже миллиоа попытка все запустить, но безрезультатная.
pt1.Fields(EmitNameCondin) - вот с этой конструкцией как я понимаю что-то нет так. Но как она должна быть написана правильно не знаю. :( Вот и прошу помощи.

Спасибо.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.08.2005 (Пн) 15:28

Это что за бред :?:

Код: Выделить всё
ptSql = ("SELECT pt1.Fields(EmitNameCondin), Max(pt1.Fields(Pay_Date) AS [Max-Pay_Date], " _
        & "Sum(pt1.Fields(Pogash_Value) AS [SumPogash_Value], Securities.Nominal, Securities.Nominal-[Sum-Pogash_Value] AS Dlt " _
        & "FROM Securities INNER JOIN pt1 ON Securities.EmitNameCondin = pt1.Fields(EmitNameCondin); " _
        & "GROUP BY pt1.Fields(EmitNameCondin), Securities.Nominal;")


SQL в перемежку с полями другого рекордсета :!:
Так не может и не будет никогда работать. Все запросы в базе оперируют только объектами самой базы, но никак не объектами, созданными в программе на стороне клиента.
Нужно поставить нормально задачу. Что тебе надо вычислить и какие данные и в каких таблицах лежат, тогда и найдется для тебя решение.
Выкладывай сюда свои таблицы и опиши ясно , что в итоге ты хочешь из них получить и при каких условиях.

alex shestov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 25.04.2005 (Пн) 12:01

Сообщение alex shestov » 29.08.2005 (Пн) 15:34

Konst_One писал(а):Это что за бред :?:

Код: Выделить всё
ptSql = ("SELECT pt1.Fields(EmitNameCondin), Max(pt1.Fields(Pay_Date) AS [Max-Pay_Date], " _
        & "Sum(pt1.Fields(Pogash_Value) AS [SumPogash_Value], Securities.Nominal, Securities.Nominal-[Sum-Pogash_Value] AS Dlt " _
        & "FROM Securities INNER JOIN pt1 ON Securities.EmitNameCondin = pt1.Fields(EmitNameCondin); " _
        & "GROUP BY pt1.Fields(EmitNameCondin), Securities.Nominal;")


SQL в перемежку с полями другого рекордсета :!:
Так не может и не будет никогда работать. Все запросы в базе оперируют только объектами самой базы, но никак не объектами, созданными в программе на стороне клиента.
Нужно поставить нормально задачу. Что тебе надо вычислить и какие данные и в каких таблицах лежат, тогда и найдется для тебя решение.
Выкладывай сюда свои таблицы и опиши ясно , что в итоге ты хочешь из них получить и при каких условиях.


Да я знаю что это бред - я об этом написал, что это миллионная редакция.
Код: Выделить всё
pSql = ("SELECT PayTab.EmitNameCondin, PayTab.Pay_Date, PayTab.Pogash_Value " _
        & "FROM PayTab GROUP BY PayTab.EmitNameCondin, PayTab.Pay_Date, PayTab.Pogash_Value " _
        & "HAVING (((PayTab.EmitNameCondin)='" & [r1] & "') AND ((PayTab.Pay_Date)<= CVDate('" & [p1] & "')));")

SET pt1 = CurrentDb.OpenRecordset(pSql)

Это вот первая выборка. В ней происходит выбор по трем полям. Тащит Эмитента, номинал по акции и дату погашения. Условие - эмитент равен тому что задан в форме а дата погашения меньше или равна текущей.

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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.08.2005 (Пн) 15:37

Может тебе это надо :?: (переводы строк ты уж сам расставь как надо)

Код: Выделить всё
SQL="SELECT
pt1.EmitNameCondin,
Max(pt1.Pay_Date AS [Max-Pay_Date],
Sum(pt1.Pogash_Value AS [SumPogash_Value],
Securities.Nominal,
Securities.Nominal-[Sum-Pogash_Value] AS Dlt
FROM
    Securities INNER JOIN
    (SELECT PayTab.EmitNameCondin,
                 PayTab.Pay_Date,
                 PayTab.Pogash_Value
     FROM PayTab
     GROUP BY PayTab.EmitNameCondin,
                     PayTab.Pay_Date,
                     PayTab.Pogash_Value
     HAVING
        PayTab.EmitNameCondin='" & [r1] & "' AND
        PayTab.Pay_Date<= CVDate('" & [p1] & "')
    ) pt1 ON Securities.EmitNameCondin =pt1.EmitNameCondin
GROUP BY
    pt1.EmitNameCondin, Securities.Nominal"

alex shestov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 25.04.2005 (Пн) 12:01

Сообщение alex shestov » 29.08.2005 (Пн) 15:39

Konst_One писал(а):Может тебе это надо :?: (переводы строк ты уж сам расставь как надо)

Код: Выделить всё
SQL="SELECT
pt1.EmitNameCondin,
Max(pt1.Pay_Date AS [Max-Pay_Date],
Sum(pt1.Pogash_Value AS [SumPogash_Value],
Securities.Nominal,
Securities.Nominal-[Sum-Pogash_Value] AS Dlt
FROM
    Securities INNER JOIN
    (SELECT PayTab.EmitNameCondin,
                 PayTab.Pay_Date,
                 PayTab.Pogash_Value
     FROM PayTab
     GROUP BY PayTab.EmitNameCondin,
                     PayTab.Pay_Date,
                     PayTab.Pogash_Value
     HAVING
        PayTab.EmitNameCondin='" & [r1] & "' AND
        PayTab.Pay_Date<= CVDate('" & [p1] & "')
    ) pt1 ON Securities.EmitNameCondin =pt1.EmitNameCondin
GROUP BY
    pt1.EmitNameCondin, Securities.Nominal"


Сейчас попробую. :wink:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.08.2005 (Пн) 15:42

я там кое-где забыл закрывающие скобки для MAX и SUM

alex shestov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 25.04.2005 (Пн) 12:01

Сообщение alex shestov » 29.08.2005 (Пн) 15:56

Konst_One писал(а):я там кое-где забыл закрывающие скобки для MAX и SUM


Пишет что слишком мало параметров. Нужно 1

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.08.2005 (Пн) 17:14

возьми этот запрос и выполни в access:

Код: Выделить всё
SELECT
pt1.EmitNameCondin,
Max(pt1.Pay_Date) AS [Max-Pay_Date],
Sum(pt1.Pogash_Value) AS [SumPogash_Value],
Securities.Nominal,
Securities.Nominal-Sum(pt1.Pogash_Value) AS Dlt
FROM
    Securities INNER JOIN
    (SELECT PayTab.EmitNameCondin,
                 PayTab.Pay_Date,
                 PayTab.Pogash_Value
     FROM PayTab
     GROUP BY PayTab.EmitNameCondin,
                     PayTab.Pay_Date,
                     PayTab.Pogash_Value
     HAVING
        PayTab.EmitNameCondin=? AND
        PayTab.Pay_Date<= CVDate(?)
    ) pt1 ON Securities.EmitNameCondin =pt1.EmitNameCondin
GROUP BY
    pt1.EmitNameCondin, Securities.Nominal


первый параметр - это твой r1
второй - p1

alex shestov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 25.04.2005 (Пн) 12:01

Сообщение alex shestov » 30.08.2005 (Вт) 8:32

Перевел в запрос, там все работало без проблем, стал смотреть в чем дело и почему у меня не пашет в VBA и вот как выглядел запрос в режиме SQL
Код: Выделить всё
ptSql = ("SELECT pt1.EmitNameCondin, Max(pt1.Pay_Date) AS [Max-Pay_Date], Sum(pt1.Pogash_Value) AS SumPogash_Value, " _
        & "Securities.Nominal, Securities.Nominal-Sum(pt1.Pogash_Value) AS Dlt " _
    & "FROM Securities INNER JOIN " _
        & "[SELECT PayTab.EmitNameCondin, " _
                 & "PayTab.Pay_Date, " _
                 & "PayTab.Pogash_Value " _
    & "FROM PayTab " _
    & "GROUP BY PayTab.EmitNameCondin, " _
                 & "PayTab.Pay_Date, " _
                 & "PayTab.Pogash_Value  " _
    & "HAVING " _
        & "(((PayTab.EmitNameCondin)='" & [r1] & "') AND " _
        & "((PayTab.Pay_Date)<= CVDate('" & [p1] & "')))]. AS pt1 ON Securities.EmitNameCondin = pt1.EmitNameCondin " _
    & "GROUP BY pt1.EmitNameCondin, Securities.Nominal;")

Т.е. обязательны были квадратные скобки, после их закрытия точка и AS. После этого все заработало!
Спасибо большое за помощь! :D


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 54

    TopList