Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Access]Selezionare l'ultima fattura di ogni cliente

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

[Access]Selezionare l'ultima fattura di ogni cliente

Postdi MARCOP » 10/05/06 09:33

Devo estrarre dei dati dalla tabella fatture.
TABELLA FATTURE
-id fattura
-data fattura
-cliente
-prezzo totale
La query mi deve restituire tutti i dati dell'ultima fattura (la + recente) emessa per ogni cliente che ho.
Spero di essere stato abbastanza chiaro.
Grazie in anticipo.
MARCOP
Utente Junior
 
Post: 28
Iscritto il: 15/11/04 15:36

Sponsor
 

Postdi GAD » 10/05/06 10:10

Inserisci una combo per selezionare la data di partenza, poi fai
SELECT * FROM TABELLA_FATTURE WHERE data_fattura > 'data_scelta'
Cosi' ottieni tutte le fatture da quella dta in poi.
Se poi la vuoi comporre con l'id_cliente puoi ottenere le ultime da quella data divise per ogni cliente inserendo la select dentro un ciclo for che cicla gli id clienti

SELECT * FROM TABELLA_FATTURE WHERE data_fattura > 'data_scelta' AND id_cliente='my_ID'
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi MARCOP » 10/05/06 10:19

grazie per la prontezza.
La query che devo eseguire mi deve restituire tutti i dati l'ultima fattura emessa in ordine di tempo. Non vorrei dover inserire parametri mentre dalla tua risposta dovrei farlo, esiste un'alternativa. Di pelle non mi sembra una cosa complicata ma ci sbatto la testa da un sacco di tempo.
Ho provato ad inserire nella cella FORMULA della struttura della query la parola "ultimo" e "max" ma mi vengono restituiti tutti i record anzichè quelli relativi all'ultima fattura.
MARCOP
Utente Junior
 
Post: 28
Iscritto il: 15/11/04 15:36

Postdi GAD » 10/05/06 10:26

Volendo si puo' fare ma sarebbe na mezza maialata per le prestazioni.
Fai una select per ottenere tutte le fatture di un solo cliente
select * from tabella_cliente where id_cliente='id_cliente'
poi salvi le fattura in un array.
Adesso che hai le fatture in un array le ordini con la bublbesort in base all'ID_Fatture. Essendo id_fattura autoincrementante avrai l'ultima fattura all'id_ piu' grande. Quindi la fattura buona nel tuo array sarà l'ultimo elemento.

Metti il tutto in una funzione a parte. Crei una nuova funzione e fai una select di tutti i clienti, mentre scorri i record richiami la funzione creata sopra con l'id_cliente..in questo modo ottieni l'ultima fattura per ogni cliente
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi MARCOP » 10/05/06 10:50

Ti ringrazio per l'interessamento.
Premetto che per le mie capacità la tua proposta è difficilmente utilizzabile, ma è perchè con una query non posso estrarre questi semplici dati.
In una prova che ho fatto (escludendo però i campi "id fattura" e "prezzo totale") ho recuperato l' ultima fattura per ogni cliente
SELECT TABELLA FATTURE.cliente, Last(TABELLA FATTURE.datafattura) AS UltimoDiDatafattura
FROM TABELLA FATTURE
GROUP BY TABELLA FATTURE.cliente;
ma se provo ad inserire anche l'id fattura ed il prezzo totale nella griglia della struttura ecco che mi ritornano tutte le fatture anche quelle + vecchie.
Sono stato abbastanza chiaro.
MARCOP
Utente Junior
 
Post: 28
Iscritto il: 15/11/04 15:36

Postdi archimede » 10/05/06 11:59

Supponendo che ID_Fattura sia la chiave primaria temporalmente progressiva:
Codice: Seleziona tutto
SELECT * FROM TABELLA_FATTURE WHERE ID_Fattura IN
(SELECT MAX(ID_Fattura) FROM TABELLA_FATTURE GROUP BY Cliente)
HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Grazie

Postdi MARCOP » 11/05/06 09:07

Grazie come mi hai consigliato funziona.
Ma perche non posso fare la stessa cosa con la data (Tipo dati data/ora).Può capitare di inserire una fattura con data già trascorsa che così risulterebbe la + recente solo perchè l'ho inserita per ultima.
Non ci fosse soluzione adottero la tua idea di cui ti ringrazio ancora.
MARCOP
Utente Junior
 
Post: 28
Iscritto il: 15/11/04 15:36

Re: Grazie

Postdi archimede » 11/05/06 12:02

MARCOP ha scritto:Ma perche non posso fare la stessa cosa con la data (Tipo dati data/ora).Può capitare di inserire una fattura con data già trascorsa che così risulterebbe la + recente solo perchè l'ho inserita per ultima.
Con le date dovrebbe essere possibile, ma è un po' più complesso. Ad esempio, i tuoi campi contengono solo la parte data o anche la parte HH:MM:SS? Nel primo caso (do per scontato che un cliente non inserisca due fatture nello stesso secondo, anche se in caso di import batch non è detto), cosa succede se un cliente ha più di una fattura nella stessa data?

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi MARCOP » 16/05/06 14:18

scusa se non ti ho risposto subito.
1°quesito:il mio campo contiene un formato data/ora gg/mm/aaaa
2°quesito:no, per come è strutturata la contabilità un cliente non può avere 2 fatture nello stesso giorno.
Resto in trepida attesa anche se questa è solo una curiosità visto che con la dritta precedente ho risolto il mio problema.
MARCOP
Utente Junior
 
Post: 28
Iscritto il: 15/11/04 15:36

Postdi archimede » 16/05/06 14:43

MARCOP ha scritto:per come è strutturata la contabilità un cliente non può avere 2 fatture nello stesso giorno.
Allora un modo (non necessariamente il più efficiente) può essere:
Codice: Seleziona tutto
SELECT F.* FROM tabella_fatture F WHERE F.ID_Fattura IN
(SELECT ID_Fattura FROM tabella_fatture WHERE
 data_fattura=(SELECT MAX(data_fattura) FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente))
HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

bigrazie

Postdi MARCOP » 17/05/06 12:26

Doppio grazie Alessandro anche per questo consiglio che proverò nel fine settimana, ti faccio sapere.
Grazie.
MARCOP
Utente Junior
 
Post: 28
Iscritto il: 15/11/04 15:36

Postdi archimede » 18/05/06 08:05

archimede ha scritto:
Codice: Seleziona tutto
SELECT F.* FROM tabella_fatture F WHERE F.ID_Fattura IN
(SELECT ID_Fattura FROM tabella_fatture WHERE
 data_fattura=(SELECT MAX(data_fattura) FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente))
Riguardandolo con il cervello acceso, mi accorgo che trattasi di vaccata. :oops:

La query corretta dovrebbe essere:
Codice: Seleziona tutto
SELECT F.* FROM tabella_fatture F WHERE F.ID_Fattura IN
(SELECT ID_Fattura FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente AND
 data_fattura=(SELECT MAX(data_fattura) FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente));
Inspiegabilmente, però, anche la prima query sembra ritornare gli stessi risultati: :eeh:
Codice: Seleziona tutto
create table  tabella_fatture (ID_Fattura NUMBER, ID_Cliente NUMBER,data_fattura DATE);
INSERT INTO tabella_fatture VALUES (4,0,'1-JAN-1999');
INSERT INTO tabella_fatture VALUES (7,0,'1-JAN-2001');
INSERT INTO tabella_fatture VALUES (1,1,'1-JAN-2001');
INSERT INTO tabella_fatture VALUES (2,1,'1-JAN-2002');
INSERT INTO tabella_fatture VALUES (3,2,'1-JAN-2003');
INSERT INTO tabella_fatture VALUES (5,2,'10-OCT-2003');
INSERT INTO tabella_fatture VALUES (6,2,'1-JAN-2001');
SELECT * FROM tabella_fatture ORDER BY ID_FATTURA;

ID_FATTURA ID_CLIENTE DATA_FATTURA
---------- ---------- ------------
         1          1 01-JAN-01
         2          1 01-JAN-02
         3          2 01-JAN-03
         4          0 01-JAN-99
         5          2 10-OCT-03
         6          2 01-JAN-01
         7          0 01-JAN-01

7 rows selected.

SELECT F.* FROM tabella_fatture F WHERE F.ID_Fattura IN
 (SELECT ID_Fattura FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente AND
  data_fattura=(SELECT MAX(data_fattura) FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente));

ID_FATTURA ID_CLIENTE DATA_FATTURA
---------- ---------- ------------
         7          0 01-JAN-01
         2          1 01-JAN-02
         5          2 10-OCT-03

SELECT F.* FROM tabella_fatture F WHERE F.ID_Fattura IN
 (SELECT ID_Fattura FROM tabella_fatture WHERE
  data_fattura=(SELECT MAX(data_fattura) FROM tabella_fatture WHERE ID_Cliente=F.ID_Cliente));

ID_FATTURA ID_CLIENTE DATA_FATTURA
---------- ---------- ------------------
         7          0 01-JAN-01
         2          1 01-JAN-02
         5          2 10-OCT-03
Forse il mio cervello non è ancora del tutto acceso dopo tutto... se qualcuno volesse illuminarmi...

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova


Torna a Programmazione


Topic correlati a "[Access]Selezionare l'ultima fattura di ogni cliente":


Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti