Salve a tutti.
Il problema che questa volta non mi fa dormire è il seguente:
Come si fa una select su delle tabelle (+ di una),
il cui nome (il nome delle tabelle) dipende dai risultati di una select.
![]()
![]()
è possibile sta cosa?
Salve a tutti.
Il problema che questa volta non mi fa dormire è il seguente:
Come si fa una select su delle tabelle (+ di una),
il cui nome (il nome delle tabelle) dipende dai risultati di una select.
![]()
![]()
è possibile sta cosa?
per come l'hai detta no
almeno una tabella o una vista deve essere nota
Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te
mi spiego meglio (forse), ecco le table sul quale devo lavorare
(posso modificarle se è il caso, ma contengono una mole impressionante di dati).
tblTable(id, tblName#)
tblName1(id, marca, codice, ...)
tblName2(id, marca, codice, ...)
tblName3(id, marca, codice, ...)
tblName4(id, marca, codice, ...)
tblName5(id, marca, codice, ...)
tblName6(id, marca, codice, ...)
tblNameN(id, marca, codice, ...)
mi serve una select che prenda il/i nome/i della/e table (da tblTable)e che cerchi gli articoli sulle table tblName#
mamma mia che ho scritto.
:master:
da quello che ho capito dovrebbe essere così
codice:with TBTable as ( SELECT id , nome , cognome FROM TB1 UNION ALL SELECT id , nome , cognome FROM TB2 UNION ALL SELECT id , nome , cognome FROM TB3 UNION ALL ... ) SELECT * FROM TBTABLE
Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te
xegallo ho provato il tuo codice (ho cercato di provarlo), senza alcun risultato. mi da errore.
potresti spiegarmelo, magari ci arrivo da solo all'errore.
p.s. il criterio where va messo alla fine vero?
:master:
se il numero di tabelle è fisso e devi sempre eseguire le query su tutte le tabelle, fai come ti ha suggerito xegallo, cioè unisci tutte le tabelle in una sola e poi usi quella per la query.
Se invece devi usare i dati solo di alcune tabelle, oppure il numero di tabelle è variabile devi scriverti un po' di codice. In questo caso io farei così:
1) apri un recordset sulla tabella tblTable in modo che contenga i nomi delle tabella da cui devi leggere i dati
2) per ogni record nel recordset esegui una
"INSERT INTO TbTable SELECT * FROM " + rcset.TblTable#
che crea la tabella TbTable e inserisce i dati provenienti dalle tabelle
3) usi TbTable per fare la tua query.
La sintassi della select é:
SELECT nome_campi
FROM tabelle
WHERE condizioni
S'i fosse foco, arderei 'l mondo
Si CIK devo usare i dati solo di alcune tabelle
e inoltre il numero delle tabelle non è fisso anzi varia continuamente
ho seguito il tuo consiglio (cik)
tranne che per il punto due.
non voglio affatto creare un'altra tabella (che poi mi tocca anche distruggere). In realta avevo pensato di usare una temporary table, ma poi ho risolto cosi:
ti posto il codice, è ancora un po' pasticciato, l'ho scritto in fretta ma sembra funzionare.
[code]
Option Explicit
Public Cn As New ADODB.Connection
Public Rs As New ADODB.Recordset
Sub connetti()
With Cn
'nella prima riga si specifica il provider
'nella seconda il percorso al db
.ConnectionString = "driver={MySQL ODBC 3.51 Driver}; " _
& "Database=motorserver;UID=root;"
'numero dei secondi di timeout
.ConnectionTimeout = 5
'tipo di cursore
.CursorLocation = adUseClient
'nessuna limitazione
.Mode = adModeShareDenyNone
'apertura ricordarsi di chiuderla
.Open
End With
With Rs
'imposta a che connessione si riferisce
.ActiveConnection = Cn
' imposta il tipo di lock
.LockType = adLockOptimistic
End With
End Sub
Private Sub Form_Load()
'dichiarazione variabili
Dim mysql As String
Dim Product As String
Dim Prodotti As New ADODB.Recordset
'connessione
Call connetti
With Prodotti
'imposta a che connessione si riferisce
.ActiveConnection = Cn
' imposta il tipo di lock
.LockType = adLockOptimistic
End With
mysql = "select * from prodotti"
mysql = mysql & " where marca like 'ar%'" 'esempio :-)
Prodotti.Open mysql
If Prodotti.RecordCount <= 0 Then
Call MsgBox("Non ci sono prodotti" _
& " che soddisfano questa richiesta", _
vbOKOnly + vbInformation, "Informazioni")
Unload Me
End If
Product = ""
mysql = ""
Prodotti.MoveFirst
While Not Prodotti.EOF
'prodotti
Product = CStr(Prodotti.Fields("marca").Value)
'select 'Prodotti'
' apre il recordset leggendo tutti i campi dalla _
tabella "Product"
If mysql <> "" Then mysql = mysql & " union all "
'jstr(Product) lavora sul nome della tabella
mysql = mysql & "select * from `" & JStr(Product) _
& "` where codice like '%10%'" 'esempio :-)
DoEvents
Prodotti.MoveNext
Wend
mysql = mysql & " limit 0, 1000"
Rs.Open mysql
If Rs.RecordCount > 0 Then
'riempie la vostra griglia coi dati del recorset
Set DataGrid1.DataSource = Rs
End If
Prodotti.Close
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
DataGrid1.DataMember = ""
Rs.Close
Cn.Close
End Sub
P.S. sono abbastanza lunghi i tempi di eseguzione, quindi, accetto consigli.
:quote:
Vabbè che era un po' pasticciato ma senza l'indentazione non si capisce proprio nulla, perche si vede cosi?
![]()
![]()
![]()
e come si fa a colorare lo script (in futuro mi sara utile)?
questo denota il fatto il fatto che non hai letto il regolamentoOriginariamente inviato da grendy
:quote:
Vabbè che era un po' pasticciato ma senza l'indentazione non si capisce proprio nulla, perche si vede cosi?
![]()
![]()
![]()
e come si fa a colorare lo script (in futuro mi sara utile)?
Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te
guarda l'anteprima del messaggio prima di postarlo.
Eviti queste situazioni
codice:Option Explicit Public Cn As New ADODB.Connection Public Rs As New ADODB.Recordset Sub connetti() With Cn 'nella prima riga si specifica il provider 'nella seconda il percorso al db .ConnectionString = "driver={MySQL ODBC 3.51 Driver}; " _ & "Database=motorserver;UID=root;" 'numero dei secondi di timeout .ConnectionTimeout = 5 'tipo di cursore .CursorLocation = adUseClient 'nessuna limitazione .Mode = adModeShareDenyNone 'apertura ricordarsi di chiuderla .Open End With With Rs 'imposta a che connessione si riferisce .ActiveConnection = Cn ' imposta il tipo di lock .LockType = adLockOptimistic End With End Sub Private Sub Form_Load() 'dichiarazione variabili Dim mysql As String Dim Product As String Dim Prodotti As New ADODB.Recordset 'connessione Call connetti With Prodotti 'imposta a che connessione si riferisce .ActiveConnection = Cn ' imposta il tipo di lock .LockType = adLockOptimistic End With mysql = "select * from prodotti" mysql = mysql & " where marca like 'ar%'" 'esempio :-) Prodotti.Open mysql If Prodotti.RecordCount <= 0 Then Call MsgBox("Non ci sono prodotti" _ & " che soddisfano questa richiesta", _ vbOKOnly + vbInformation, "Informazioni") Unload Me End If Product = "" mysql = "" Prodotti.MoveFirst While Not Prodotti.EOF 'prodotti Product = CStr(Prodotti.Fields("marca").Value) 'select 'Prodotti' ' apre il recordset leggendo tutti i campi dalla _ tabella "Product" If mysql <> "" Then mysql = mysql & " union all " 'jstr(Product) lavora sul nome della tabella mysql = mysql & "select * from `" & JStr(Product) _ & "` where codice like '%10%'" 'esempio :-) DoEvents Prodotti.MoveNext Wend mysql = mysql & " limit 0, 1000" Rs.Open mysql If Rs.RecordCount > 0 Then 'riempie la vostra griglia coi dati del recorset Set DataGrid1.DataSource = Rs End If Prodotti.Close End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) DataGrid1.DataMember = "" Rs.Close Cn.Close End Sub
S'i fosse foco, arderei 'l mondo