Italian Come impostare query per avere lista articoli "..gia' forniti a cliente.." come l'ultima volta ?

amorosik

Expert
Licensed User
Supponiamo di disporre delle classiche tabelle
- Articoli
- DocumentiTestate
- DocumentiRighe

Su DocumentiRighe c'e' un campo Numero_Riga, specifico questo perche' poi la richiesta sara' di prendere solo l'ultima evenienza dove appare un certo articolo
Su DocumentiTestate ci sono documenti di tutti i tipi e quindi ddt vendita, fatture immediate, fatture differite, preventivi, ordini, ecc..
Avrei bisogno di visualizzare su una griglia tutti gli articoli, inclusi nella attuale tabella Articoli, che siano stati forniti almeno una volta al cliente con alcuni tipi di documenti, ad esempio con ddt vendita, con fatture immediate, e fatture differite, o altro documento da definire
Quindi una sola riga per ogni articolo gia' fornito, prendendo tra le righe documenti, e prendendo l'ultima riga del documento con data piu' recente possibile
Questo perche' devo prendere anche il prezzo vendita, che per lo stesso articolo, stesso cliente, su docuemti diversi potrebbe anche essere diverso
Inizialmente pensavo di fare una join tra testate e righe, filtrare per cliente e tipo documento che mi interessa, e raggruppare per codice articolo, ma non funziona come servirebbe a me sia perche' mi prende dentro sia righe descrittive, sia perche' visualizza anche articoli obsoleti che attualmente non sono piu' presenti dentro la tabella Articoli, ma soprattutto perche' il raggruppamento mi impedisce di 'vedere' il prezzo dell'ultima riga quella dove e' stato fornito l'articoo al cliente "l'ultima volta"
Mi sembrava un problemino banale, ma proprio banale dopo qualche tentativo non sembra essere

Ricapitolando, vorrei realizzare una query che prenda dalle righe documenti di un certo tipo, e mi visualizzi solo le righe dove appaiano articoli presenti nella tabella Articoli (e quindi verrebbero esclusi eventuali forniture di articolo non piu' presenti nella tabella Articolo attualmente) e solo una riga per articolo, quella del documento piu' recente, numero_riga piu' grande
In sostanza se l'articolo cod 001 e' stato venduto su tutti gli ultimi 10 Ddt Vendita, produtta' nella query solamente una riga, presa dal documento con data piu' recente
Come fareste voi?
 

giannimaione

Well-Known Member
Licensed User
Longtime User
non mi è chiaro il tuo post:

alcune considerazioni:

1) articolo NON presente nella tabella articoli ???
2) non hai speciificato come "unire" documentirighe con documentitestate,

B4X:
SELECT
    a.nomearticolo,
    r.idarticolo,
    f.datadocumento
    FROM rigofatture AS r
    LEFT JOIN articoli AS a ON a.idarticolo = r.idarticolo
    LEFT JOIN varifatture AS f ON f.id = r.idfatture
    GROUP BY r.idarticolo
    ORDER BY f.datadocumento DESC
 

amorosik

Expert
Licensed User
Intendo dire che in passato era presente articolo

"001 Acqua minerale Vaiassa"

E magari e' stato fornito al cliente e quindi e' presente in alcune righe dei documenti
Ma poi e' stato eliminato e quindi attualmente non piu' fornibile, quindi nella tabella ARTICOLI attualmente NON c'e' piu' il "001 Acqua minerale Vaiassa"
E se non c'e' nella tabella Articoli, NON deve essere restituito dalla query
In pratica la query dovrebbe mostrare tutti gli articoli forniti al cliente (presenti nelle righe documenti a lui intestati), ed ancora fornibili (presenza su tabella Articoli)
Ogni articolo deve essere preso dalla riga documenti piu' recente, e quindi il prezzo dell'articolo sara' quello usato nell'ultima fornitura (nel passato quell'articolo potrebbe essere stato fornito ad un prezzo diverso, quindi vorrei prendere la riga documenti piu' recente possibile)

Per unire le tabelle DocumentiTestate e DocumentiRighe, sulla seconda c'e' un campo (id_documentitestate) che indica a che testata e' collegata ogni riga del corpo di un documento
Tipo "select * from DocumentiTestate left join DocumentiRighe on DocumentiTestate.id_documentitestate=Documen tiRighe.id_documentitestate ....
 
Last edited:

amorosik

Expert
Licensed User
non mi è chiaro il tuo post:

alcune considerazioni:

1) articolo NON presente nella tabella articoli ???
2) non hai speciificato come "unire" documentirighe con documentitestate,

B4X:
SELECT
    a.nomearticolo,
    r.idarticolo,
    f.datadocumento
    FROM rigofatture AS r
    LEFT JOIN articoli AS a ON a.idarticolo = r.idarticolo
    LEFT JOIN varifatture AS f ON f.id = r.idfatture
    GROUP BY r.idarticolo
    ORDER BY f.datadocumento DESC

Non posso raggruppare gli articolo per codice (o idarticolo) perche' non riuscirei ad avere quantita e prezzo
Vorrei prendere l'ultima evenienza della fornitura di quell'articolo, questo per avere nche la quantita ed il prezzo dell'ultima volta
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Ho girato la domanda a ChatGPT :

ecco la risposta, non so se funziona :

query:
SELECT
  Articoli.Codice_Articolo,
  MAX(DocumentiRighe.Numero_Riga) as Ultima_Riga,
  MAX(DocumentiRighe.Prezzo) as Ultimo_Prezzo,
  MAX(DocumentiTestate.Data) as Ultima_Data
FROM
  Articoli
  JOIN DocumentiRighe ON Articoli.Codice_Articolo = DocumentiRighe.Codice_Articolo
  JOIN DocumentiTestate ON DocumentiRighe.Id_Testata = DocumentiTestate.Id_Testata
WHERE
  DocumentiTestate.Tipo_Documento IN ('ddt vendita', 'fatture immediate', 'fatture differite')
GROUP BY
  Articoli.Codice_Articolo
 

Lello1964

Well-Known Member
Licensed User
Longtime User
B4X:
SELECT
  Articoli.Codice_Articolo,
  MAX(DocumentiRighe.Numero_Riga) as Ultima_Riga,
  MAX(DocumentiRighe.Prezzo) as Ultimo_Prezzo,
  MAX(DocumentiTestate.Data) as Ultima_Data
FROM
  Articoli
  LEFT JOIN DocumentiRighe ON Articoli.Codice_Articolo = DocumentiRighe.Codice_Articolo
  LEFT JOIN DocumentiTestate ON DocumentiRighe.Id_Testata = DocumentiTestate.Id_Testata
WHERE
  DocumentiTestate.Tipo_Documento IN ('ddt vendita', 'fatture immediate', 'fatture differite')
  AND DocumentiRighe.Codice_Articolo IS NOT NULL
GROUP BY
  Articoli.Codice_Articolo
ORDER BY
  Ultima_Data DESC, Ultima_Riga DESC
LIMIT 1
 

Lello1964

Well-Known Member
Licensed User
Longtime User
la risposta di chatGpT :


Per riassumere la tua richiesta, vorresti realizzare una query che:

  1. Seleziona solo le righe dei documenti di un certo tipo (es. "ddt vendita", "fatture immediate", "fatture differite").
  2. Visualizza solo le righe dove appaiono articoli presenti nella tabella "Articoli" e esclude gli articoli non più presenti.
  3. Mostra solo una riga per articolo, quella del documento più recente con numero riga più grande.
  4. In caso l'articolo cod 001 è stato venduto su tutti gli ultimi 10 Ddt Vendita, produrrà nella query solamente una riga, presa dal documento con data più recente.
Per realizzare questa query, potresti utilizzare una combinazione di join, filtri e funzioni di aggregazione. In particolare, potresti utilizzare una "LEFT JOIN" tra la tabella "Articoli" e le tabelle "DocumentiTestate" e "DocumentiRighe" per unire i dati delle diverse tabelle e filtrare le righe in cui gli articoli non sono più presenti nella tabella "Articoli". Successivamente, potresti utilizzare un filtro per selezionare solo i documenti di tipo "ddt vendita", "fatture immediate" e "fatture differite" (o qualsiasi altro tipo di documento che ti interessa). Potresti quindi utilizzare la funzione di aggregazione "GROUP BY" per raggruppare i dati per codice articolo e successivamente utilizzare funzioni di aggregazione come "MAX()" e "MIN()" per selezionare la riga con Numero_Riga più grande e data più recente. La query potrebbe essere simile a questa:

scusate se mi sono intromesso, ma volevo fare un test delle capacità di chatGPT.
 

LucaMs

Expert
Licensed User
Longtime User
Visualizza solo le righe dove appaiono articoli presenti nella tabella "Articoli" e esclude gli articoli non più presenti.
Sta imparando l'italiano corrente, ovvero sbagliato.
Corretto sarebbe:
Visualizza solo le righe IN CUI appaiAno articoli presenti nella tabella "Articoli" e escludI gli articoli non più presenti.
Ma oggi parlano così anche i telegiornalisti e "VIP" vari. Scommetto anche professori d'italiano!
 

amorosik

Expert
Licensed User
scusate se mi sono intromesso, ma volevo fare un test delle capacità di chatGPT.

Ah, inizialmente pensavo tu stessi scherzando
Invece mi par di capire che la risposta sia stata fornita realmente da chatGpt
Incuriosito ho provato a registrarmi per fare qualche prova, mi chiede il cillulare, che sembra indispensabbole
C'e' modo di registrarsi/loggarsi SENZA dargli il telefonino?
 
Top