PDA

View Full Version : [Access + SQL] Query di "scomposizione"???


ToO_SeXy
23-01-2007, 13:44
Ciao a tutti

Ho un problema con un piccolo programma in Access che sto realizzando per calcolare e stampare delle etichette che andranno apposte successivamente ad alcuni pezzi di metallo.

ho una tabella contenente 3 campi: "Articolo", "Numero" e "Componente"

ES:

XYZ 2 LAMIERA1
ASD 3 LAMIERA2

ed ho bisogno di stampare 1 etichetta per ogni lamiera che verrà tagliata, mi servirebbe quindi una query che in output mi restituisca

XYZ 1 LAMIERA1
XYZ 1 LAMIERA1
ASD 1 LAMIERA2
ASD 1 LAMIERA2
ASD 1 LAMIERA2

é tutta mattina che ci provo e ancora nn ho risolto nulla, oltretutto nn so che cercare su Google per avere risposta... Avete delle idee a riguardo??

PS: sono ben accette anche soluzioni diverse

akyra
23-01-2007, 14:40
fammi capire na cosa, se sulla tabella hai una riga con scritto:

XYZ 100 LAMIERA1

vuoi che in uscita ti stampi 100 volte la scritta

XYZ 1 LAMIERA1

giusto? oppure ho frainteso?
in ogni caso si può fare, basta che mi fai capire bene cosa ti serve.

ToO_SeXy
23-01-2007, 17:18
si hai capito bene

mi interessa creare una tabella dalla quale prendere i dati con un report

simoneart
23-01-2007, 18:18
mhmmm....
magari si può fare pure (anche se non mi viene in mente come) ma sei sicuro che sia la strada più semplice per farlo?

Mi sembra un risultato molto strano da voler ottenere come risultato di una query.

Non è molto più semplice un programmino di una decina di righe con un bel ciclo for ... next?

ToO_SeXy
23-01-2007, 18:20
prima volevo tentare la query per mantenere il DB + semplice possibile :)

akyra
25-01-2007, 02:08
non ho avuto tempo di risponderti prima, ma ho la soluzione al tuo problema, appena ho un minuto te la posto...penso domani.
non è nulla di trascendentale, con qualche riga di codice vba si fa senza problemi.

ps
come ha detto simoneart ci vuole del codice vba, senza non penso proprio sia possibile farlo...o almeno, se vuoi mantenere le cose semplici è molto meglio usare il codice....anzi, mi sento proprio di affermare che na cosa del genere con le sole query non si possa proprio fare

ToO_SeXy
25-01-2007, 09:12
ti ringrazio dell'aiuto :)

akyra
26-01-2007, 09:41
eccomi...meglio tardi che mai....
allora il codice che esegue quanto hai richiesto è il seguente:

Dim numRec, i, j As Integer
Dim rst As ADODB.Recordset
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
Set rst = New ADODB.Recordset
rst.Open "Tabella1", conn, adOpenDynamic, adLockOptimistic
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM Temp"
While Not rst.EOF
numRec = rst![Numero]
For j = 1 To numRec
DoCmd.RunSQL "INSERT INTO Temp (Articolo, Numero,Componente) VALUES ('" & rst![Articolo] & "','1','" & rst![Componente] & "')"
Next j
rst.MoveNext
Wend
DoCmd.OpenReport "report1", acViewPreview


Tabella1 è la tabella dove sono contenuti i dati che si devono gestire, del tipo :
XYZ 6 ComponenteA
ABC 7 ComponenteB

ecc ecc...
nel database che ho caricato ho implementato il codice sull'evento "click" del pulsante nella maschera denominata "principale".
In questa maschera puoi modificare i dati inseriti e verificare che la modifica di questi ha come conseguenza il risultato che avevi richiesto tu. Il report che viene visualizzato alla fine ("report1") serve solo a mostrare il risultato dell'algoritmo, ed è basato sulla tabella "Temp" che utilizzo per inserire i dati che vengono successivamente stampati nel suddetto report.
si possono inventare soluzioni stilisticamente migliori, ma questa è la prima che mi è venuta in mente...lascio a te ogni onere di eventuali migliorie :) :D

se hai domande io sono qua.

ToO_SeXy
29-01-2007, 08:14
Funziona alla perfezione :)

grazie 1000

ToO_SeXy
30-01-2007, 09:21
un' ultima cosa....

Su google trovo solo .exe precompilati... conoscete un buon algoritmo di nesting ad una dimensione? devo implementare un ottimizzatore di taglio sulle barre di metallo elaborate :)

akyra
30-01-2007, 17:21
sinceramente non sarei perchè ogni casa produttrice di software è gelosa dei propri algoritmi di nesting, immagino....ma cosa vorresti fare? implementarne uno in access? e come creeresti l'immagine del posizionamento dei vari pezzi da "nestare"?

ToO_SeXy
30-01-2007, 17:34
vorrei implementare un algoritmo che agisca sul recordset creato con il tuo codice. Non mi interessa stampare nessuna immagine, semplicemente vorrei ordinare i record (e quindi le lunghezze di taglio) in modo da ridurre al minimo lo scarto del materiale. Essendo un nesting ad 1 sola dimensione basterebbe un array di long in cui immagazzinare gli ID dei record in successione per poi ri-costruire un terzo recordset ordinato ad hoc

akyra
30-01-2007, 21:29
come li dovresti ordinare i record? in base a che dato?

ToO_SeXy
31-01-2007, 19:10
voglio ordinare i record in base al campo lunghezza, in modo da ottenere un'ipotetica lista di taglio che, sapendo a priori lunghessa di ogni pezzo ed lunghezza delle barre in magazzino mi permetta di ridurre al minimo gli scarti

akyra
01-02-2007, 01:16
quindi in pratica dovresti stampare un report diviso per tipologia di codice (diciamo) e, all'interno di ogni gruppo di tipologia, ordinare i vari record per lunghezza? oppure ti basterebbe ordinare tutti i record per lunghezza?

Nel primo caso dovresti agire a livello di report, spezzarlo per codice ed ordinarlo per lunghezza...ti faccio l'upload di un db di esempio che può esemplificare quanto ho detto.

Nel secondo caso invece ti basterebbe implementare la query su cui si appoggia il report finale, in modo tale che presenti nella clausola "Ordinamento" il valore "Crescente".

...è un po' tardi, per cui se hai qualche dubbio su quello che ho scritto chiedi pure, in quanto le mie facoltà intellettive a quest'ora sono un po' "ridotte", per cui potrei essere stato poco chiaro...

ToO_SeXy
01-02-2007, 15:27
non ci siamo capiti :)

non devo stamparli in ordine crescente ma in ordine utile a ridurre gli sprechi.

es:

la lunghezza delle lamiere a magazzino é di 10 metri

devo tagliarne
1 da 6 metri
1 da 5 metri
1 da 4 metri
1 da 3 metri
e 2 da 1 metro

ci sonov arie successioni che permettono di scartare il meno possibile... es:

Barra 1 5-4-1
Barra 2 6-3-1

oppure

Barra 1 5-3-1-1
Barra 2 6-4

mi servirebbe un'algoritmo in grado di scovare questi ordinamenti :)

cercando su google et similia si ottengono un sacco di programmi percompilati ma nemmeno uno straccio di codice sorgete da portare in un modulo all'interno di Access :(