Newsgroup: it.comp.appl.access
Titolo: HELP esporre elenco EAN in orizzontale

Ciao
 
avrei la necessita di esporre (in una tabella poi esportabile)
l'elenco dei codici EAN abbinati ad ogni singolo prodotto nel formato:
 
COD_ART  DESCRIZIONE   EAN EAN EAN EAN EAN (ecc...)
 
solo che gli ean abbinati ad ogni articolo possono andare da 1 a N,
non c'è un numero stabilito
 
qualcuno può darmi una dritta?
grazie a tutti


gli ean quindi sono in una tabella a se e legati con un id al rispettivo 
articolo nella tabella articoli giusto?
 
non so il livello di conoscenza che hai di vba..
la tabella la devi creare per forza?
altrimenti fossi in te compilerei direttamente da codice vba un foglio 
excel, o txt o xml
 
se ti serve la tabella per forza nel db, devi crearla da codice dopo 
aver contato il numero max di ean che un articolo puo avere
 
e dopo averla creata la popoli con i dati delle due tabelle
 
(due cicli)
 
 
spero di essere stato chiaro
BFS

una bella query a campi incrociati, può essere una soluzione?

Ciao!
 
Usa una tabella temporanea:
COD_ART
ProgColonna INTEGER
EAN
 
Popoli la tabella con una query di accodamento dalla tua tabella di partenza.
 
Con il ciclo sotto (scritto al volo, controlla gli errori!) imposti la sequenza delle righe da mettere in colonna (MAXCOLONNE va sostituito con [numero massimo di colonne]-1 che vuoi crearti).
 
set rsOrdina=currentdb.openrecordset("SELECT ProgColonna FROM TabTemporanea ORDER BY COD_ART, EAN;")
do while (rsordina.eof=false)
    with rsordina
        .edit
        .fields("ProgColonna")=.absoluteposition mod MAXCOLONNE
        .update
 
        .movenext
    end with
loop
rsordina.close
set rsOrdina=nothing
 
Ti crei una query a campi incrociati in cui raggruppi per COD_ART, ProgColonna va in intestazione colonna, e primo di EAN è il valore da visualizzare.
 
La query così creata la colleghi per COD_ART alla tabella o query di origine dati del report.
 
HTH
Popi


provo, grazie


ciao
i dati sono legati dal COD_ART e li prendo direttamente da AS400
a me va bene qualunque cosa, basta che poi posso esportarlo in excel
 
ho provato una soluzione che ho trovato nel sitocomune
 
Public Function UnisciValori(MioCampo As String) As String
Dim rst As DAO.Recordset
Dim strSQL As String
UnisciValori = ""
strSQL = "SELECT * FROM visualizzaean2 WHERE codice ='" & MioCampo &
"' ORDER BY codice;"
Set rst = CurrentDb().OpenRecordset(strSQL)
rst.MoveFirst
Do Until rst.EOF
    UnisciValori = UnisciValori & rst!EAN & " "
    rst.MoveNext
Loop
UnisciValori = Left(UnisciValori, Len(UnisciValori) - 1)
Set rst = Nothing
End Function
 
ma quando devo estrarre qualche centinaio di codici ci mette
un'eternità a buttar fuori qualcosa

 una bella query a campi incrociati, può essere una soluzione?
 
non so quali campi incrociare però

 wrote:

potrebbe andare quasi bene
solo che avrei bisogno di far ripartire da 1 il contatore degli EAN ad
ogni cambio di COD_ART

Uh?
 
Ti riferisci al campo ProgColonna o a qualcos'altro?
 
Popi


si, a ProgColonna
ho copiato il tuo codice e la numerazione progressiva continua

Mumble ...
 
Nel codice ho scritto
 
.fields("ProgColonna")=.absoluteposition mod MAXCOLONNE
 
Che significa che ProgColonna può assumere solo valori interi compresi fra 0 e MAXCOLONNE-1.
 
Prova a postare il mio codice così come lo stai usando.
 
Popi


maxcolonne = 100
DoCmd.RunSQL ("DELETE * FROM temp_ean")
DoCmd.OpenQuery "acc_temp_ean", acViewNormal
Set rsOrdina = CurrentDb.OpenRecordset("SELECT Progean FROM temp_ean
ORDER BY COD_ART, EAN;")
Do While (rsOrdina.EOF = False)
    With rsOrdina
        .Edit
        .Fields("ProgEan") = .AbsolutePosition Mod maxcolonne - 1
        .Update
        .MoveNext
    End With
 
Loop
rsOrdina.Close
Set rsOrdina = Nothing

Temo che l'istruzione qua sotto
 
.Fields("ProgEan") = .AbsolutePosition Mod maxcolonne - 1 
 
venga interpretata da Access come 
.Fields("ProgEan") = (.AbsolutePosition Mod maxcolonne) - 1 
 
e non come 
.Fields("ProgEan") = .AbsolutePosition Mod (maxcolonne - 1)
 
La differenza sta nel fatto che la prima alloca 101 colonne anziché 100.
 
Al di là di questo, quando ti dicevo di controllare gli errori mi riferivo in primis a quelli concettuali.
Perché nel ciclo devi (devi!) testare se il COD_ART corrente è uguale a quello precedente.
Se sono diversi il contatore deve resettarsi (come dicevi tu giustamente), ma .absoluteposition non è resettabile, quindi ti servirà una variabile integer da incrementare per COD_ART uguali e resettare al cambio del COD_ART.
 
Popi


Intanto grazie,
ho risolto così:
 
old_cod = ""
new_cod = ""
 
DoCmd.RunSQL ("DELETE * FROM temp_ean")
DoCmd.OpenQuery "acc_temp_ean", acViewNormal
Set rsOrdina = CurrentDb.OpenRecordset("SELECT temp_ean.COD_ART,
temp_ean.PROGEAN " & _
"FROM temp_ean " & _
"ORDER BY temp_ean.COD_ART, temp_ean.EAN; ")
Do While (rsOrdina.EOF = False)
    With rsOrdina
new_cod = .Fields("cod_art")
        .Edit
        If old_cod <> new_cod Then progressivo = 1
        .Fields("ProgEan") = progressivo
        .Update
         old_cod = .Fields("cod_art")
        .MoveNext
 
    End With
 
    progressivo = progressivo + 1
    Loop
rsOrdina.Close
Set rsOrdina = Nothing
 
 
 
solo che dopo un po' che gira mi appare questo errore:
Errore di run-time '3052':
Superato il numero di blocchi per la condivisione di file. Aumentare
la
voce di registro MaxLocksPerFile
 
sai cosa può essere?
 
 


ecco qui :)
 
DAO.DBEngine.SetOption dbMaxLocksPerFile, 200000
 


ultima domanda:
 
perchè se dopo il codice faccio aprire la query a campi incrociati
appare una sola colonna EAN (0) mentre se faccio doppio click sulla
query appare corretta (1 - 2 - ecc...) ?

Uh?
 
Come la apri "dopo il codice"?
 
Popi


docmd.openquery "xxxxxxxx", acviewnormal