Lista valori con contenuto variabile.

Lista valori con contenuto variabile.

0
0

Buongiorno,
un saluto a tutti, questo è il mio promo post. Grazie per l’attenzione che vorrete dedicarmi.

Ho evidentemente un problema, che credo sia anche bello tosto.
Provo a spiegarmi nel migliore dei modi.

Sto realizzando una gestione per il noleggio di macchine, nel caso specifico legati all’edilizia.
L’obiettivo che non riesco a risolvere è quello di presentare in un elenco a discesa, la scelta della macchina che per il periodo indicato per il contratto in stesura, non sia già impegnata in un altro noleggio.

Ad esempio, il nuovo contratto serve per il noleggio di un Montacarichi per il periodo 10/01/15 – 23/01/15
Nel periodo indicato, posso avere un o più contratti che sono inclusi come periodo, oppure si accavallano. Ad esempio non andranno rese selezionabili le macchine presenti nei noleggi che vanno dal 28/12/2014 al 15/01/15, così come vanno escluse le macchine che sono già noleggiate per il periodo 20/01/15 al 30/01/15

Ho allegato lo schema delle relazioni legate al file principale “noleggio”.
In giallo e sulla dx, trovate tutte le relazioni necessarie alla stesura del contratto.

Sulla sinistra ed in grigio, ho ridefinito una relazione tra la tabella “noleggio” e se stessa “noleggio_NOLEGGIO” dove elenco tutti i contratti che si accavallano con le date.
Questa definizione è corretta e funziona.

A “noleggio_NOLEGGIO” ho legato il relativo dettaglio, “noleggio_noleggio_NOLEGGIODETTAGLIO”, ottenendo così le n righe di dettaglio con tutte le macchine in noleggio per il periodo preso in esame, a cui ho poi legato una ridefinizione della Tabella Macchine, che mi riporta solo ed unicamente l’elenco delle macchine utilizzate. (in verde “noleggio_noleggio_noleggiodettaglio_MACCHINE”)

Quindi se per ipotesi la macchina con ID=1 è presente più volte, in questa ultima relazione è elencata una volta sola.

Fin qui tutto perfettamente funzionante e corrispondente alle attese.

L’ideale sarebbe poter definire una relazione tra “noleggio_noleggio_noleggiodettaglio_MACCHINE” e un suo duplicato “noleggio_noleggio_noleggiodettaglio_macchine_MACCHINE” che esprima tutte le ricorrenze che non sono già presenti nella tabella (o meglio relazione) precedente ed utilizzarla come fonte per la lista a discesa.

MA QUESTO NON È POSSIBILE.

Quale soluzione allora?
Grazie
Giorgio

Segnalato come spam
Pubblicata da (Domande: 6, Risposte: 10)
Domanda inviata 8 Gennaio 2015 09:52
91 vis.
0
Domanda privata

OK!!!

scritto così:
———————————————————————————————————————————————————————————————
Dichiara (
[
articoliInUso = EseguiSQL ( ” SELECT M.ID_Macchine FROM noleggio NT , noleggiodettaglio ND , macchine M WHERE NT.ID_Noleggio <> ? AND NT.inizioNolo < = ? AND NT.fineNolo >= ? AND ND.IDf_Noleggio = NT.ID_Noleggio AND ND.IDf_Macchine = M.ID_Macchine ORDER BY M.ID_Macchine ” ; ”” ; ”,” ; idAttuale ; dataFine ; dataInizio )
;
stringaSQL = ” SELECT ID_Macchine FROM macchine WHERE ID_Macchine NOT IN (” & articoliInUso & ”) ORDER BY ID_Macchine ”
;
tutti = ” SELECT ID_Macchine FROM macchine ORDER BY ID_Macchine ”
]
;

If ( EVuoto ( articoliInUso ) ; EseguiSQL ( tutti ; ”” ; ”” ) ; EseguiSQL ( stringaSQL ; ”” ; ”” ) )

)
———————————————————————————————————————————————————————————————
funziona perfettamente.
Anche se avrebbe dovuto funzionare anche nell’altro modo. Ma a queste stranezze sono abituato. (ahahahah)
.
Comunque, grazie anche al vostro (tuo, Giulio in particolare) supporto, sono finalmente arrivato alla soluzione ricercata.
Alla fine del giro, adesso ho un campo sulla tabella noleggi che contiene tutte le macchine (che per fortuna sono poche) disponibile per quel contratto e per quelle date.
A queste ho correlato la tabella Macchine, utilizzando una relazione con la stessa tabella partendo dal campo precedentemente valorizzato con la CF.
.
A prima vista sembra ok, ma sarà necessario effettuare un po’ di test approfonditi per esserne certo.
.
Grazie 1000, ci vediamo, spero, per la certificazione.
Giorgio

Segnalata come spam
Pubblicata da (Domande: 6, Risposte: 10)
Risposta inviata 12 Gennaio 2015 16:31
0
Domanda privata

secondo me è un problema di sintassi. A dichiarare prima il refila e a costruire la query con ” e & funziona?

.g.

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 1544)
Risposta inviata 12 Gennaio 2015 15:52
0
Domanda privata

Ciao,
ho fatto dei progressi e voglio aggiornarvi.
Anche perché mi fa una cosa che mi sta mandando ai matti!!!!
.
Ho scritto un CF, che vi riporto:
———————————————————————————————————————————————————————————————-
Dichiara (
/* */
articoliInUso = EseguiSQL ( ” select M.ID_Macchine from noleggio NT , noleggiodettaglio ND , macchine M where NT.ID_Noleggio <> ? and NT.inizioNolo < = ? and NT.fineNolo >= ? and ND.IDf_Noleggio = NT.ID_Noleggio and ND.IDf_Macchine = M.ID_Macchine order by M.ID_Macchine ” ; ”” ; ”,” ; idAttuale ; dataFine ; dataInizio )
/* */
;
/* */
EseguiSQL ( ” select ID_Macchine from macchine where ID_Macchine NOT IN (?) order by ID_Macchine ” ; ”” ; ”” ; Refila(articoliInUso) )
/* */
/* articoliInUso */
/* */
)
———————————————————————————————————————————————————————————————-
Questa CF calcola un campo nella tabella ”noleggi”
La situazione è questa:
il campo ”articoliInUso” viene correttamente valorizzato, nel caso specifico con il mio DB calcola una lista che contiene : 1,2,2,9,16
Se inserisco a mano questi valori nella SQL successiva, viene calcolato correttamente l’elenco delle macchine NON IN USO.
Se uso la variabile, così come ho riportato nella CF, mi porta l’elenco di tutta l’anagrafica Macchine.
STO USCENDO LETTERALMENTE SCEMO
Continuo a cercare la soluzione e vi faccio sapere.

Segnalata come spam
Pubblicata da (Domande: 6, Risposte: 10)
Risposta inviata 12 Gennaio 2015 15:33
0
Domanda privata

eh già, non ci avevo pensato a questa ciliegina :)
grazie

Mikhail

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 15)
Risposta inviata 11 Gennaio 2015 14:03
0
Domanda privata

esatto, mik :)
anche se a voler essere pignolo basterebbe un singolo calcolato, tipo:
not evuoto(Condizione_04::ID_Fk_Macchina & Condizione_03::ID_Fk_Macchina & Condizione_02::ID_Fk_Macchina & Condizione_01::ID_Fk_Macchina)
che è anche più performante :)

.g.

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 1544)
Risposta inviata 11 Gennaio 2015 11:04
0
Domanda privata

Ciao a tutti,
il concetto di Giulio tradotto in relazioni: https://www.dropbox.com/s/g3w05pp56hn1snh/VerificaNoleggi_m.fmp12?dl=0
Mik

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 15)
Risposta inviata 11 Gennaio 2015 02:43
0
Domanda privata

si può eseguire quasi tutte le opzioni dello statement SELECT, quindi sicuramente si. Se è per questo invece di usare la CF decuplicateList puoi anche usare un distinct sql.
Dipende però se conviene: ho spezzato la risposta in questo modo principalmente per evidenziare la logica alla base del calcolo, evidenziare la leggibilità del calcolo stesso e rimanere quanto più possibile in ambito FileMaker.

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 1544)
Risposta inviata 10 Gennaio 2015 18:50
0
Domanda privata

Grazie per la risposta complessa ma ritengo esaustiva.
Domani procedo a studiarmela, magari ti chiederò qualche chiarimento.
Un te lo chiedo subito: non è possibile in EseguiSQL utilizzare una select comprensiva di join su più file? MI stavo infatti preparando una stringa sql che mi permettesse di ottenere lo stesso risultato che si ottiene da quella definita nel grafico delle relazioni, ma vedendo il modo in cui hai scritto l’esempio, legando in successione più SQL, non ho capito se lo hai fatto per motivi ”tecnici” o per non confondermi le idee.

Ancora grazie,
g

Segnalata come spam
Pubblicata da (Domande: 6, Risposte: 10)
Risposta inviata 10 Gennaio 2015 18:37
0
Domanda privata

Fare si può fare, ma non è la strada che consiglierei. cmq, andiamo per ordine:

– Se ci fosse la possibilità di valorizzare un campo di calcolo ad ”1” se il record appartiene alla relazione, potrei poi agganciare un duplicato di se stesso su quel campo per condizione di ”diverso”, ottenendo così solo le macchine non in ”uso”.

puoi farlo, con un calcolato non indicizzabile a patto che la relazione sia uno a molti, che ci sia sempre un unico utente e che non ci siano due richieste di noleggi; ma secondo me è un modo molto scomodo di procedere, e utilizzi il peggio delle due techiche (script e relazioni) senza il pregio di nessuna.

se non voui procedere con il metodo che ti ho suggerito e vuoi comunque ragionare come ”lista di id”, avendo FileMaker 12 o 13 puoi usare la funzione EseguiSQL, per ricavare l’elenco degli ID utilizzati secondo determinate specifiche: in sostanza devi intercettare quattro tipi di noleggi:
– quelli che iniziano prima del tuo periodo e finiscono durante in tuo periodo
– quelli che iniziano durante il tuo periodo e finiscono dopo il tuo periodo
– quelli che iniziano prima del tuo periodo e finiscono dopo il tuo periodo
– quelli che iniziano dopo l’inizio del tuo periodo e finiscono prima della fine del tuo periodo.

in Filemakerese qualcosa tipo:

EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_inizio_noleggio ≤ ? AND data_fine_noleggio ≥ ?;
””;¶;
tuadatainizio; tuadatainizio) &

¶ &

EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_inizio_noleggio ≤ ? AND data_fine_noleggio ≥ ?;
””;¶;
tuadatafine; tuadatafine; ) &

¶ &

EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_fine_noleggio ≤ ? AND data_inizio_noleggio ≥ ?;
””;¶;
tuadatafine; tuadatainizio; ) &

¶ &

EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_fine_noleggio ≥ ? AND data_inizio_noleggio ≤ ?;
””;¶;
tuadatafine; tuadatainizio; ) &

in questo modo hai la lista di tutte le macchine i cui noleggi si accavallano al tuo periodo. Puoi quindi utilizzare una CF come deduplicatelist (http://www.briandunning.com/cf/1109) per eliminare i doppioni.

quindi utilizzi un’altra funzione personalizzata, come DifferenceValues (http://www.briandunning.com/cf/98) per sottrarre dalla totalità delle macchine quelle che hai ricavato con il calcolo precedente.
a quel punto devi deceidere che fare con questa lista. puoi esploderla in una tabella temporanea, magari legata a una ID di procedura per evitare che in caso di multiutenza si confondano le liste.

un calcolo sintetico in merito potrebbe essere:

let([
pre=EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_inizio_noleggio ≤ ? AND data_fine_noleggio ≥ ?;
””;¶;
tuadatainizio; tuadatainizio); // seleziona gli ID dei macchinari il cui noleggio inizia prima del tuo periodo e finisce durante in tuo periodo

post=EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_inizio_noleggio ≤ ? AND data_fine_noleggio ≥ ?;
””;¶;
tuadatafine; tuadatafine; ) ; // seleziona gli ID dei macchinari il cui noleggio inizia durante il tuo periodo e finisce dopo il tuo periodo

in=EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_fine_noleggio ≤ ? AND data_inizio_noleggio ≥ ?;
””;¶;
tuadatafine; tuadatainizio; ) ; // seleziona gli ID dei macchinari il cui noleggio inizia dopo l’inizio del tuo periodo e finisce prima della fine del tuo periodo

out=EseguiSQL(
”select id_macchinario from noleggiodettaglio_MACCHINE where data_fine_noleggio ≥ ? AND data_inizio_noleggio ≤ ?;
””;¶;
tuadatafine; tuadatainizio; ); // seleziona gli ID dei macchinari il cui noleggio inizia prima l’inizio del tuo periodo e finisce dopo della fine del tuo periodo

list= pre & ¶ post & ¶ & in & ¶ & out;
ded= deduplicatelist(list; ””)]

DifferenceValues(tualistavaloriIDmacchinaricompleti; ded)

)

questo approccio ha il merito che non ti servono grandi modifiche al grafico relazionale, salvo per quanto attiene alla tabella di appoggio. La velocità comunque rimane il suo punto debole.

.g.

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 1544)
Risposta inviata 10 Gennaio 2015 16:19
0
Domanda privata

Ciao Giulio,
mi sembra che tu abbia centrato l’argomento e probabilmente la tua soluzione, per quanto io al momento non saprei come implementarla, potrebbe essere la strada giusta.

Dimmi una cosa, è possibile determinare tramite un campo di calcolo, se un determinato record fa parte o meno di una relazione?
Provo a spiegarmi.
Nella struttura che ho allegato, la parte segnata in verde mi restituisce correttamente solo le macchine utilizzate. Quindi fin li ci siamo.
Se ci fosse la possibilità di valorizzare un campo di calcolo ad ”1” se il record appartiene alla relazione, potrei poi agganciare un duplicato di se stesso su quel campo per condizione di ”diverso”, ottenendo così solo le macchine non in ”uso”.
Sogno o son desto?
E soprattutto, mi sono spiegato?

Segnalata come spam
Pubblicata da (Domande: 6, Risposte: 10)
Risposta inviata 8 Gennaio 2015 15:57
0
Domanda privata

Buongiorno, Giorgio.

in sintesi, si parte da:
– tabella macchinarii
– tabella noleggi_macchinario_in_essere

in cui per ciascun macchinario avrai una lista di noleggi con data inizio e fine.

oltre a questo, hai un modulo di proposta noleggio, in cui, data una data di inizio e fine (e facoltativamente una tipologia di macchinario) che ti deve mostrare solo le macchine disponibili, ovvero che siano disponibili per tutto il periodo di noleggio.

secondo me hai sbagliato il concetto di partenza. Per avere quello che ti serve, devi partire dalla tabella macchinari, creando un calcolo che esamini le date di inizio e fine noleggio proposti (due campi globali): per raggiungere il risultato la cose più semplice è utilizzare una funzione personalizzata ricorsiva che confronti la lista dei noleggi in essere con le date di inizio e fine proposte, dando un risultato univoco (1 o 0, si o no); il calcolo non è indicizzabile, e non può quindi generare una lista valore, ma può essere usato mediante portale filtrato, che puoi usare al posto della lista valori (anzi, ti permette una procedura guidata molto più flessibile, sia perché puoi mostrare più dati sia perché puoi fare scelte multiple).
In se non è particolarmente veloce e quindi non è adatto per grandi quantità di dati. Diciamo che se devi gestire più di qualche migliaio di macchinari e qualche decina mi migliaia di noleggi/annui va creato un diverso tipo di meccanismo.
ho inquadrato il problema oppure mi è sfuggito qualcosa?

.g.

Segnalata come spam
Pubblicata da (Domande: 0, Risposte: 1544)
Risposta inviata 8 Gennaio 2015 12:47