09/05/2025 - OsvaldoLaviosa ha scritto:
poi una query che coinvolga entrambe le tabelle e con opportuna funzione estragga 3 record al massimo dal lato molti e li allinei orizzontalmente.
Ciao, pure io per certi Thread trovo difficoltà nel capire la domanda e può essere anche in questo caso di non averci capito nulla... ;-)
personalmente farei con una tabella unica e due righe di codice ...
Se al massimo vuole solo tre colonne, esegue un import delle "massimo 3 righe" di descrizione e le mette direttamente in orizzontale nelle 3 colonne di output. Sempre se la regola è di questo tipo e rimarrà fissa come logica.
Faccio per esempio un esempio di come farei io ;-) nel caso in cui si ha un certo schema fisso come risultato finale per l'import:
- Poniamo di avere una tabella di INPUT e una di OUTPUT
- Come Criterio al Massimo si prendono le Prime 3 Righe di Descrizione per Codice Articolo
- Si crea in OutPut un nuovo Record che in "Orizzontale" per ogni Codice Articolo, popola le 3 Descrizioni Articolo
Tabella di INPUT

.
Tabella di OUTPUT

.
Esempio di CODICE
Option Compare Database
Option Explicit
' IMPORT CODE ROWS
Private Sub MyImportCodeRows()
' Set variables
Dim rowsMax As Integer: rowsMax = 3
Dim codeRow As String: codeRow = Space(0)
Dim i As Integer: i = 1
Dim CollDes As New Collection
' Delete all records from output table
DBEngine(0)(0).Execute "DELETE FROM TabellaOutPut;", dbFailOnError
' Open recordset from input table
With DBEngine(0)(0).OpenRecordset("SELECT CDARM9, NRRGM9, DSARM9 FROM TabellaInPut ORDER BY CDARM9, NRRGM9;", dbOpenSnapshot)
' Read record
Do While Not .EOF
' Initialize codeRow first
If codeRow = Space(0) Then codeRow = .Fields("CDARM9").Value
' Save new Record and Reset key level
If .Fields("CDARM9").Value <> codeRow Then
' Insert new records
MyNewInsertOutPut codeRow, CollDes, rowsMax
' Reset level key and description collection
codeRow = .Fields("CDARM9").Value
Set CollDes = New Collection
i = 1
End If
' Build collection of description
If i <= rowsMax And codeRow = .Fields("CDARM9").Value Then
' Add new item
CollDes.Add Nz(.Fields("DSARM9").Value, Space(0))
' Increase count max
i = i + 1
End If
' Next record
.MoveNext
Loop
' Insert new last records
MyNewInsertOutPut codeRow, CollDes, rowsMax
End With
End Sub
' INSERT NEW RECORDS INTO TABLE OUTPUT
Private Sub MyNewInsertOutPut(codeRow As String, CollDes As Collection, rowsMax As Integer)
' Check if the collection contains items
If CollDes.Count > 0 Then
' Normalize the collection to ensure a fixed number of items
Dim y As Integer
For y = CollDes.Count + 1 To rowsMax
CollDes.Add Space(0)
Next y
' Insert new record into the output table
DBEngine(0)(0).Execute "INSERT INTO TabellaOutPut (OutCDDTM9, OutCDLGGM9, OutCDARM9, OutDSARM901, OutDSARM902, OutDSARM903) " & _
"VALUES ('01', 'IT', '" & _
Replace(codeRow, "'", "''") & "', '" & _
Replace(CollDes(1), "'", "''") & "', '" & _
Replace(CollDes(2), "'", "''") & "', '" & _
Replace(CollDes(3), "'", "''") & "');", dbFailOnError
End If
End Sub
.
In certi casi preferisco realizzare gli import con del codice in modo di avere la possibilità di inserire vari Controlli (come per esempio trattare eventuali caratteri speciali), Filtri, Condizioni e Criteri che spesso diversamente non sarebbe possibile con altri sistemi...
in sostanza, per certi tipi di operazioni, utilizzando due righe di codice trovo più flessibilità, semplicità e controllo.
Boh... non so se effettivamente vuole ottenere tale risultato. Vediamo cosa ci dice ;-)