Newsgroup: it.comp.appl.access
Titolo: Inserire risultato funzione in query di aggiornamento

Salve ragazzi,
Mi sono appena iscritto a questo gruppo e non sono praticissimo di
Access.
Ciò premesso vi espongo il mio problema:
Devo importare un tracciato record in una tabella già predefinita
(già creata). Dopo l'importazion dovrei aggiornare un campo (campo
barcode) con un valore che ricavo da una funzione (già creata) che
calcola la cifra di controllo. Cerco di spiegarmi meglio...ho importato
nella tabella con il tracciato record il codice EAN di 12 cifre e
calcolo con la funzione la cifra di controllo. Il risultato, cioè il
barcode di 13 cifre, vorrei inserirlo in una query di aggiornamento per
calcolare il barcode di ogni record importato.Scusate la confusione,
spero di essere stato discretamente chiaro! Grazie in anticipo, aspetto
altre eventuali soluzioni.
Alberto

 ha scritto nel messaggio
news:1153566106....@p79g2000cwp.googlegroups.com...

Alberto
Ciao Alberto,
se ho capito bene devi fare una query di questo tipo
Update TAbellaDaAggiornare SET [Barcode] = [BarCode] &
TuaFunzioneCifraControllo([Barcode])
-- 
Cinzia
---------------------------------------
|  
http://www.riolab.org
  |
---------------------------------------

Cinzia ha scritto:

Ciao Cinzia,
Se non ti dispiace ti posto la funzione che ho trovato in rete e da me
inserita in un modulo:
Public Function Barcoded(Codice As String)
Dim vSeq As Variant, FirstFlag As Byte
Dim SumForCheck As Integer
Dim i As Long, Digit As Integer
    Codice = Form_Reco.cod.Value
    vSeq = Array(&H0, &HB, &HD, &HE, &H13, &H19, &H1C, &H15, &H16,
&H1A)
If Len(Codice) <> 12 Then
    Barcoded = ""
    Exit Function
End If
SumForCheck = 0
For i = 1 To 12
    Digit = Val(Mid(Codice, i, 1))
    SumForCheck = SumForCheck + Digit * IIf(i Mod 2, 1, 3)
    Select Case i
    Case 1
        Barcoded = Chr(&H21 + Digit)
        FirstFlag = vSeq(Digit)
    Case 2
        Barcoded = Barcoded & Chr(&H60 + Digit)
    Case 3 To 7
        Barcoded = Barcoded & Chr(&H30 - &H10 * ((2 ^ (7 - i) And
FirstFlag) > 0) + Digit)
    Case 8 To 12
        Barcoded = Barcoded & Chr(&H50 + Digit)
    End Select
If i = 7 Then Barcoded = Barcoded & "|"
    Next i
    SumForCheck = 10 - SumForCheck Mod 10
    If SumForCheck = 10 Then SumForCheck = 0
    Form_Reco.Barcode.Value = Codice & SumForCheck
End Function
In una maschera con due campi - appunto Barcode(vuoto) e cod (12 cifre)
- se faccio partire la funzione da un bottone, il campo Barcode si
aggiorna con 13 cifre come voglio. Il mio intento è aggiornare il
campo Barcode per tutti i record già presenti nella tabella, magari
con una semplice query. Aspetto con ansia un tuo commento. Ri-ciao.
Alberto

 ha scritto nel messaggio 
news:1153601727.0...@75g2000cwc.googlegroups.com...
Cinzia ha scritto:




Alberto
Ciao Alberto,
la funzione restituisce l'intero barcode a 13 cifre per cui la query di 
aggiornamento sarà
UPDATE TabellaDaAggiornare SET Barcode=Barcoded(cod)
WHERE  barcode is Null
Ho aggiunto la condizione Where per fare in modo di aggiornare i codici 
effettivamente non ancora compilati.
Cinzia
www.riolab.org

Ciao Cinzia,
Avviando la query genera l'errore di run-time '2448': Impossibile
assegnare un valore all'oggetto. Potrei utilizzare un percorso
alternativo per raggiungere lo scopo. Grazie sempre.
Alberto

 ha scritto nel messaggio
news:1153729143.4...@75g2000cwc.googlegroups.com...

Ciao Alberto,
a me la query pare corretta a patto che siano corretti i nomi dei campi e le
funzioni e che sia congruente il tipo ritornato dalla funzione con il tipo
del campo a cui è assegnata.
Se fai una query di questo tipo:
Select TuaTabella.*, BarCoded([cod]) as nuovoEan FROM TuaTabella
Funziona o hai qualche errore?
Ciao


 Funziona o hai qualche errore?
Allora Cinzia, così la query funziona senza generare
errori.Sicuramente c'è un errore di conversione dei dati;questo è il
secondo msg che spunta:
"Impossibile aggiornare tutti i dati nella query di aggiornamento.
Numero di campi non aggiornati per un errore di conversione tra tipi:
2;"
C'è un altro modo per raggiungere lo stesso risultato?Magari da codice
lanciando la funzione ed applicandola a tutti i record esistenti...non
saprei.Scusa se ti sto facendo perdere troppo tempo ma devo fare
funzionare sto programmino entro la settimana. Grazie 1000.
Alberto

 Funziona o hai qualche errore?
Allora Cinzia, cosě la query funziona senza generare
errori.Sicuramente c'č un errore di conversione dei dati;questo č il
secondo msg che spunta:
"Impossibile aggiornare tutti i dati nella query di aggiornamento.
Numero di campi non aggiornati per un errore di conversione tra tipi:
2;"
C'č un altro modo per raggiungere lo stesso risultato?Magari da codice
lanciando la funzione ed applicandola a tutti i record esistenti...non
saprei.Scusa se ti sto facendo perdere troppo tempo ma devo fare
funzionare sto programmino entro la settimana. Grazie 1000.
Alberto
Ciao Alberto,
il problema sembrerebbe dipendere dalla funzione che in alcuni casi ritorna
valori non accettabili, se tu fai girare la query dal tipo di errore
sembrerebbe che  la query funziona tranne in 2 casi o sbaglio? Riusciamo ad
individuare i 2 casi in cui da errore ad esempio facendo:
Select TuaTabella.*  FROM TuaTabella
Where [Cod] not is null AND Barcode Is Null
Riguardando la tua funzione vedo queste stranezze:   (***) sulla riga
(*** aggiunto il tipo di ritorno) Public Function Barcoded(Codice As String)
as string
Dim vSeq As Variant, FirstFlag As Byte
Dim SumForCheck As Integer
Dim i As Long, Digit As Integer
(***  questa usandola da query non va messa)    Codice = Form_Reco.cod.Value
    vSeq = Array(&H0, &HB, &HD, &HE, &H13, &H19, &H1C, &H15, &H16,
&H1A)
(***)Aggiungerei qui
if isNull(Codice) then
     Barcoded = ""
    Exit Function
end if
If Len(Codice) <> 12 Then
    Barcoded = ""
    Exit Function
End If
SumForCheck = 0
For i = 1 To 12
    Digit = Val(Mid(Codice, i, 1))
    SumForCheck = SumForCheck + Digit * IIf(i Mod 2, 1, 3)
    Select Case i
    Case 1
        Barcoded = Chr(&H21 + Digit)
        FirstFlag = vSeq(Digit)
    Case 2
        Barcoded = Barcoded & Chr(&H60 + Digit)
    Case 3 To 7
        Barcoded = Barcoded & Chr(&H30 - &H10 * ((2 ^ (7 - i) And
FirstFlag) > 0) + Digit)
    Case 8 To 12
        Barcoded = Barcoded & Chr(&H50 + Digit)
    End Select
If i = 7 Then Barcoded = Barcoded & "|"
    Next i
    SumForCheck = 10 - SumForCheck Mod 10
    If SumForCheck = 10 Then SumForCheck = 0
(*** eliminare)    Form_Reco.Barcode.Value = Codice & SumForCheck
(*** aggiungere)   BarCoded= Codice & SumForCheck
End Function
Ciao


Cinzia non sai quanto ti ringrazio...funziona!!
Adesso passo alla esportazione della tabella nel formato xls. Penso di
non avere problemi in questo...almeno spero. Ciao e di nuovo
grazzzzie!!
Alberto