powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Генерация представления
12 сообщений из 12, страница 1 из 1
Генерация представления
    #35318789
Gray_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно сгенерировать представление, из кода пока-что только это:
Код: 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.
'FG1 - FlexGrid с данными вида "Таблица.Поле"
'Есть массив ArrTbl где хранятся имена выбранных таблиц.
Dim ln As Integer
Dim str As String
Dim a As String
Dim b As String
FG1.Row =  0 
FG1.Col =  1 
s = "SELECT "
Do While FG1.Text <> ""
    str = str & FG1.Text & ","
    FG1.Col = FG1.Col +  1 
Loop

s = s & str
ln = Len(s) -  1 
a = Mid(s,  1 , ln) & " FROM "
i =  1 
s = ""
Do While ArrTbl(i) <> ""
    s = s & ArrTbl(i) & ","
    i = i +  1 
Loop

ln = Len(s) -  1 
b = Mid(s,  1 , ln)
a = a & b & ";"

В итоге получаю строку вида
Код: plaintext
SELECT Табл1.Поле1, Табл2.Поле2, Табл1.Поле3 FROM Табл1, Табл2;
Но я никак не могу разобратся с INNER JOIN.
Помогите с алгоритмом.

P.S. БД: MS SQL-2005.
...
Рейтинг: 0 / 0
Генерация представления
    #35318799
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура джойнов зависит от смысла запроса. А что такое ФГ1 и АррТбл вообще известно только телепатам.
...
Рейтинг: 0 / 0
Генерация представления
    #35318813
Gray_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy А что такое ФГ1 и АррТбл вообще известно только телепатам.

ну вобщем-то это было написано в самом начале кода...(в виде коментов)
но можно и повторить:
Код: plaintext
1.
2.
3.
'FG1 - FlexGrid с данными вида "Таблица.Поле"
'Есть массив ArrTbl где хранятся имена выбранных таблиц.
'a - итоговый запрос

Вся беда в том что заранее неизвестно что за БД
будет открыта и какие поля (опять-же в неизвестно каких таблицах)
выберут для создания представления.
...
Рейтинг: 0 / 0
Генерация представления
    #35318851
Gray_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вычитал что всместо INNER JOIN можно использовать и WHERE
(т.к. редартировать мне ничего не надо),
но осталась проблема с определением ключевых полей.
...
Рейтинг: 0 / 0
Генерация представления
    #35319135
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коментов не заметил.
В общем случае эта задача не решаема.
...
Рейтинг: 0 / 0
Генерация представления
    #35319137
Фотография Restavraciya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно динамически строить запросы к таблицам с заранее неизвестной структурой то
в адо можно узнавать структуру очередной_таблицы/поля/пк до формирования скуль-строки
После чего делать алгоритмом выводы и ... формировать то что вы хотите в резалте
...
Рейтинг: 0 / 0
Генерация представления
    #35319237
Gray_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RestavraciyaЕсли нужно динамически строить запросы к таблицам с заранее неизвестной структурой то
в адо можно узнавать структуру очередной_таблицы/поля/пк до формирования скуль-строки
После чего делать алгоритмом выводы и ... формировать то что вы хотите в резалте

В том и беда, что узнать нужно какое поле является ключём, а какое FK.
Но как это сделать?
...
Рейтинг: 0 / 0
Генерация представления
    #35319713
Фотография Restavraciya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри msdn про OpenSchema
там можно вытащить все (все что прописано по схеме и структуре)
...
Рейтинг: 0 / 0
Генерация представления
    #35319715
Фотография Restavraciya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В общем случае эта задача не решаема.
Отдыхай дядя ... подальше от этого форума .. тута писимистаф не лубят
...
Рейтинг: 0 / 0
Генерация представления
    #35319726
Gray_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решилась через всем известный проход...
но решилась )
Код: 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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
Dim ArrKey( 1  To  100 ,  1  To  2 ) As String
Dim ArrKeyTbl( 1  To  100 ,  1  To  2 ) As String
Dim ArrKeyTbl2( 1  To  100 ) As Boolean
Dim KeyCnt As Integer
Dim ArrKeyClk( 1  To  100 ) As String

Dim KeyRS As ADODB.Recordset
Dim KeyRS2 As ADODB.Recordset
Set KeyRS = New ADODB.Recordset
Set KeyRS2 = New ADODB.Recordset

KeyRS.ActiveConnection = cn
KeyRS2.ActiveConnection = cn
sqlKeys = "SELECT FK.TABLE_NAME+'.'+FK.COLUMN_NAME , PK.TABLE_NAME+'.'+PK.COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK JOIN 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C ON 
PK.CONSTRAINT_CATALOG=C.UNIQUE_CONSTRAINT_CATALOG AND 
PK.CONSTRAINT_SCHEMA=C.UNIQUE_CONSTRAINT_SCHEMA AND 
PK.CONSTRAINT_NAME=C.UNIQUE_CONSTRAINT_NAME JOIN 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK ON 
C.CONSTRAINT_CATALOG=PK.CONSTRAINT_CATALOG AND 
C.CONSTRAINT_SCHEMA=FK.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME=FK.CONSTRAINT_NAME 
AND PK.ORDINAL_POSITION=FK.ORDINAL_POSITION ORDER BY 
FK.CONSTRAINT_NAME,PK.ORDINAL_POSITION;"

sqlKeys2 = "SELECT FK.TABLE_NAME, PK.TABLE_NAME FROM 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK JOIN 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C ON 
PK.CONSTRAINT_CATALOG=C.UNIQUE_CONSTRAINT_CATALOG AND 
PK.CONSTRAINT_SCHEMA=C.UNIQUE_CONSTRAINT_SCHEMA AND 
PK.CONSTRAINT_NAME=C.UNIQUE_CONSTRAINT_NAME JOIN 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK ON 
C.CONSTRAINT_CATALOG=PK.CONSTRAINT_CATALOG AND 
C.CONSTRAINT_SCHEMA=FK.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME=FK.CONSTRAINT_NAME
 AND PK.ORDINAL_POSITION=FK.ORDINAL_POSITION ORDER BY 
FK.CONSTRAINT_NAME,PK.ORDINAL_POSITION;"

KeyRS.Open sqlKeys
KeyRS2.Open sqlKeys2


i =  1 
Do While Not KeyRS.EOF
ArrKey(i,  1 ) = KeyRS.Fields( 0 ) 'имена полей FK
ArrKey(i,  2 ) = KeyRS.Fields( 1 ) 'имена полей PK
ArrKeyTbl(i,  1 ) = KeyRS2.Fields( 0 ) 'тоже самое но только имена таблиц
ArrKeyTbl(i,  2 ) = KeyRS2.Fields( 1 )
KeyRS.MoveNext
KeyRS2.MoveNext
i = i +  1 
Loop
KeyRS.Close
KeyCnt = i -  1 

Dim ln As Integer
Dim str As String
Dim a As String
Dim b As String

ClkCnt =  1 
FG1.Row =  0 
FG1.Col =  1 
s = "SELECT "

Do While FG1.Text <> "" 'собираем имена полей
    str = str & FG1.Text & ", " 
    FG1.Col = FG1.Col +  1 
Loop

s = s & str
ln = Len(s) -  2  'избавляемся от лишней запятой
a = Mid(s,  1 , ln) & " FROM "

i =  1 
s = ""
Tcnt =  1 
Do While ArrTbl(i) <> "" 'собираем имена таблиц 
    s = s & ArrTbl(i) & ", "
    i = i +  1 
Loop

ln = Len(s) -  2  'избавляемся от лишней запятой
b = Mid(s,  1 , ln)
a = a & b

Tcnt = i -  1 

For i =  1  To Tcnt   'сравниваем выбранные пользователем таблицы со связанными
    For j =  1  To Tcnt
        For i1 =  1  To KeyCnt
                If (ArrTbl(i) = ArrKeyTbl(i1,  2 )) And (ArrTbl(j) = ArrKeyTbl(i1,  1 )) Then
                    ArrKeyTbl2(i1) = True
                End If
        Next i1
    Next j
Next i

ClkCnt =  1 
For i =  1  To KeyCnt  'собираем связанные поля
    If ArrKeyTbl2(i) Then
        ArrKeyClk(ClkCnt) = ArrKey(i,  1 ) & " = " & ArrKey(i,  2 )
        ClkCnt = ClkCnt +  1 
    End If
Next i

If ArrKeyClk( 1 ) <> "" Then   'проверяем, были ли среди выбранных таблиц взязанные
    s = " WHERE "
    For i =  1  To ClkCnt
        s = s & ArrKeyClk(i) & " and "
    Next i
    ln = Len(s) -  10  'избавляемся от лишних ANDов
    b = Mid(s,  1 , ln)
    a = a & b
End If

a = a & ";"
'запрос готов
MsgBox a

Как это можно упростить?
...
Рейтинг: 0 / 0
Генерация представления
    #35326082
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Restavraciya
> > В общем случае эта задача не решаема.
> Отдыхай дядя ... подальше от этого форума .. тута писимистаф не лубят

А с чего ты решил, что твой совет со схемой подойдет для другого SQL
сервера, например для FireBird? Хотя там тоже можно получить эту информацию
обычными запросами, если будут на то соответствующие права :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Генерация представления
    #35326280
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Restavraciya> В общем случае эта задача не решаема.
Отдыхай дядя ... подальше от этого форума .. тута писимистаф не лубятТута клоунафф абажайут.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Генерация представления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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