powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Угадайка
7 сообщений из 7, страница 1 из 1
Угадайка
    #32090189
dead1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно, такой вопрос уже обсуждался, но всё же...

Вот, к примеру, есть некая табличка. В ней идут всякие разные данные, но самый главный столбец, по которому таблица отсортирована, немного не полноценный. То есть, сначала значения начнались от единицы до N, потом что-то удаляли, и получили примерно такую картину :
3,4,5,8,9...

Хотелось бы получить такой запрос, который бы выдавал все отсутствующие значения или хотябы первое попавшееся. Например, 1,2,6,7,10....

Как можно реализовать такой вариант : я делаю выборку из двух подзапросов minus`ом. Один из них - текущий набор (3,4,5,8,9...), а вот как создать вторую таблицу со значениями от 1 до максимального значения +1 из первого?..

Благодарен за любые напутствия.
...
Рейтинг: 0 / 0
Угадайка
    #32090309
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык создать таблицу чисел от единицы до скольких хочешь!
И джойнить с ней - так можно и все пустые выцепить!
...
Рейтинг: 0 / 0
Угадайка
    #32090425
dead1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем-то, здесь и кроется моя проблема - я не очень-то догоняю, как создать такую таблицу программно. Её что, надо ввиде цикла for i = 1 to N Insert into ...? Гм... Может получится от 200 до 800 тысяч таких фенек.
...
Рейтинг: 0 / 0
Угадайка
    #32090667
Anatoliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создайте таблицу TestNbr с единственным полем Nbr. Забейте в него числа вразброс (уникальные) типа 5; 8; 16; 11; 13; 18
И запустите следующий запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT [T1].[Nbr]- 1  AS Nbr_Empty
FROM TestNbr AS T1, TestNbr AS T2
WHERE (((T2.Nbr) In 
   (SELECT TOP  1  T3.Nbr 
   FROM TestNbr AS T3 
   WHERE T3.Nbr <T1.Nbr 
   ORDER BY T3.Nbr DESC)) AND 
(([T1].[Nbr]-[T2].[Nbr])> 1 ));
...
Рейтинг: 0 / 0
Угадайка
    #32090710
Anatoliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще вспомнил когда-то писал:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
Public Sub SerialNumber(nMax As Long, Optional nMin As Long =  1 )
'Данная процедура создает зарос с последовательными записями
'от nMin до nMax включительно (если nMin не указано, принимаем  1 )

'Call
'Call SerialNumber(nMax:= 200 , nMin:= 10 ) 'будет создан запрос с последовательными номерами от 10 до 200
'Call SerialNumber(nMax:= 10 , nMin:= 200 ) 'будет создан запрос с последовательными номерами от 200 до 10

'Предполагается, что существует таблица Nbr_sys_tmp с полем Nbr
'целоисчисленного типа, в которую запишутся числа от 1 до 10
'А также запрос  "SerialNbr_q" , в котором будут выведены требуемые
'последовательные числа
Dim i As Byte
Dim db As Database
Dim rst As Recordset
Dim sQ As String
'строки SQL - ной инструкции....
Dim sExpr As String 'выражение вычисления числа
Dim sFrom As String 'From

Dim qry As QueryDef
Dim j As Integer 'знак чисел (при возрастающей последовательности  1,
'при ниспадающей - (- 1 ))

'имя таблицы, в которую необходимо вставить последовательные
'записи от  1  до  10 
Const nmTbl As String =  "Nbr_sys_tmp" 
Const nmFld As String =  "Nbr"  'название поля данной таблицы
Const nmQry As String = "SerialNbr_q" 'название запроса, выдающие последовательные числа

'проверить существование таблицы с именем sNmTbl, если нет, создать
sQ = "Name = """ & nmTbl & """"
i = DCount("Name", "MSysObjects", sQ)
If i = 0 Then
    'создать данную таблицу
    sQ =  "CREATE TABLE "  & nmTbl &  " "  & vbCrLf & _
     "(Nbr COUNTER CONSTRAINT PrimaryKey PRIMARY KEY);" 
    DoCmd.RunSQL (sQ)
End If

'проверить существование запроса с именем nmQry, если нет, создать
Set db = CurrentDb
sQ = "Name = """ & nmQry & """"
i = DCount("Name", "MSysObjects", sQ)
If i = 0 Then
    'создать данный запрос
    
    sQ =  "SELECT * "  & vbCrLf &  "FROM "  & nmTbl &  ";" 
    Set qry = db.CreateQueryDef(nmQry, sQ)
    Set qry = Nothing
    
End If

clearTable nmTbl 'очистить таблицу nmTbl

sQ = "SELECT " & nmFld & " " & vbCrLf & _
"FROM " & nmTbl & ";"


Set rst = db.OpenRecordset(sQ)
'Добавить  10  записей
With rst
    For i =  1  To  10 
        .AddNew
            .Fields(nmFld).Value = i
        .Update
    Next i
End With

Set rst = Nothing

'определить, какая это последовательность: возрастающая или ниспадающая
If nMin <= nMax Then
    j = 1
Else
    j = -1
End If

'определить разряд разницы между верхней и нижней границами
i = Len(CStr(Abs(nMax - nMin)))
sExpr = nMin &  "+("  & j &  ")*(" 
For i =  1  To i
    sExpr = sExpr &  "([N"  & i &  "].["  & nmFld &  "]-1 )* 10 ^" & i -  1  &  "+" 
    sFrom = sFrom & nmTbl &  " AS N"  & i &  ", " 
Next i
'обрезать лишние (последние) знаки "+" и т.п.
sExpr = Left(sExpr, Len(sExpr) - 1) & ")" 'один знак  "+" 
sFrom = Left(sFrom, Len(sFrom) -  2 ) 'запятую и пробел

'составить общую строку
sQ =  "SELECT "  & sExpr &  " AS Nb "  & vbCrLf & _
 "FROM "  & sFrom &  " "  & vbCrLf & _
 "WHERE ((("  & sExpr &  ") BETWEEN "  & nMin &  " AND "  & nMax &  ")) "  & vbCrLf & _
 "ORDER BY "  & sExpr
Select Case j
Case  1  'по возрастанию
    sQ = sQ & " ASC;"
Case -1 'по убыванию
    sQ = sQ &  " DESC;" 
End Select

Set qry = db.QueryDefs(nmQry)
qry.SQL = sQ
Set qry = Nothing
Set db = Nothing

End Sub
...
Рейтинг: 0 / 0
Угадайка
    #32090871
Фотография Savik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Название топика какое-то интересное, к чему бы это?
...
Рейтинг: 0 / 0
Угадайка
    #32090922
dead1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoliy:
Большой фенкс! Второй пример длинноват, но суть я понял. Спасибо.

Savik :
А просто так :) Было бы интереснее, если назвать "Help!", "Памагити" или что-то подобное?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Угадайка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]