Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2015, 16:57   #1
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию Выборка непрерывного диапазона

Здравствуйте!

Есть вот такой запрос
Код:
SELECT First(BSO.[Document N]) AS [First-Document N], Last(BSO.[Document N]) AS [Last-Document N], Count(BSO.[Document N]) AS [Count-Document N], BSO.Status, BSO.Issued
FROM BSO
GROUP BY BSO.Status, BSO.Issued
HAVING (((BSO.Status)="new"))
ORDER BY First(BSO.[Document N]);
Но он работает немного неправильно и я не знаю как исправить. В результате запроса получаем строку с начальным значением диапазона, конечным и количество записей в нем. Вроде все красиво, но реально в получаемом диапазоне есть разрыв, т.е. он не непрерывный. Вместо одной строки должно быть три.
Например, есть числа 1235679 - должно получиться три строки
First Last Count
1 3 3
5 7 3
9 9 1
А получается
1 9 7

Понимаю, что на словах дурдом, поэтому прикладываю базу с таблицей и запросомDatabase11.rar
yulia вне форума Ответить с цитированием
Старый 30.12.2015, 18:22   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

что-то результат вашего запроса не соответствует описанию Попробуйте перефразировать что должно в результате получиться.
Изображения
Тип файла: jpg att.jpg (85.4 Кб, 57 просмотров)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 30.12.2015, 18:32   #3
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
что-то результат вашего запроса не соответствует описанию Попробуйте перефразировать что должно в результате получиться.
Например берем первую строку в результате запроса
First Last Count Status Issued
025001 025100 72 new 13

Между 025001 и 025100 есть прерывание диапазона. Например по таблице, если сделать фильтр по Status = new и Issued = 13, видно, что идет 025001, 025002, а потом 025029 и 025032,...
Т.е. надо чтобы это учитывалось и получилось
First Last Count Status Issued
025001 025002 2 new 13
025029 025029 1 new 13
025032 025100 69 new 13

Я понимаю, что в запросе написано сгруппировать по Issued и найти там первую и последнюю запись, поэтому оно так и выводит, но как сделать правильно не приходит в голову
yulia вне форума Ответить с цитированием
Старый 30.12.2015, 18:59   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

может как-то VBA привязать? Побрейнштормим?
1. делаем запрос с числовым полем из "Document N"
2. в цикле идем по строкам таблицы. запомнили первое значение числа. Если разница следующего с предыдущим = 1 - Count + 1 иначе : в таблицу внесли первое число. последнее, COunt. Обнулили Count, Запомнили новое "первое" число.
Критика?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 30.12.2015, 19:40   #5
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
может как-то VBA привязать? Побрейнштормим?
1. делаем запрос с числовым полем из "Document N"
2. в цикле идем по строкам таблицы. запомнили первое значение числа. Если разница следующего с предыдущим = 1 - Count + 1 иначе : в таблицу внесли первое число. последнее, COunt. Обнулили Count, Запомнили новое "первое" число.
Критика?
да, я думала о таком, не знаю как сюда привязать группировку по Issued. Т.е. сначала делаем выборку Document N, WHERE Status=new, а потом выделяем диапазоны...хотя.. вот сейчас написала и мысль пришла )

Осталось разобраться как в цикле пройти по строкам результата запроса )

Попробуем реализовать, пока вариантов больше нет ) Спасибо!
yulia вне форума Ответить с цитированием
Старый 30.12.2015, 19:57   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Проверьте правильно ли макрос cmth в debug выводит
Вложения
Тип файла: rar 1.rar (25.7 Кб, 7 просмотров)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 30.12.2015, 20:24   #7
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Проверьте правильно ли макрос cmth в debug выводит
да, спасибо большое! Я бы еще долго мучилась с ним )

А чтобы результат в виде таблицы оформить, надо INSERT добавить на основе этих переменных или есть другой способ?

Последний раз редактировалось yulia; 30.12.2015 в 20:47.
yulia вне форума Ответить с цитированием
Старый 30.12.2015, 21:01   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Да, думаю что INSERT'oм в какую-то таблицу можна. Только сначала удалять все данные из нее
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 30.12.2015, 21:20   #9
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Да, думаю что INSERT'oм в какую-то таблицу можна. Только сначала удалять все данные из нее
да, так и сделала )

Оказалось, что не учитывается последний блок - там где Issued = 15. Разбираюсь... Понимаю, что не делает последний виток цикла, но вот почему не понимаю ((

Вам огромное спасибо!

Последний раз редактировалось yulia; 30.12.2015 в 22:15.
yulia вне форума Ответить с цитированием
Старый 31.12.2015, 09:41   #10
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Код:
Option Compare Database
Option Explicit

Public Function IsTable(NameTable As String) As Boolean
   Dim i As Integer
   IsTable = False
   ' поиск в списке таблиц NameTable
   For i = 0 To CurrentDb.TableDefs.Count - 1
      If CurrentDb.TableDefs(i).Name = NameTable Then IsTable = True
   Next i
End Function

Sub cmth()
    Dim db As Database
    Dim rs As Recordset
    Dim lngRecordCount As Long, lngFirstN As Long, lngCurrN As Long
    Dim txtRecordCount As String, txtFirstN As String, txtCurrN As String, txtNPrev As String
    Dim lngNPrev As Long, Count As Long
    Dim txtSql As String
        
    Set db = CurrentDb
    Set rs = db.OpenRecordset("q2", dbOpenDynaset)
    
    If rs.RecordCount <> 0 Then ' если запрос имеет записи
        
        If IsTable("tblResult") Then ' проверка существования таблицы
            DoCmd.SetWarnings False ' откл уведомления
            DoCmd.RunSQL ("DELETE * FROM [tblResult]") ' очистить таблицу
            DoCmd.SetWarnings True ' вкл уведомления
        Else
            ' создать таблицу
            DoCmd.RunSQL ("CREATE TABLE tblResult ([First N] LONG,[Last N] LONG, [FirstT] TEXT(10), [LastT] TEXT(10), Count LONG)")
         End If
    
        rs.MoveLast ' "прогружаем" запрос до последней записи
        lngRecordCount = rs.RecordCount ' количество записей. Впринцыпе, можно удалить
        rs.MoveFirst ' идем к первой записи
        lngFirstN = rs![NR]: txtFirstN = rs![Document N] ' запоминаем 1 записи
        rs.MoveNext ' смещаемся на следуюющую запись
        lngNPrev = lngFirstN: txtNPrev = txtFirstN
        Count = 1 ' счетчик
        Do Until rs.EOF ' идем до конца результата запроса
            lngCurrN = rs![NR]: txtCurrN = rs![Document N] ' текущая запись
            If lngCurrN - lngNPrev = 1 Then ' если разница с предыдущей записью = 1
                Count = Count + 1 ' увеличить счетчик
            Else ' иначе
                Debug.Print lngFirstN & " " & lngNPrev & " " & Count ' вывод в дебаг
                ' формируем SQLстроку для вставки записи
                txtSql = "INSERT INTO [tblResult] " _
                    & "([First N],[Last N],[FirstT],[LastT], Count) VALUES " _
                    & "(" & lngFirstN & "," & lngNPrev & ", '" & txtFirstN & "', '" & txtNPrev & "', " & Count & ");"
                DoCmd.SetWarnings False
                DoCmd.RunSQL (txtSql) ' вставка записи в таблицу Ресалт
                DoCmd.SetWarnings True
                Count = 1 ' "обнуляем" счетчик
                lngFirstN = lngCurrN: txtFirstN = txtCurrN ' запоминаем новое "первое" число
            End If
            lngNPrev = lngCurrN: txtNPrev = txtCurrN ' запоминаем новое "предыдущее" число
            rs.MoveNext ' шаг по результате запроса
        Loop
    Else
        MsgBox "NO DATA" ' если запрос не вернул строк
    End If
     Debug.Print lngFirstN & " " & lngNPrev & " " & Count
     txtSql = "INSERT INTO [tblResult] " _
                    & "([First N],[Last N],[FirstT],[LastT], Count) VALUES " _
                    & "(" & lngFirstN & "," & lngNPrev & ", '" & txtFirstN & "', '" & txtNPrev & "', " & Count & ");"
     DoCmd.SetWarnings False
     DoCmd.RunSQL (txtSql) ' вставка последней записи
     DoCmd.SetWarnings True
End Sub
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 31.12.2015 в 09:51.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сцепка ячеек построчно, выборка непустых значений из диапазона и подстановка их в одну ячейку excelboooo Microsoft Office Excel 1 14.11.2015 14:26
Копирование из непрерывного диапозона ячеек по условию. Nicolas_46 Microsoft Office Excel 4 08.08.2013 17:23
Выборка из диапазона всех уникальных значений strannick Microsoft Office Excel 7 10.03.2012 20:55
Выборка выборка с таблицы с отношением многие-ко-многим 8alig8 БД в Delphi 2 24.06.2010 12:21
Выборка данных в рекордсет из диапазона. Kveldulv Microsoft Office Excel 1 15.03.2010 14:24