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

Форум: MS ACCESS

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

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

 
 

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

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

тема: перекрестный запрос
 
 автор: kot_k_k   (23.11.2010 в 11:24)   личное сообщение
 
 

есть таблы
Описание, Сумма, Дата, Вид (логический)
нужно создать перекрестный запрос чтобы выводило


                         Дата (Вид=True) Дата (Вид=False)
Описание,            Сумма               Сумма


изгольнулся написал так

SELECT Dog_Oper.Opisanie, Sum(Dog_Oper.Summa) AS [Sum-Summa], Format([Data],"mmmm/yyyy") & [vid] AS Выражение1
FROM Dog_Oper
GROUP BY Dog_Oper.Opisanie, Format([Data],"mmmm/yyyy") & [vid];

на основании его создал перекрестный
но фигня получаетя в том что даты не располагаются как им положено
получается таким образом
Март 2010(true) Март 2010(Fasle) дальше нужен Апрель 2010(true) и т.д. а он тулит Март 2011(true) Март 2011(Fasle)
т.е. он правильно обрабатывает сортировку по текстовому полю - но как заставить его видеть одновременно и дату (для сортировки) и дата+логика (для создания 2-х колонок из одной)

или я не туда поперся

  Ответить  
 
 автор: kot_k_k   (23.11.2010 в 11:45)   личное сообщение
 
 

изгольнулся - воткнул таким образом на основании таблы - все гут,


TRANSFORM Sum(Dog_Oper.Summa) AS [Sum-Summa]
SELECT Dog_Oper.Opisanie, Dog_Oper.Nom, Sum(Dog_Oper.Summa) AS [Итоговое значение Summa]
FROM Dog_Oper
GROUP BY Dog_Oper.Opisanie, Dog_Oper.Nom
PIVOT Format([Data],"yyyy/mm") & [vid];

но заголовки колонок показывает 2010_11-1 2010_110 и т.д.
как можно в Имена столбцов засунуть Format([Data],"mmmm/yyyy") & [Vid] - в место Format([Data],"yyyy/mm") & [vid]? для отображения "Ноябрь 2010 Поставка", "Ноябрь 2010 Оплата" и т.д.

п.с. можно конечно оставить и так 2010_11 Поставка, 2010_11 Оплата - но чует седце ткнут пальцем и скажут напиши месяц буковками

  Ответить  
 
 автор: kot_k_k   (23.11.2010 в 13:49)   личное сообщение
 
 

блин - не понос так золотуха
объясните почему запрос перекрестный - работает, а как только в его источник воткну условия со ссылкой на форму - нет

Источник - работает прекрасно

SELECT Dog_Oper.Opisanie, Dog_Oper.Nom, Sum(Dog_Oper.Summa) AS [Sum-Summa], Dog_Oper.Data, Dog_Oper.Vid
FROM Dog_Oper
GROUP BY Dog_Oper.Opisanie, Dog_Oper.Nom, Dog_Oper.Data, Dog_Oper.Vid
HAVING (((Dog_Oper.Nom)=[Forms]![Форма4]![Kod_dog]));

еслина основани его сделать перекрестный

TRANSFORM Sum(Dog_oper_GR.[Sum-Summa]) AS [Sum-Sum-Summa]
SELECT Dog_oper_GR.Opisanie, Dog_oper_GR.Nom, Sum(Dog_oper_GR.[Sum-Summa]) AS [Итоговое значение Sum-Summa]
FROM Dog_oper_GR
GROUP BY Dog_oper_GR.Opisanie, Dog_oper_GR.Nom
PIVOT Format([Data],"yyyy/mm") & IIf([vid],"Оплата","Поставка");

не работает кричит [Forms]![Форма4]![Kod_dog] - не распознается ядром баз данных как допустимое имя поля или выражение
если HAVING (((Dog_Oper.Nom)=[Forms]![Форма4]![Kod_dog])) заменить на HAVING Dog_Oper.Nom=35 - нормально работает и не орет.

может я чего-то не знаю про перекрестные запросы

  Ответить  
 
 автор: Дядя Федор   (23.11.2010 в 14:19)   личное сообщение
 
 


[Forms]![Форма4]![Kod_dog]


Попробуй ее в глоб переменную

GLKOD=[Forms]![Форма4]![Kod_dog])

а в запросе используй функцию

Public Function FGLKOD()
FGLKOD=GLKOD
End Functin

типа
HAVING ((Dog_Oper.Nom)=FGLKOD()));

  Ответить  
 
 автор: kot_k_k   (23.11.2010 в 14:22)   личное сообщение
 
 

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

  Ответить  
 
 автор: Дядя Федор   (23.11.2010 в 14:30)   личное сообщение
 
 


как заголовки колонок сделать каждый раз новыми - типа как хочу, а не то что Акс выдает


это часто надо бывает...

  Ответить  
 
 автор: Анатолий (Киев)   (23.11.2010 в 14:59)   личное сообщение
 
 

Чтобы ссылка на форму паботала в перекрестном запросе, ее надо явно прописать в параметрах запроса (перекрестного или базового). Т.е., чтоб в режиме SQL текст запроса начинался с PARAMETERS [Forms]![Форма4]![Kod_dog]

И еще совет: HAVING применяется в случае, если надо наложить условие на результат статистической функции. В вашем случае можно заменить его на WHERE. Теоретически будет быстее работать.

  Ответить  
 
 автор: kot_k_k   (23.11.2010 в 16:08)   личное сообщение
 
 

спасибо огромное, плохо если не значешь да еще и забыл.

  Ответить  
 
 автор: Дядя Федор   (23.11.2010 в 14:25)   личное сообщение
 
 

У меня 11_11_2010 и т.п. преобразуется сл.ф-ей

Public Function Nd_mes(s As String) As String
Dim v As Date
v = Replace(s, "_", ".")
Nd_mes = Day(v) & vbCrLf & WeekdayName(Weekday(v, vbMonday), True, vbMonday)

End Function

в OPEN

Me("Head" & i).ControlSource = "='" & Nd_mes(rs.Fields(i - 1).Name) & "'"

Проверка - Debug.Print Nd_mes("31_08_2010") выводит число и день недели. Ты можешь что-нить подобное загнать в форму или отчет

  Ответить  
 
 автор: Дядя Федор   (23.11.2010 в 14:44)   личное сообщение
 
 

Вот еще полезная техологическая функция когда много полей

Public Sub repname()
'Меняет глупые наименования полей типа Поле261 на умные типа "dat1"
         DoCmd.OpenReport "Rep1", acViewDesign, , , acHidden"
       
         Dim Ctl As Control
         Dim Ctl1 As Control
         Dim rpt As Report
         
         With Reports("RepPlanPredjavl_tbl")
          For Each Ctl1 In Reports("Rep1").Section("ÏПримечание отчета").Controls
            Debug.Print Ctl1.Name
            For i = 261 To 325
              If Ctl1.Name = "Поле" & i Then
                Ctl1.Name = "SCol" & (i - 260) ' SCol - нужное (контекстно-понятное) имя
                Debug.Print Ctl1.Name
              End If
            Next i
          Next
         End With
         DoCmd.Close acReport, "Rep1", acSaveYes
End Sub

  Ответить  
 
 автор: kot_k_k   (23.11.2010 в 15:07)   личное сообщение
 
 

долго я ... судьбу вот наковырял, проверил работат, но обработку нужно вставить месяца

- не думаю что открыл америку - но новичкам и таким как я (с 5-е на 10-е) пользительно знать


Sub Dog_oper_pere_new()
Dim dbs As DAO.Database
Dim qdf As QueryDef
Dim ff As Field
Dim prp As Property

Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Dog_Oper_pere")
        For Each ff In qdf.Fields
            Select Case ff.Name
                Case "Итоговое значение S_Summa"            ' эти два поля в отчете заголовки строк
                Case "opisanie"
                Case Else                                                                ' а это поля которые динамические
                    Set prp = ff.CreateProperty("Caption", dbText, "СЮДА воткнуть обработку FF.NAME - для получения красивого названия поля")          ' создали свойство 
                    ff.Properties.Append prp              ' добавили его 
                    ff.Properties.Refresh                    ' обновили коллекцию
              End Select
        Next
End Sub

  Ответить  
 
 автор: kot_k_k   (24.11.2010 в 14:57)   личное сообщение
 
 

продолжу - дабы не плодить тему

1. как кодом установить ширину столбца "по ширине данных"??
нашел вот такое -
CreateProperty("ColumnWidth", dbInteger, -2)
но оно не реагирует на него

2. как кодом закрепить первый столбец??

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