PQ: In base ad un risultato eseguire una query o un'altra L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Rispondi

AndreaB.
Messaggi: 44 | Topic creati
Iscritto il: lun 30 ago 2021, 12:14
Ringraziato: 3 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da AndreaB. »

Ciao a tutti,
ho provato a cercare in rete, ma con le chiavi che utilizzo non sono riuscito a trovare qualcosa che possa risolvere il mio problema.

Provo ad illustrare sia il problema, sia la soluzione che ho pensato, magari voi mi potrete indirizzare su qualcosa di più performante.

Cominciamo dalle mie conoscenze: abbastanza basiche, ogni tanto mi impegno a fare qualcosina di più impegnativo, ma mai con i risultati sperati.

Il problema:
giornalmente riceviamo via mail due file txt per il controllo di eventuali revoche, a fronte delle quali dobbiamo intervenire manualmente e chiudere le relative gestioni.

Soluzione pensata:
Tramite VBA leggo gli allegati delle mail presenti nella inbox di Outlook e quando trovo i due che mi interessano procedo a salvarmene una copia sul disco.
a questo punto con PQ li carico.
Ora arriva il mio problema
Di tutti i dati presenti nel file di testo io, come dicevo devo tenere solo i record che si riferiscono alle revoche (che non necessariamente sono presenti), quindi per fare questo ho pensato ad una cosa del genere:
dal file txt importato faccio 3 riferimenti (1 per l’elaborazione vera e propria dei dati e 2 di appoggio, la prima per verificare che sia presente la stringa per identificare le REV e la seconda per trovare la stringa che mi indichi che le REV siano finite).
A tutti e 3 i riferimenti ho aggiunto una colonna indice, in questo modo so da che riga dovrò iniziare tenere i dati e fino a che riga; gli indici li ho impostati che partano da 1 per elaborazione e Rev, mentre da 0 per fine Rev (in questo modo ho la riga prima per la query dell’elaborazione).
inoltre ho fatto dei riferimenti alle 2 query di supporto per determinare o meno la presenza delle REV e della fine delle REV che può variare (quindi ho sempre un controllo per sapere in quale riga si trova la fine di tutti i dati).
Quindi ho pensato di aggiungere una colonna condizionale dove controllo se è presente, in un determinato campo, la stringa REV e se si metto 1 altrimenti 0 così per tutti i record, poi seleziono la colonna condizionale ed elimino tutte le altre colonne, ordino Decrescente il dato e tengo solo la prima riga, drill down ed il gioco è fatto 1 VERO – 0 FALSO
il gioco è “parzialmente” fatto, nel senso che so come fare a determinare la fine delle revoche in base al valore vero o falso del contro “FineRevoche”, ma non so come dire di non fare niente se il controllo Revoche dovesse dare 0 cioè Falso, cioè nel file ricevuto non ci sono revoche.

di seguito il codice

Codice: Seleziona tutto

let
  Origine = GP31550O,
  
    #"Aggiunta colonna indice" = Table.AddIndexColumn(Origine, "Indice", 1, 1, Int64.Type),
    #"Filtrate righe" = Table.SelectRows(#"Aggiunta colonna indice", if chkTrovaFineRevoche = 1 then each [Indice] >= trovaInizioRevoche and [Indice] <=  trovaFineRevoche else each [Indice] >= trovaInizioRevoche and [Indice] <= trovaFineRevocheAlternativo),
    #"Rimosse colonne" = Table.RemoveColumns(#"Filtrate righe",{"Indice"}),
    #"Righe vuote rimosse" = Table.SelectRows(#"Rimosse colonne", each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null}))),
    #"Filtrate righe5" = Table.SelectRows(#"Righe vuote rimosse", each [Column1] <> "-"),
    #"Filtrate righe1" = Table.SelectRows(#"Filtrate righe5", each not Text.Contains([Column1], "------")),
    #"Filtrate righe2" = Table.SelectRows(#"Filtrate righe1", each not Text.Contains([Column1], "GPP")),
    #"Filtrate righe3" = Table.SelectRows(#"Filtrate righe2", each not Text.Contains([Column1], "                ")),
    #"Rimosse prime righe" = Table.Skip(#"Filtrate righe3",1),
    #"Testo troncato" = Table.TransformColumns(#"Rimosse prime righe",{{"Column1", Text.Trim, type text}, {"Column2", Text.Trim, type text}, {"Column3", Text.Trim, type text}, {"Column4", Text.Trim, type text}, {"Column5", Text.Trim, type text}, {"Column6", Text.Trim, type text}, {"Column7", Text.Trim, type text}, {"Column8", Text.Trim, type text}, {"Column9", Text.Trim, type text}, {"Column10", Text.Trim, type text}}),
    #"Intestazioni alzate di livello" = Table.PromoteHeaders(#"Testo troncato", [PromoteAllScalars=true]),
    #"Modificato tipo" = Table.TransformColumnTypes(#"Intestazioni alzate di livello",{{"IMPORTO", Int64.Type}}),
    #"Filtrate righe4" = Table.SelectRows(#"Modificato tipo", each [#"IMPORTO"] <> -999999999),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Filtrate righe4", "Personalizzato", each Text.Combine( {Text.Start([CONTRATTO],6), Text.From( (Value.FromText( Text.Start([CONTRATTO],6)) * 100000 + 5823) - Number.RoundDown((Value.FromText( Text.Start([CONTRATTO],6)) * 100000 + 5823)/97,0)*97)}, "/")),
    #"Rimosse colonne1" = Table.RemoveColumns(#"Aggiunta colonna personalizzata",{"CONTRATTO"}),
    #"Rinominate colonne" = Table.RenameColumns(#"Rimosse colonne1",{{"Personalizzato", "CONTRATTO"}}),
    #"Raggruppate righe" = Table.Group(#"Rinominate colonne", {"DATA INSER.", "CONTRATTO", "ANAGRAFICA", "CONTO DI ACCREDITO", "ST", "VALUTA", "USERID"}, {{"IMPORTO", each List.Sum([IMPORTO]), type nullable number}, {"All_Rows", each _, type table [#"DATA INSER."=text, ANAGRAFICA=text, LINEA=text, CONTO DI ACCREDITO=text, ST=text, #"NUM.PRENOT."=text, IMPORTO=nullable number, VALUTA=text, USERID=text, CONTRATTO=text]}}),
    #"Aggiunta colonna personalizzata1" = Table.AddColumn(#"Raggruppate righe", "LINEE", each List.Distinct([All_Rows][LINEA])),
    #"Valori estratti" = Table.TransformColumns(#"Aggiunta colonna personalizzata1", {"LINEE", each Text.Combine(List.Transform(_, Text.From), "/"), type text})
in
    #"Valori estratti"
l’idea che mi viene è mettere prima del #”Filtrate righe” (in riga 5 per intenderci) un qualcosa del tipo
if trovainiziorevoche = 1 then
e poi tutto il resto

ma non so se si possa fare e soprattutto come
Spero di essere stato abbastanza chiaro e che esista una soluzione alla mia domanda


Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da Enrico Galli »

Ciao AndreaB. , mi spiace, ma con tutta la buona volontà... non mi ci metto a cercare di immaginare come siano fatti questi txt, e come funzioni tutto il controllo che hai minuziosamente descritto. Non puoi allegare il txt di origine così facciamo qualche prova anche noi? ;)
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione

Autore del topic
AndreaB.
Messaggi: 44 | Topic creati
Iscritto il: lun 30 ago 2021, 12:14
Ringraziato: 3 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da AndreaB. »

Ringrazio Enrico Galli per la pronta risposta, e chiedo perdono se non sono in grado di "taggarlo" in modo che possa ricevere una notifica, allego i 2 tipi di file ho aggiunto la stringa _REV e _NOREV per indicare quale tipo di esito mi aspetto.

Allora per la _NOREV sarebbe la casistica che non deve fare niente.

Nella _REV è il tipo che non avendo le SWT va a prendere la fine del file.

Se può servire di seguito il metodo che utilizzo per trovare dove iniziano le Revoche

Codice: Seleziona tutto

let
    Origine = GP31550O,
    Personalizzato1 = Table.AddColumn(Origine, "chkTrovaFineRevoche", each if [Column1] = " CAUSALE    REV " then 1 else 0),
    #"Modificato tipo" = Table.TransformColumnTypes(Personalizzato1,{{"chkTrovaFineRevoche", Int64.Type}}),
    #"Rimosse colonne" = Table.RemoveColumns(#"Modificato tipo",{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10"}),
    #"Ordinate righe" = Table.Sort(#"Rimosse colonne",{{"chkTrovaFineRevoche", Order.Descending}}),
    #"Mantenute prime righe" = Table.FirstN(#"Ordinate righe",1),
    chkTrovaFineRevoche1 = #"Mantenute prime righe"{0}[chkTrovaFineRevoche]
in
    chkTrovaFineRevoche1
mentre qui dove finiscono

Codice: Seleziona tutto

let
    Origine = GP31550O,
    #"Colonna condizionale aggiunta" = Table.AddColumn(Origine, "chkTrovaFineRevoche", each if [Column1] = " CAUSALE    SWT " then 1 else 0),
    #"Rimosse colonne" = Table.RemoveColumns(#"Colonna condizionale aggiunta",{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10"}),
    #"Ordinate righe" = Table.Sort(#"Rimosse colonne",{{"chkTrovaFineRevoche", Order.Descending}}),
    #"Mantenute prime righe" = Table.FirstN(#"Ordinate righe",1),
    chkTrovaFineRevoche1 = #"Mantenute prime righe"{0}[chkTrovaFineRevoche]
in
    chkTrovaFineRevoche1
Allegati
GP31550O _REV.TXT
Versione con revoca
(2.64 KiB) Scaricato 13 volte
GP31550O_NOREV.TXT
Versione senza revoche
(4.97 KiB) Scaricato 12 volte
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da Enrico Galli »

Ciao, io vorrei il txt originale, quello da cui generi la query "GP31550O"
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da Enrico Galli »

Comunque prova a mettere questo nella riga del filtro:

Codice: Seleziona tutto

#"Filtrate righe" = Table.SelectRows(#"Aggiunta colonna indice", if trovaInizioRevoche = 1 then (if chkTrovaFineRevoche = 1 then each [Indice] >= trovaInizioRevoche and [Indice] <=  trovaFineRevoche else each [Indice] >= trovaInizioRevoche and [Indice] <= trovaFineRevocheAlternativo) else each true),
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione

Autore del topic
AndreaB.
Messaggi: 44 | Topic creati
Iscritto il: lun 30 ago 2021, 12:14
Ringraziato: 3 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da AndreaB. »

Enrico Galli ha scritto: gio 19 mag 2022, 13:48 Ciao, io vorrei il txt originale, quello da cui generi la query "GP31550O"
Quello è quello originale ... se vuoi ti posso allegare quello per altro istituto che contiene più righe, ma il tracciato è il medesimo ... fammi sapere grz
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da Enrico Galli »

Ti ho scritto una possibile soluzione nel messaggio sopra, fammi sapere tu se va bene
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione

Autore del topic
AndreaB.
Messaggi: 44 | Topic creati
Iscritto il: lun 30 ago 2021, 12:14
Ringraziato: 3 volte
Contatta:

PQ: In base ad un risultato eseguire una query o un'altra

Messaggio da AndreaB. »

Sì scusa ho risposto al tuo messaggio, poi ho provato il tuo suggerimento e sembra fare proprio al caso mio....

nei prossimi giorni avrò la certezza.

Grazie ancora
Rispondi