Pagina 1 di 1

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

Inviato: gio 19 mag 2022, 11:50
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

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

Inviato: gio 19 mag 2022, 12:35
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? ;)

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

Inviato: gio 19 mag 2022, 13:32
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

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

Inviato: gio 19 mag 2022, 13:48
da Enrico Galli
Ciao, io vorrei il txt originale, quello da cui generi la query "GP31550O"

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

Inviato: gio 19 mag 2022, 13:59
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),

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

Inviato: gio 19 mag 2022, 14:08
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

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

Inviato: gio 19 mag 2022, 16:31
da Enrico Galli
Ti ho scritto una possibile soluzione nel messaggio sopra, fammi sapere tu se va bene

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

Inviato: gio 19 mag 2022, 16:46
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