Bonjour tout le Monde
Bonjour Rambo.
L'intitulé résume la question.
Comment n'afficher le paramètre :
Report.CurrentPage+'/'+Report.TotalPages
que si le rapport comporte plusieurs pages.
Merci
Bonjour tout le Monde
Bonjour Rambo.
L'intitulé résume la question.
Comment n'afficher le paramètre :
Report.CurrentPage+'/'+Report.TotalPages
que si le rapport comporte plusieurs pages.
Merci
Bonjour ,
ce n'est pas "Rambo" mais "Rocky" même si c'est le même acteur
au débotté , je dirais que la solution consiste a :
- préparer l'état << surtout si état composé
- ensuite tester le TotalPages
- pour enfin imprimer/visualiser
maintenant , as tu essayé via un RaveScript (je sais j'en suis pas fan mais ...)
Quelque chose du style
//Zonetext est un RvText
//l'event est sur le BeforePrint de ZoneText
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if (Report.TotalPages=1) zonetext.value:=Report.CurrentPage; else zonetext.value:=Report.CurrentPage+'/'+Report.Totalpages; endifdésolé , je n'ai pas le temps de tester (pas mal de choses sur le feu actuellement) je j'essaierais en WE si ce n'est toujours pas résolu
![]()
bonjour,
Pour l'instant Rocky est KO![]()
j'ai essayé sans succès plusieurs pistes avec le Ravescripting , le problème est que l'on ne peut pas accéder aux variables d'état avec les scripts ! encore un mauvais point pour Rave
En fait le Bon script était (est)
en admettant que la zone pour afficher le numéro de page soit un rvDataText
avec comme DataField : 'page' & Report.CurrentPage & 'de' & Report.Totalpages
Round 1
j'ai essayé sur l'event beforeprint , avant de trouvé sur le net la note de Nevrona indiquant que l'on ne pouvait pas accéder aux variables d'état
Round 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //avec bien sur toutes les variantes : SrtToInt etc...) IF (Report.TotalPages=1) Self.Visible:=False; else Self.Visible:=True; endif
je me suis alors orienté vers une solution consistant à utiliser une zone cachée contenant la valeur de Report.TotalPage pour ensuite la tester
sans résultat
Round 3
j'ai tester en ajoutant un paramètre
problème , comment capturer le nombre total de page , apparemment là aussi Rave bug (j'ai une valeur absurde) , ce qui a d'ailleurs été soulevé dans une discussion sur le net (j'ai pas mémorisé où, mais peu importe)
Round 4
ben non , y en a pas eu , après tout c'était déjà dimanche , et , pire il était déjà 16h30 quand j'ai eu un dépannage (non encore fini) à faire !
mon idée était de passer soit par un pageinitnum (encore que) , soit , toujours par les paramètres en étudiant soigneusement un des tips de nevrona (pas facile de les trouver il faut tâtonner avec les numéros pour les trouver sur le net http://www.nevrona.com/rave/tips/rvtip1.html à http://www.nevrona.com/rave/tips/rvtip51.html )
Soit encore de voir ce que l'on peut faire avec le RvSytem directement dans le programme (encore nébuleuse cette piste)
Bref , prémonitoire ? ,Rocky est au tapis
faut peut être appeler Rambo
![]()
Bonjour tout le monde
Bonjour SergioMaster
J'ai été privé 48h d'internet
Si Rocky est au tapis que dois je dire pour moi.
n'ayant pas trouvé de solutions, j'ai contourné la difficulté en créant deux Etats l'un avec un dataText contenant Report.CurrentPage+'/'+Report( le N° de page et le nombre de page), l'autre sans dataDext.
je compte le nombre de lignes du fichier à imprimer. Si ce nombre est supérieur au nombre de lignes que peut contenir une page j'exécute l'état avec le datatext sinon j'imprime le second.
Ce n'est pas élégant mais faute de grives!
Bonjour
dans ce cas il n'y avait pas besoin , malgré tout , de faire 2 étatsje compte le nombre de lignes du fichier à imprimer. Si ce nombre est supérieur au nombre de lignes que peut contenir une page j'exécute l'état avec le datatext sinon j'imprime le second.
Le nombre de lignes = un RecordCount
deux solutions (merles):
- uniquement avec Delphi (perso je préfère)
Ouvrir le projet
récupérer le champ datatext
le mettre à false ou true (selon le recordCount)
Exécuter l'etat
- avec le RaveScript + Delphi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // il faudra rajouter quelques uses : RvProj,RvClass, RvCsStd ,RvCsRpt, RvCsDraw , RvDefine, RvCsData // en gras celle dont je suis sûr procedure TForm1.RvProject1AfterOpen(Sender: TObject); var MyPage : TRavePage; MyRaveData : TRaveDatatext; begin MyPage := RvProject1.ProjMan.FindRaveComponent('MonEtat.Page1',nil) AS TRavePage; myRaveData := RvProject1.ProjMan.FindRaveComponent('NUMEROPAGE',MyPage) AS TRaveDataText; if Assigned(MyRaveData) then myRaveData.Visible:=MonFichier.RecordCount>20 else showmessage('oops raté'); .... end;
ajouter un parametre pour l'état
sur l'event BeforePrint du Numéro de page faire un test sur le paramètre
dans delphi , avant d'executer le report mettre la valeur du paramètre
Code raveScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 var i : Integer; begin i:=StrToInt(Getparam('NomParametre')); if i>20 then self.visible:=true; else self.visible:=false; end;
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //après le RvProject1.Open; RvProject1.SetParam('NomParametre',intTostr(monFichier.RecordCount)); // à noter , un paramètre est toujours un string //mais avant le RvProject1.Execute('report1')
rebonjour Sergiomaster.
j'ai testé la première variante
le message est 'oops raté' et folio apparait dans l'impression
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 procedure TForme.GCabGastroAfterOpen(Sender: TObject); var MyPage : TRavePage; MyRaveData : TRaveDatatext; begin // folio nom du dataText Report.CurrentPage+'/'+Report.TotalPages MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.Page1',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; if Assigned(MyRaveData) then myRaveData.Visible:=(GOrdonnanceDetail.RecordCount>12) else showmessage('oops raté'); end;
il reste le même lorsque j'inverse l'inégalité et folio apparait toujours dans l'impression
A propos je travaile avec Delphi 7 entreprise.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if Assigned(MyRaveData) then myRaveData.Visible:=(GOrdonnanceDetail.RecordCount<12) else showmessage('oops raté');
merci encore pour le temps que tu me consacres.
re rebonjour
j'ai rajouté un bout de code de vérification de l'assignation de MyPage
même l'assignation de myPage n'est pas faite en effet le test Assigned(MyPage) affiche 'page non assignée'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.Page1',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; if not Assigned(MyPage) then showmessage('page non assignée'); if Assigned(MyRaveData) then myRaveData.Visible:=(GOrdonnanceDetail.RecordCount>10) else showmessage('oops raté');
Bon , je suppose que le nom du report est bien orthographié ? ainsi que le nom de la page (propriété name de la page) ? On est bien d'accord qu'il s'agit du Nom (propriété Name du report, pas FullName) de l'état à l'intérieur du Fichier .rav (je sais , des fois j'enfonce des portes ouvertes) !
évidement dans ces conditions si Mypage n'est pas Initialisé , alors difficile d'avoir myRavedata !
autant pour moi, je n'ai pas fait attention au nom de la page soit
pageOrdo et non page1.
.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.PageOrdo',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; if Assigned(MyRaveData) then myRaveData.Visible:=(GOrdonnanceDetail.RecordCount<9) else showmessage('oops raté');
donc l'assignation se fait maintenant correctement.
malheureusement que myRaveData soit visible ou pas
(GOrdonnanceDetail.RecordCount<9 ou GOrdonnanceDetail.RecordCount>9)
folio nom du dataText soit Report.CurrentPage+'/'+Report.Totalpages s'affiche toujours.
Merci SergioMaster de ta patience.
Je ne sais pas ce que ça vaut
mais en rajoutantle code devient alors
Code : Sélectionner tout - Visualiser dans une fenêtre à part if myRaveData.Visible=false then myRaveData.Destroy;
cela marche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.PageOrdo',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; if Assigned(MyRaveData) then myRaveData.Visible:=(GOrdonnanceDetail.RecordCount>9) else showmessage('oops raté'); if myRaveData.Visible=false then myRaveData.Destroy;
bonjour
voici la dernière mouture
c'est bricolé mais ça marche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForme.GCabGastroAfterOpen(Sender: TObject); var MyPage : TRavePage; MyRaveData : TRaveDatatext; begin MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.PageOrdo',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; // nbLigne : nombre de ligne dans le cas maître-détail if (Assigned(MyRaveData)) and (nbLigne <= 22) then myRaveData.Destroy; end;
merci SergioMaster de ton aide
Bonjour,
étonnant que tu sois obligé de détruire le RaveData , je suis sur a 90% (tu me mets le doute) que la propriété Visible est la bonne solution (sauf si bien sur Locked est à true ?, car dans ce cas aucune propriété n'est modifiable)
une autre solution (sans avoir a faire de destroy) serait de changer la valeur de dataField , mais ça , j'ai jamais essayé !
Ennuyé, je viens de faire un essai avec D7-Rave 5.1
étonné, visible:=False ne fonctionne pas , pourtant j'utilise ce truc pour des images !!! [edit] à ma décharge , c'est toujours sur une bande détail , évent onvalidateRow d'un rvDataConnection)
agréablement surpris, changer la valeur de datafield fonctionne
je vais quand même essayer avec une version supérieure D2010-Rave 7
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 procedure TDatas.RvProject1AfterOpen(Sender: TObject); var myPage : TRavePage; myRvData : TRaveDataText; myrvtext : TRaveText; begin myPage:=RvProject1.ProjMan.FindRaveComponent('Report1.Page1',nil) AS TRavePage; myRvData := RVproject1.ProjMan.FindRaveComponent('nbpage',MyPage) AS TRaveDataText; // myrvData.Visible:=False; // fonctionne pas myrvData.DataField:=''; // yes myRvText:=RVproject1.ProjMan.FindRaveComponent('Text1',MyPage) AS TRaveText; // myrvText.Enabled:=False; // fonctionne pas // myrvText.Visible:=False; // fonctionne pas non plus myrvText.Text:='oops'; // je vois mon 'oops' ('toto' dans mon ravereport) end;
re bonjour SergioMaster
Je crois que myrvData.DataField règle aussi le problème.
1) on rend myPage et myrvData plus un String AncValeur variable globale.
2) dans onAfterOpen on mémorise l'ancienne valeur myrvData.datafield avant modif
3/ dans onAfterClose on réinitialse myrvData.datafield
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 var MyPage : TRavePage; MyRaveData : TRaveDatatext; AncMyRaveData : String;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure TForme.GCabGastroAfterOpen(Sender: TObject); begin MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.PageOrdo',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; // nbLigne : nombre de ligne dans le cas maître-détail if (Assigned(MyRaveData)) and (nbLigne <= 22) then begin // mémorisation ancienne valeur AncMyRaveData variable globale AncMyRaveData:=myRaveData.DataField; myRaveData.DataField:=''; end; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForme.GCabGastroAfterClose(Sender: TObject); begin myRaveData.DataField:=AncMyRaveData; end;
Pas besoin , sauf si1) on rend myPage et myrvData plus un String AncValeur variable globale.
2) dans onAfterOpen on mémorise l'ancienne valeur myrvData.datafield avant modif
3/ dans onAfterClose on réinitialse myrvData.datafield
-tu fais une sauvegarde du Rave
-tu ne fermes pas le rave après édition
-c'est un ensemble d'états chainés (je doute)
Je prends toujours soin de faire un Open/Execute/Close
bonjour
tu as tout à fait raison.
je pensait en assignant une valeur à datafiels, cette valeur était mémorisée.
ce qui n'est pas le cas je viens de le tester.
aussi ai je supprimé toute cette gymnastique et suis revenu à la situation ante.
c'est presque parfait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForme.GCabGastroAfterOpen(Sender: TObject); var MyPage : TRavePage; MyRaveData : TRaveDatatext; begin MyPage := GCabGastro.ProjMan.FindRaveComponent('MaitreDetailOrdoA5.PageOrdo',nil) AS TRavePage; myRaveData := GCabGastro.ProjMan.FindRaveComponent('folio',MyPage) AS TRaveDataText; // nbLigne : nombre de ligne dans le cas maître-détail if (Assigned(MyRaveData)) and (nbLigne <= 22) then myRaveData.DataField:=''; end;
merci SergioMaster.
bye.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager