Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
J'aurais besoin d'aide pour réaliser un développement concernant une application de suivi des données. J'aimerais enregistrer la valeur d'une variable à 17h ainsi que la date du jour dans un fichier QVD afin d'avoir un historique de cette valeur tous les jours à la même heure, donc du type :
Date | Valeur
19-04-2018 | 105,50
20-04-2018 | 120.54
21-04-2018 | 98.60
22-04-2018 | 101.01
23-04-2018 | 97.85
...
Le souci que je rencontre, c'est que ce sont les formules qui sont enregistrées et non la valeur de celles ci, car j'ai bien conscience que la valeur de la variable en elle même n'est disponible qu'une fois l'exécution du script terminé...
NoConcatenate
StoreData:
LOAD
'$(Var1)' as [Data1],
'$(Var2)' as [Data2],
Today() as Date
AutoGenerate 1;
Je ne sais pas comment contourner ce problème...
Merci,
Jenny
Peux-tu donner les expressions de Var1 et de Var2 ?
Bonjour,
Je ne sais pas si ça va aider, ce sont des expressions complexes
(le contenu s'affiche correctement dans un objet texte dans l'application )
VAR 1 :
Set vTotalHeuresTech = (sum( {< DB_SAV_Ended = {0}, Doc_Version_No = {99}, TT_IsInJPlus2 = {1}, DB_SC_Type = {1}, TT_Status = {'*'} - {4} >} TT_HoursQty) + count( distinct {< DB_SAV_Ended = {0}, Doc_Version_No = {99}, SLA_IsInJPlus2 = {1}, NbTSbyTask = {0}, isUrgent = {0}, DB_SC_Type = {1} >} Doc_No) * ( $(CoefInc)) + count( distinct {< DB_SAV_Ended = {0}, Doc_Version_No = {99}, SLA_IsInJPlus2 = {1}, NbTSbyTask = {0}, isUrgent = {1}, DB_SC_Type = {1} >} Doc_No) * ( $(CoefInc)) + sum( {< DB_SAV_Ended = {0}, NbSC_type = {1}, Doc_Version_No = {99}, TT_IsInJPlus2 = {1}, NbTSbyTask = {">0"}, DB_C_Code = {*} -{'D09','M07','S11'}, DB_SC_Type = {2}, TT_Status = {*} - {4} >} TT_HoursQty) + count( distinct {< DB_SAV_Ended = {0}, NbSC_type = {1}, Doc_Version_No = {99}, SLA_IsInJPlus2 = {1}, NbTSbyTask = {0}, DB_C_Code = {*} -{'D09','M07','S11'}, isUrgent = {0}, DB_SC_Type = {2} >} Doc_No) * ( $(CoefChg)) + count( distinct {< DB_SAV_Ended = {0}, NbSC_type = {1}, Doc_Version_No = {99}, SLA_IsInJPlus2 = {1}, NbTSbyTask = {0}, DB_C_Code = {*} -{'D09','M07','S11'}, isUrgent = {1}, DB_SC_Type = {2} >} Doc_No) * ( $(CoefChg)) + sum({< DB_EndedCall = {0}, DB_IMAC_Ended = {0}, Doc_Version_No = {99}, HeuresTechInJPlus2 = {1}, TT_Status = {*} - {4}, DB_SC_Type = {4} >} TT_HoursQty));
Set vTechNeed_Temp = $(vTotalHeuresTech) / ((count( distinct {< Res_Type = {0}, Res_ResGroupNo = {'PLTEC','PLTSE','PLAID'}/*, TT_ResNo ={'*'}-{'PIJA', 'CHBA', 'SEPE', 'CHRI', 'MASE', 'PREST-EDR-UK', 'PREST-GRAPHAX', 'PREST-HOLZER', 'PREST-KMBF', 'PREST-TECH'}*/>} Res_Name) * $(vHeureTechNeed) * $(vNbDays)) - (sum({< ProjectID = {1,2,3}, HeuresTechInJPlus2 = {1}>} TT_HoursQty)));
Set var1 = IF ( $(vTechNeed_Temp), $(vTechNeed_Temp), 0);
VAR 2 :
Set vHumanAvail_Temp = (((count( distinct {< Res_Type = {0}, Res_ResGroupNo = {'PLTEC','PLTSE','PLAID'} /*, TT_ResNo ={'*'}-{'PIJA', 'CHBA', 'SEPE', 'CHRI', 'MASE', 'PREST-EDR-UK', 'PREST-GRAPHAX', 'PREST-HOLZER', 'PREST-KMBF', 'PREST-TECH'}*/>} Res_Name) * $(vHeureTechNeed) * $(vNbDays)) - (sum({< ProjectID = {1,2,3}, HeuresTechInJPlus2 = {1}>} TT_HoursQty))) / (count( distinct {< Res_Type = {0}, Res_ResGroupNo = {'PLTEC','PLTSE','PLAID'} /*, TT_ResNo ={*}-{'PIJA', 'CHBA', 'SEPE', 'CHRI', 'MASE', 'PREST-EDR-UK', 'PREST-GRAPHAX', 'PREST-HOLZER', 'PREST-KMBF', 'PREST-TECH'}*/>} Res_Name) * $(vHeureTechNeed) * $(vNbDays)));
Set var2 = If( $(vHumanAvail_Temp),$(vHumanAvail_Temp),0);
il y a 2 possibilités qui réponde à ta question, mais dans les 2 cas il y a des difficultés :
1) Résoudre les expressions dans le script
Cette option est complexe, car t’es expressions sont complexes.
il faut faire une table par fonction d’agrégation :
sum( {< DB_SAV_Ended = {0}, Doc_Version_No = {99}, TT_IsInJPlus2 = {1}, DB_SC_Type = {1}, TT_Status = {'*'} - {4} >} TT_HoursQty)
THT_1:
LOAD
Sum(TT_HoursQty) as TotalHeuresTech_1
Resident Table1
Where
DB_SAV_Ended = 0
And Doc_Version_No = 99
And TT_IsInJPlus2 = 1
And DB_SC_Type = 1
And TT_Status <> 4
Ensuite tu joins tes tables pour n’en avoir plus que une et tu fait une requête dessus pour calculer VAR_1 et VAR_2
Tu concatènes ton qvd existant
Tu sauves le résultat dans ton qvd (store)
Oui, c’est compliqué
2) Si tu utilises QlikView, tu peux créer une macro qui exportera le contenu d’un objet graphique (tableau avec tes expressions ) dans un QVD. Tu peux lancer l’exécution de ta macro par un trigger declanché à la fin du chargement.
C’est pas tout simple non plus, mais cela me semble plus facile.
Bonjour,
Merci pour ton retour, j'ai développé hier ta seconde proposition, j'ai écris une macro qui est supposée se déclencher après chaque rechargement.
- Avant 17h, je charge un QVD qui est l'historique (fictif pour l'instant)
- La variable "vExportExcel" est égale à 1 au premier rechargement après 17h, et donc l'objet graphique est sensé être exporté au format Excel (cette étape ne fonctionne pas)
- Au second rechargement après 17h, le fichier Excel créé est pris en entré pour être concaténer à l'historique existant
Voici ma macro
SUB Exporter
Set var = ActiveDocument.GetVariable("vExportExcel")
IF var.GetContent.String = 1 THEN
NomFichier = "\\SRVQLIKVIEW\Documents Source\TechnicalNeed_HumanAvailability.xlsx"
Set fso = CreateObject("Scripting.FileSystemObject")
on error resume next
fso.DeleteFile(NomFichier)
on error goto 0
SET tmpExcel = CreateObject("Excel.Application")
SET tmpWorkBook = tmpExcel.Workbooks.ADD
tmpExcel.Visible = True
SET TABLE = ActiveDocument.GetSheetObject("CH208")
SET XLSheet = TmpExcel.Worksheets(1)
TABLE.CopyTableToClipboard true
XLSheet.Range("A1").SELECT
XLSheet.PasteSpecial
TmpWorkBook.SaveAs NomFichier
TmpExcel.Quit
END IF
END SUB
le niveau de sécurité requis : Accès système
Sécurité locale active : Autoriser les accès système
Et au niveau des déclencheurs du document :
Déclencheurs d’événements de document/ Au rechargement / Avec Action = executer une macro/ Nom de la macro : Exporter.
Je ne comprends pas pourquoi l'export ne se fait pas...
Bon et bien j'ai ma réponse :
Les types de fonctions suivants ne doivent pas être utilisés dans l'environnement du serveur QlikView, car
elles pourraient avoir des conséquences inattendues :
* Les opérations attrayant à la disposition qui ont une incidence sur les propriétés des feuilles et des
objets de feuille via SetProperties
* Les opérations modifiant les paramètres du document ou utilisateur
* Toutes les opérations liées au script, y compris Reload
* Les opérations de réduction des données, ReduceData par exemple
* Les opérations de type Enregistrer et Ouvrir le document
Je mets ici une piste que j'ai trouvé dans un autre sujet de discussion :
La solution de contournement est donc de passer par le lancement d'un programme vbs via "External programs" (System / Supporting Tasks / External programs).
Il faut donc créer un fichier .vbs et le lancer à partir de "Command line statement:" : cscript C:\MonFichier.vbs
bon, y a plus qu'à....
Bonjour,
Pourquoi ne pas, à chaque extraction de ta source de données, stockées dans un QVD dans le nom duquel tu indique la date. Chaque jour tu as un nouveau QVD.
Ensuite dans le design, tu utilise la date du QVD comme dimension pour calculer tes expressions.
Ce n'est à priori pas une solution très complexe à mettre en œuvre.
Bonjour,
C'est en fait exactement ce que je fais
Seulement la prochaine étape c'est de pouvoir exporter cet objet dans lequel j'affiche mes expressions (Date du jour - Var1 -Var2) afin d'avoir dans un QVD ou un fichier Excel les données des variables Var1 et Var2. C'est ici que ça coince
As-tu Excel installé sur ton serveur QlikView ?
Sinon, tu n'as peut-être pas la librairie nécessaire à disposition.
Je pense que la macro suivante suffit a exporter ta données dans un QVD :
SUB Exporter
IF var.GetContent.String = 1 THEN
NomFichier = "\\SRVQLIKVIEW\Documents Source\TechnicalNeed_HumanAvailability.qvd"
set obj = ActiveDocument.GetSheetObject("CH208")
obj.ExportEx NomFichier, 4
END IF
END SUB