Newsgroup: it.comp.appl.access
Titolo: origine controllo maschera con più criteri

Salve.
Nella form frmAziende ho due controlli: UltimaFattura e DataUltimaFattura
Fino a che emettevo solo fatture cartacee il codice era ok. 
Con l'emissione anche delle fatture elettroniche, ho inserito nella tabella tblfatture un campo IdTipoFattura (1 fatture ordinarie e 2 fatture elettroniche).
Ho quindi duplicato i controlli, uno per tipologia, e per ognuno l'origine controllo deve prevedere due criteri: IdAzienda e IdTipoFattura. 
Per la data ho provato con:
=DMax("[DataFattura]";"[tblfatture]";"[IdAzienda]= " & [Maschere]![frmAziende]![IDAzienda] And "[IdTipoFattura]= " & 1) 
ma non tiene conto del secondo criterio.
 
Per il controllo ultima fattura, di cui il formato per le fatture ordinarie è 001/aaaa mentre per quelle elettroniche è 001/FE/aaaa, l'attuale origine del controllo è: 
=Format(IIf(IsNull(DMax("[NDocumento]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda] & " AND [NDocumento]like '???/" & Format(DMax("[DataFattura]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda]);"aa") & "'"));"";Mid(DMax("[NDocumento]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda] & " AND [NDocumento] like '???/" & Format(DMax("[DataFattura]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda]);"aa") & "'");1;3));"000") & Format(IIf(IsNull(DMax("[NDocumento]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda] & " AND [NDocumento]like '???/" & Format(DMax("[DataFattura]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda]);"aa") & "'"));"";"/")) & Format(DMax("[DataFattura]";"[tblFatture]";"[IDAzienda]= " & [Maschere]![frmAziende]![IDAzienda]);"aa")
ma mi restituisce le ultime due cifre dell'anno evidentemente perchè nello stesso campo ci sono a volte numeri con 8 caratteri ed altri con 11.
 
E' possibile inserire un doppio criterio? Dove e come lo scrivo?
Grazie anticipate.
Giuseppe

 ma non tiene conto del secondo criterio.
 
ho guardato SOLO la composizione del criterio,
prova a riscriverlo come segue:
 
=DMax("[DataFattura]";"[tblfatture]";"[IdAzienda]= " & [Maschere]![frmAziende]![IDAzienda] & " And [IdTipoFattura]= 1") 


Perfetto Giorgio grazie tante.
Per il controllo UltimoNumeroFattura, nella tabella tblfatture ho un campo numerico (NDoc) da cui, in base alla data e all'azienda devo estrapolare, per ognuno dei due tipi di fattura in due controlli diversi, l'ultima fattura emessa.
Ho fatto tanti tentativi ma non ci sono riuscito, dove inserisco i riferimenti al campo NDoc per ottenere il numero dell'ultima fattura?
Continuo a far prove, mi dai una dritta anche qui?
Giuseppe


per adesso rispondo con una domanda (sic !) e un'osservazione
 
la domanda:
la form è singola (come sembra ovvio, quindi con UN SOLO valore IDAzienda visibile), e la data è a scelta oppure devi utilizzare quella ottenuta con l'espressione precedente ? (che apparirà in un controllo della form ?)
 
l'osservazione (anzi due in una):
poiché compongo procedure medio-piccole mi attengo a "regole piuttosto personali" per rendere più agevole (e riutilizzabile) quello che comunque "viene fuori" corretto
 
quindi
se l'espressione da generare per ricavare un valore di sintesi (da mostrare in un controllo)è piuttosto complessa (e noto che spesso il tipo-dato data aumenta la complessità ...)
preferisco scrivere l'espressione (e tenere il risultato) in una query che "dovrebbe" avere un solo campo ("il risultato cercato") o un solo record. Poi il controllo sulla form ha come origine =Dlookup(nomecampo; nomequery) e ovviamente occorre forzare il refresh ad ogni variazione che possa far variare quel valore  

 preferisco scrivere l'espressione (e tenere il risultato) in una query che "dovrebbe" avere un solo campo ("il risultato cercato") o un solo record. Poi il controllo sulla form ha come origine =Dlookup(nomecampo; nomequery) e ovviamente occorre forzare il refresh ad ogni variazione che possa far variare quel valore  
 
siccome fino a che emettevo solo fatture cartacee l'origine del controllo funzionava perfettamente, ho ritenuto più comodo inserire l'ulteriore criterio piuttosto che creare più query ognuna per tipologia di fattura. Oltrettuto avendo convertito il campo contentente il numero fattura da formato testo a formato numerico, l'origine del controllo risulterebbe meno complessa rispetto a prima.
 
Giuseppe
 
Giuseppe

 Giuseppe
 
prova questo, se è NDoc da tirar fuori
se va bene sono DUE espressioni: 
... And [IdTipoFattura]= 1")  
... And [IdTipoFattura]= 2")  
 
 
=DMax("[NDoc]";"[tblfatture]";"[IdAzienda]= " & [Maschere]![frmAziende]![IDAzienda] & " AND [DataFattura]=#" & [Maschere]![frmAziende]![nomeControlloConMaxData] & "# And [IdTipoFattura]= 1")
 
considerando che ci saranno più fatture con la dataMAX
 
NOTE: 
-il tipodato data necessita di essere contenuto fra # 
-forse sarà necessario forzare il refresh di [nomeControlloConMaxData] 
E di questi due controlli 
(se non riescono "a seguire" le registrazioni effettuate)
-occorre anche che il risultato presente nel controllo con MaxData
sia "visto da Access" come tipodato data
(forse lo fa in automatico, altrimenti agire sulle proprietà ?)
 
 
comunque il richiamo sull'utilizzo di query valeva anche per questo fatto:
si prende più dimestichezza con la sintassi specie se ci sono criteri complessi,
la query segnala gli errori di sintassi, mentre non avviene così scrivendo l'enunciato in un controllo (textbox) o nel codice


Ciao Giorgio, grazie ancora.
Per quelle elettroniche il risultato è corretto.
Per quelle cartacee non mi restituisce nè errore, nè alcun risultato.
Ho verificato entrambi i controlli contenenti le date massime delle due tipologie di fatture ed entrambe sono di tipo gg/mm/aa.
Anche il nome del controllo, che ho variato ad entrambi, è corretto.
Utilizzando la query con il seguente codice
SELECT tblFatture.IDAzienda, tblFatture.IdTipoFattura, Last(tblFatture.NDoc) AS UltimoDiNDoc, Last(tblFatture.DataFattura) AS UltimoDiDataFattura
FROM tblFatture
GROUP BY tblFatture.IDAzienda, tblFatture.IdTipoFattura
HAVING (((tblFatture.IDAzienda)=[forms]![frmaziende].[idazienda]) AND ((tblFatture.IdTipoFattura)=1));
il risultato esce corretto.
Non riesco a capire perchè in un caso funziona e nell'altro no.
Giuseppe

 Giuseppe
 
grosso modo è la stessa cosa con Last invece di Max
 
penso ad un poco percettibile errore di (ri)scrittura dell'espressione =DMAx...
o al fatto che l'espressione NON è inserita nella proprietà OrigineControllo
 
e ripeto di controllare la proprietà FORMATO del controllo (textbox ?):
meglio imporre Data senza fidarsi del fatto che "appare" come una data
e se è necessario forzare il requery del controllo
 
alle brutte metti una dlookup sul campo UltimoDiNDoc della query salvata come OrigineControllo della textbox (ancora controllare se necessario il requery del controllo) 
 
 
 


Giorgio ti ringrazio di tutto.
Sicuramente c'è qualcosa che non va e che non mi permette di ottenere lo stesso risultato cambiando i riferimenti relativi. Se non dovessi riuscire temporanemante applicherò il Dlookup con riferimento alla query.
Un saluto.
Giuseppe