Newsgroup: it.comp.lang.visual-basic
Titolo: Unire due "liste" di numeri

Salve a tutti,
avrei la necessità di unire due array di numeri:
a100		x130
b200		y50
		z120
Mi dovrei tirare fuori un singolo array "union" del tipo
a	100	x
b	 30	x
b	 50	y
b	120	z
In pratica il totale del primo array è SEMPRE uguale al secondo, ma ogni
array può avere un numero di righe da 1 a #n. Devo tirar fuori una matrice
che abbia tutti gli elementi di entrambi per le stesse quantità.
Se può essere utile a,b sono Codici IVA, mentre x,y,z sono contropartite.
Devo tirar fuori #n righe in modo che i totali di ogni cod.iva e
contropartita siano corretti.
Avete idea di quale algoritmo adottare?
Grazie

 Avete idea di quale algoritmo adottare?
Non l'ho testato, quindi sicuramente avrà qualcosa (!) che non và.
Dati A() e B() i tuoi due array di partenza:
Dim R() as integer
''' so che così è solo l'ultimo ad essere integer,
''' ma sai, di questi tempi meglio specificare,
''' l'ho fatto solo x abbreviare
Dim i, j, k, q, idx, nSommaP, nResiduoP as integer
idx = 0
nSommap = 0
nResiduoP = 0
For i = 0 to UBOUND(A)
	nSommaP = nSommaP + A(i)
	For j = idx To UBOUND (B)
	     IF nResiduoP = 0 THEN
		  IF nSommaP <= B(j) THEN
			''' LASCIO A TE I REDIM DEL CASO
			R(q) = nSommaP
			nResiduoP = B(j) - nSommaP
			nSommaP = 0
			''' Inutile ma giusto per capire
			''' che non bisogna avanzare d'indice
			idx = idx
			''' bleurgh! ma trova tu un modo d'uscita più
			''' elegante
			exit for
		   ELSE
			IF nResiduoP > 0 THEN
				R(q) = nResiduoP
				nSommaP = nSommaP - nResiduoP
				idx = idx + 1
			ELSE
				R(q) = B(j)
				nSommaP = nSommaP - B(j)
				idx = idx + 1
			END IF
		   END IF
	    ELSE
		   IF nSommaP >= nResiduoP THEN
			R(q) = nResiduoP
			nResiduoP = 0
			nSommaP = nSommaP - nResiduoP
			idx = idx + 1
		   ELSE
			R(q) = nResiduoP
			nResiduoP = nResiduoP - nSommaP
			nSommaP = 0
			idx = idx
		   END IF
	    END IF
	Next j
Next i
spero non sia troppo sbagliata.
ciao
stefano

 spero non sia troppo sbagliata.
Allora nel frattempo avevo buttato giù questa.
Come concetto ho pensato di prendere l'importo minore fra i due elenchi, e
chiudere quello via via con il minimo dell'altro (che sarà >=).
Ho sfruttato recordset al posto di array, perchè mi danno in automatico
Sort e Filter.
RighiFatt(i) è l'array dove metto il risultato
    RsI.Sort = "IMPORTO ASC": RsC.Sort = "IMPORTO ASC"
    i = -1
    While Rimanenza <> 0
      i = i + 1
      RsI.Filter = "IMPORTO <> 0": RsC.Filter = "IMPORTO <> 0"
      If Abs(RsC("IMPORTO").Value) < Abs(RsI("IMPORTO").Value) Then
        Impo = RsC.Fields("IMPORTO").Value
      Else
        Impo = RsI.Fields("IMPORTO").Value
      End If
 
      With RighiFatt(i)
        .CodIva = RsI.Fields("CODIVA").Value
        .Imponibile = Impo
        .Contropartita = RsC.Fields("CONTO").Value
      End With
 
	'sottraggo l'importo
      RsC.Update "IMPORTO", RsC.Fields("IMPORTO").Value - Impo    
      RsI.Update "IMPORTO", RsI.Fields("IMPORTO").Value - Impo
 
      Rimanenza = Rimanenza - Impo
    Wend

 spero non sia troppo sbagliata.
Grazie, ora la guardo con calma :DD


 Sort e Filter.
Pensavo che i due array di partenza fossero immutabili.
:-)
ciao
stefano

 :-)
Nono, infatti inizialmente avevo scritto "liste" senza specificare.
Venendomi i dati da un DB poi ho sfruttato la cosa :)