Merce, Prezzo Vendita e Prezzo Acquisto

di
Anonimizzato18349
il
9 risposte

Merce, Prezzo Vendita e Prezzo Acquisto

Ciao a tutti, sono nuovo; conosco abbastanza bene Access, benino SQL per niente VBA.
Vi sottopongo il problema che sto tentando di risolvere in Access, (ma niente mi vieta di usare SQL):
calcolare il guadagno per ogni merce, sottraendo al prezzo di vendita applicato in fattura,
il costo di acquisto sostenuto per comprare la stessa merce con data ft precedente E più recente alla fattura di vendita
non mi importa quindi da chi ho comprato, ma solo “ quando “ e “ a quanto? “

ESEMPIO
Fattura Vendita num.100 del 10-sett-2015 , Toner Nero venduto a 55€
Fattura Vendita num.150 del 25-sett-2015 , Toner Nero venduto a 60€

Fattura Acquisto num.B12 del 01-sett-2015 , Toner Nero acquistato a 40€
Fattura Acquisto num.C13 del 12-sett-2015 , Toner Nero acquistato a 50€
Fattura Acquisto num.D14 del 20-sett-2015 , Toner Nero acquistato a 45€

Il prezzo di acquisto del toner venduto con la ft num.100 sarà obbligatoriamente pari a 40€ (unica ft acquisto fatta prima della ft vendita) dandoci così un utile di 15€
il prezzo di acquisto del toner venduto con la ft num.150 sarà obbligatoriamente pari a 45€ (ft acquisto precedente alla ft di vendita E fattura più vicina alla data di vendita)

Altro modo di spiegare la cosa:
tutte le fatture di vendita di Toner Nero emesse dal 01-sett-2015 al 11-sett-2015 saranno valorizzate con un costo di 40€
tutte le fatture di vendita di Toner Nero emesse dal 12-sett-2015 al 19-sett-2015 saranno valorizzate con un costo di 50€
tutte le fatture di vendita di Toner Nero emesse dal 20-sett-2015 al “infinito” saranno valorizzate con un costo di 45€

Lo scoglio che non riesco a superare è quello di trovare i range di date come appena indicato.

Il database è su SQL a cui accedo tramite Access in ODBC.
La struttura del database è la seguente:
SaleDoc = Campi di testata fattura vendita: SaleDocId, cliente, data, numero
SaleDocDetail = Campi riga fattura vendita: SaleDocId, articolo, prezzo vendita, Q.ta

PurchaseDoc = Campi di testata fattura acquisto: PurchaseDocId, fornitore, data, numero
PurchaseDocDetail = Campi riga fattura acquisto: PurchaseDocId, articolo, prezzo acquisto, Q.ta

9 Risposte

  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    Hai spiegato tutto, ma ti sei dimenticato di mostrare la query!
    A parte questo, non è per caso che passi le date nel formato italiano: DD/MM/YYYY, invece di passare le date nel formato americano: MM/DD/YYYY (come dovrebbe essere)?
    Questo spiegherebbe il problema.

    Comunque, mostra la query.
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    Per prima cosa ammetto di essermi perso il divieto, mi dispiace di aver postato la stessa domanda su vari forum ma ho assolutamente bisogno del vostro aiuto, ho "scommesso" sbagliando sulla legge dei grandi numeri

    per seconda cosa grazie gibra della risposta

    il problema è che non so come scrivere la query... mi serve un'imboccata.
    faccio la query solo sulla PurchaseDocDetail ,
    raggruppo il codice articolo,
    ad ogni cambio fattura (da identificare tramite numero e/o protocollo) i 3 campi "Prezzo", "Data Inizio Validità Prezzo" , "Data Fine Validità Prezzo" vengono aggiornati come di seguito:

    "Prezzo" l'imponibile della fattura che sto analizzando ;
    "Data Inizio Validità Prezzo" la data della fattura che sto analizzando ;
    "Data Fine Validità Prezzo" la data della fattura successiva -1 giorno

    la fase successiva ossia attribuire un costo sulla merce venduta, lo ho già preparata e funziona con dati inseriti a mano in db di test
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    Scusa, ma non capisco.
    Vuoi dire che non sai fare una banale query di selezione?
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    Quello che non so fare è trovare la data di fine validità di un prezzo. La data di fine validità corrisponde alla data della fattura successiva con cui ho comprato lo stesso articolo.
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    FabioBrambo ha scritto:


    Ciao a tutti, sono nuovo; conosco abbastanza bene Access
    almeno quello!

    FabioBrambo ha scritto:


    per niente VBA.
    andiamo male

    FabioBrambo ha scritto:


    benino SQL
    ... (ma niente mi vieta di usare SQL):
    Solo dopo aver letto l'intero post ho capito che con il termine SQL tu intendi il database Microsoft SQLServer. SQL e basta ha un altro significato (più di uno se è per quello: Structured? Standard?) e visto che il rischio di fraintendimento è elevato vedi di correggere questa (diffusa, non solo tua) abitudine, almeno sul forum.

    FabioBrambo ha scritto:


    calcolare il guadagno per ogni merce, sottraendo al prezzo di vendita applicato in fattura, il costo di acquisto sostenuto per comprare la stessa merce con data ft precedente E più recente alla fattura di vendita non mi importa quindi da chi ho comprato, ma solo “ quando “ e “ a quanto? “
    Precisando che non so niente di SqlServer, lavoro solo su Access "puro", quindi la via che ti indico potrebbe non essere ottimizzata per il tuo "ambiente", per una situazione che ha alcuni aspetti in comune a questa, quando ero giovane (del forum) ed inesperto (di codice, lo sono ancora ma un po' meno) ero intervenuto in questo thread: http://www.iprogrammatori.it/forum-programmazione/access/query-ricorsiva-t21945.html
    che può, secondo me, darti qualche spunto. Già adesso, andando a rileggere il thread, ho visto che si poteva fare di meglio ma... ero giovane ed inesperto.
    Forse è addirittura "troppo" per quello che hai chiesto ma... quello avevo fatto.
    La maggiorparte del lavoro è via codice. Si potrebbe portare tutto su codice, creando una funzione che restituisca quello che ti interessa, cioè il prezzo d'acquisto più prossimo a quello di vendita. Prova, segnala i problemi pubblicando quello che hai fatto e vediamo di arrivare in fondo. Se trovi la soluzione subito pubblica anche quella, ovviamente.
    Quando posso rileggo il thread (questo e quello richiamato) e vedo di illustare, con le conoscenze di oggi, quello che farei adesso.
    PS: Chi ha avuto la brillante idea di chiamare un campo [Data]? Spero che sia solo a titolo di esempio.
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    Segnalo anche quì:
    "http://forum.masterdrive.it/access-79/articolo-prezzo-vendita-prezzo-acquisto-92373/"
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    Ciao Philcattivocarattere,
    ho usato il codice del link che mi hai postato e fa quello che devo fare.
    dovendo però presentare dei dati, ho sopperito a questo problema creando il risultato della query in excel. Non mi piace come soluzione, ma mi hanno messa molta fretta.

    Ora, con più calma posso adattare il tuo elaborato, alle mie esigenze.
    Procederò quindi a usare la funzione direttamente nella query, in modo tale da poterla utilizzare.
    Cercherò di trovare (e qui chiedo ancora aiuto sul dove trovarlo ed integrarlo all'interno della funzione) il comando che "resetta" la funzione al modificarsi del valore di un campo.

    PS: nella realtà il campo [Data] si chiama [SaleDocumentDate] o [PurchaseDocumentDate] a seconda che si tratti di un documento del ciclo di fatturazione Attivo oppure Passivo

    Ciao e Grazie
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    FabioBrambo ha scritto:


    ...
    Procederò quindi a usare la funzione direttamente nella query, in modo tale da poterla utilizzare.
    Cercherò di trovare (e qui chiedo ancora aiuto sul dove trovarlo ed integrarlo all'interno della funzione) il comando che "resetta" la funzione al modificarsi del valore di un campo.
    ...
    Come avevo anticipato nel mio primo intervento avevo detto che a quel tempo ero inesperto e che forse quanto contenuto in quel thread eccedeva la tua necessità.
    Fin da subito m'era balenata un'altra idea che semplificherebbe di molto il lavoro e che se ne infischia degli intervalli di tempo.
    Il ragionamento più volte evidenziato è quello di trovare il prezzo d'acquisto per quel prodotto più prossimo (ma antecedente) alla data di vendita.
    Si crea una funzione che apre un recordset su una stringa SQL costruita ad hoc passando come parametri i campi che inserisci nella query.
    Abbozzo la funzione e integro questo post o ne aggiungo uno
    ====
    Ipotizzando una Qry1 che mette in relazione SaleDoc e SaleDocDetail e che l'articolo sia identificato con un valore numerico, dove Purch_Price è il prezzo d'acquisto
    Public Function RecentPrice(dtaSaleDocument as Date, lngArticolo as long) As Long
    Dim rst As DAO.Recordset
    Dim strSQL as String
    strSQL = "SELECT TOP 1 Purch_Price FROM Qry1 WHERE Purch_Art = " & lngArticolo
    strSQL = strSQL & " AND Purch_Date < #" & dtaSaleDocument & "# ORDER BY Purch_date DESC"
    debug.print strSQL 'per vedere nella finestra immediata 
    Set rst = CurrentDB.OpenRecordset(strSQL, dbOpenDynaset)
    GetRecentPrice = rst![Purch_Price].Value
    Rst.Close
    Set rst = Nothing
    End Function
    (ho scritto tutto su editor di testo normale, potrebbero esserci errori di sintassi)
    La sostanza è tutta in "TOP 1" e "ORDER BY" così restituisce 1 record solo, con il prezzo corrispondente alla data d'acquisto più elevata
    Il valore restituito è Long. Se servono i decimali bisogna cambiare.
    Probabilmente c'è da lavorare sul formato della data usando Format (vedi il suggerimento di Gibra).
    La strada è tracciata e secondo me molto più semplice della gestione degli "intervalli di validità" (come invece era nel più volte citato vecchio thread)
  • Re: Merce, Prezzo Vendita e Prezzo Acquisto

    X FabioBrambo : per quanto riguarda il cross posting faccio un eccezione perché hai ammesso l'errore e sei nuovo, quindi ti concedo il beneficio del dubbio.
    Mi raccomando d'ora in poi di attenerti al nostro regolamento, grazie
Devi accedere o registrarti per scrivere nel forum
9 risposte