Monday, March 20, 2017

Wednesday, March 15, 2017



Impression Pdf dans état Windev

Une solution pour éditer un état windev puis le fusionner avec mes fichiers Pdf qui font plusieurs pages.

Il faut utiliser une dll externe gsdll32.dll

//Permet d'initialiser la dll
PROCEDURE InitDLL()
//strDLL est une chaîne
//renvoie un entier différent de 0 si DLL chargée
SI gnBl_Echargedll = 0 ALORS
gnBl_Echargedll = ChargeDLL("gsdll32.dll")
FIN

PROCEDURE Imprime()
//imprime mon état avec une sortie PDF
iDestination(iPDF,sNomPdfEtat)
iImprimeEtat(ETA_AGT_AGENTS_NDF_COMPTA)
//ajoute dans un tableau
TableauAjouteLigne(tabJustif,sNomPdfEtat)

//boucle sur mes fichiers Pdf et les ajoute au tableau
HLitPremier(sdReqJustif)
TANTQUE PAS HEnDehors(sdReqJustif)
TableauAjouteLigne(tabJustif,sdReqJustif.fic_justif)
HLitSuivant(sdReqJustif)
FIN

SI TableauOccurrence(tabJustif) > 0 ALORS
SI fFichierExiste("NDF.pdf") ALORS
SI PAS fSupprime("NDF.pdf") ALORS
Info("Génération du fichier impossible.","Vérifiez que le fichier NDF.pdf n'est pas ouvert.","Si c'est le cas, merci de le fermer avant de demander l'édition.")
FIN
FIN
//fusionne tous les pdf
ret est un booléen = FusionnerPDF(tabJustif,"NDF.pdf")

SI PAS ret ALORS
Info("Un problème est survenu durant la génération du fichier pdf")
FIN

SI ret ALORS
//Lance mon PDF générer
LanceAppliAssociée("NDF.pdf")
FIN
FIN


// Résumé : <indiquez ici ce que fait la procédure>
// Syntaxe :
//[ <Résultat> = ] FusionnerPDF (<tabFichiers>, <strFichierSortie>)
//
// Paramètres :
// tabFichiers : <indiquez ici le rôle de tabFichiers>
// strFichierSortie : <indiquez ici le rôle de strFichierSortie>
// Valeur de retour :
// booléen : // Aucune
//
// Exemple :
// Indiquez ici un exemple d'utilisation.
//
//tabFichiers=Tableau de chaine des fichiers à fusionner (la fusion se fera dans l'ordre du tableau)
//strFichierSortie=Fichier à générer
PROCEDURE FusionnerPDF(tabFichiers,strFichierSortie)

iCode est un entier système
iCode1 est un entier système
iTemp est un entier
e_Quit est un entier = -101
iNbParam est un entier
tabParam est un tableau de 0 chaîne
strFichier est une chaîne

bRetour est un booléen = Faux

bFichiersOk est un booléen
sG_GS_TYPE_PDF est une chaîne = "pdfwrite"

SI TableauOccurrence(tabFichiers)> 0 ALORS
bFichiersOk = Vrai
POUR TOUT ELEMENT strFichier DE tabFichiers
SI PAS fFichierExiste(strFichier) ALORS
bFichiersOk = Faux
Info("Le fichier suivant est absent : "+strFichier,"Merci de l'indiquer à votre assistance informatique")
SORTIR
FIN
FIN

SI bFichiersOk ALORS
InitDLL()
SI gnBl_Echargedll <> 0 ALORS
iCode = API("gsdll32.dll","gsapi_new_instance",&iTemp,Null)
SI iCode>= 0 ALORS
TableauAjoute(tabParam,"-dSAFER")
TableauAjoute(tabParam,"-dBATCH")
TableauAjoute(tabParam,"-dNOPAUSE")
TableauAjoute(tabParam,"-debug")
TableauAjoute(tabParam,"-sDEVICE="+sG_GS_TYPE_PDF)
TableauAjoute(tabParam,ChaîneConstruit("-sOutputFile=%1",strFichierSortie))
POUR TOUT ELEMENT strFichier DE tabFichiers
TableauAjoute(tabParam,""+strFichier+"")
FIN
iNbParam = TableauOccurrence(tabParam)
iCode = API("gsdll32.dll","gsapi_init_with_args",iTemp, iNbParam,&tabParam)
iCode1 = API("gsdll32.dll","gsapi_exit",iTemp)
SI iCode = 0 _OU_ iCode = e_Quit ALORS
iCode = iCode1
FIN
API("gsdll32.dll","gsapi_delete_instance",iTemp)
SI iCode = 0 _OU_ iCode = e_Quit ALORS
bRetour = Vrai
FIN
SINON
Erreur()
FIN
FIN
FIN
FIN
RENVOYER bRetour

Friday, March 10, 2017



Rename table column name using SP_Rename system stored procedure


SYNTAX:
SP_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN' 

    

http://sqlhints.com/2015/06/15/how-to-rename-column-name-in-sql-server/

Wednesday, March 8, 2017

Pourquoi utiliser le type Money au lieu de Float pour stocker les montants dans SQL Server ? Voir la raison dans l'article suivant.

Source : http://blog.octo.com/problemes-courants-imprecision-des-calculs-mathematiques-1ere-partie/

Problèmes courants: Imprécision des calculs mathématiques (1ère partie)


J’inaugure aujourd’hui une nouvelle chronique que j’ai appelée problèmes courants. J’y traiterai l’une après l’autre les erreurs classiques rencontrées à travers mes années d’informatique.
Ce premier article de la série visera à démystifier les calculs mathématiques et à établir de bonnes pratiques au sein d’une application d’entreprise. Par application d’entreprise, nous entendons une application gérant des montants d’argent, des prix, des quantités. Il a été coupé en deux, la première partie expliquant le problème, la deuxième montrant comment le gérer en Java et .Net.
Bill travaille sur un logiciel de paiement de commissions. Il doit ajouter une commission de 1,2$. Il se fait donc une petite méthode faisant cette opération et le petit test unitaire qui va avec.
1@Test
2public void testAddCommission() {
3 double actual = addCommission(1000000.1);
4 assertEquals(1000001.3, actual, 0);
5}
6 
7public static double addCommission(double nominal) {
8 return nominal + 1.2f;
9}
java.lang.AssertionError: expected:<1000001.3> but was:<1000001.3000000477>
« Ah ben zut alors! C’est pas le bon résultat ».
Qu’est-ce qui se passe?

Virgules flottantes vs décimaux

Les nombres à virgule flottante (floating point numbers) ont été introduits pour des raisons de performance (et uniquement pour ça) dans les ordinateurs. Ils sont devenus omniprésents depuis l’arrivée du Intel 80486 et son coprocesseur de virgules flottantes. Cela permet de faire une multiplication ou une division en 1 cycle de processeur. Il s’agit des types float, double et quad (leur précision respective dépend du langage mais chacun double la précision du précédent).
Avec des décimaux, c’est plus lent (en gros autant d’opérations que quand vous posiez une multiplication au primaire, sauf qu’heureusement un ordinateur va plus vite et fait moins de fautes…). Par décimaux nous entendons le type decimal (en .Net) et BigDecimal (en Java).
Pourquoi utilisez de décimaux dans ce cas me direz-vous? Car ils n’utilisent pas la même représentation.
Dans les deux cas, nous avons une mantisse et un exposant. Toutefois, la mantisse d’un décimal est un entier. Celle de la virgule flottante, un nombre entre 0 et 1 en base 2. Il faut bien comprendre que les chiffres à droite de la virgule sont donc puissance de fraction de 2, car nous sommes en base 2. Par exemple, 0,1 en base 2 vaut 0,5 en base 10.
Un autre exemple: 7.5, s’écrit 75E-1 en décimal, la mantisse est de 75 et l’exposant sera -1. Pour la virgule flottante, nous aurons 0.75E1 en base 10, ce qui donne 0.11 en base 2 ((1/2)^1 + (1/2)^2) pour la mantisse et 1 pour l’exposant. En gros, il s’agit d’une série de puissance d’1/2 au lieu d’un série de puissance de 1/10. C’est ce changement de représentation qui permet des calculs si rapide, car comme on le sait, les ordinateurs aiment bien le binaire.

C’est un problème de base

Les problèmes surviennent quand le nombre se représente parfaitement en base 10, mais ne peut l’être en base 2. L’exemple courant est 0.1. Sa valeur en base 2 est périodique (0.000110011001100…). Nous ne pouvons par le représenter précisément. La norme IEEE 754 régissant l’arithmétique des nombres à virgule flottante s’efforce donc de les exprimer au mieux et de gérer les arrondis, mais la perte de précision reste.
Il est très important de comprendre que les problèmes dont on parle sont des problèmes de représentation et non pas des problèmes de précision.
Les problèmes de précision, on sait les gérer. Il suffit d’augmenter la précision. La précision n’est pas suffisante dans un double et hop, on passe à un quad. Mais notre 0,1 ne pourra toujours pas être représenté précisément. À noter, ce n’est pas dépendant du langage. Tous les représentent de la même façon et utilisent le coprocesseur de virgules flottantes pour leurs calculs.

L’exemple de 0.1 en plus détaillé:
1float f = 0.1f;
2System.out.println(f); // affiche 0.1
3BigDecimal d = new BigDecimal(f);
4System.out.println(d); // affiche 0.100000001490116119384765625
On pourrait croire que le passage vers le BigDecimal détruit le chiffre. Et non. Pour compliquer l’histoire, c’est l’affichage du float qui est faux. La vraie valeur du float est celle affichée par le BigDecimal. Mais l’algorithme d’affichage des virgules flottantes est d’afficher autant de bits que nécessaire pour faire la différence entre deux valeurs adjacentes. Donc, en fait, l’affichage tronque la vraie valeur.

Conclusion

Comme nous avons brièvement vu plus haut, le type décimal est différent. Il est composé d’une mantisse et d’une échelle, mais la mantisse est sous forme d’entier. La valeur décrite est donc dans tous les cas parfaitement représentée et n’a pas besoin d’être arrondie. Cette précision est essentielle dans le cadre d’une application manipulant des montants d’argent par exemple.
D’ailleurs, nos ancêtres le savaient. Aucun programmeur Cobol de l’époque n’utiliserait une virgule flottante. Malheureusement, le savoir s’est perdu en chemin. Le plus cuisant exemple est Java qui n’avait même pas de type décimal (BigDecimal) lors de sa création.
Cette erreur a été réparé et en prime, le BigDecimal java n’a virtuellement pas de restriction de taille (et donc de problème de précision). Le decimal .Net est de son côté sur 128 bits. C’est largement suffisant pour prévenir les erreurs de précision étant donnée l’échelle des montants des applications d’entreprise.
Première règle: Ne jamais utiliser de nombres à virgule flottante dans vos applications de type entreprise. Dans aucun cas! Même pour vos littéraux. Mettez une règle Checkstyle s’assurant que personne ne les utilise.
Il y a bien sûr des exceptions à cette règle (performance), mais elles sont rarissimes.
La suite de cet article détaillera l’usage des types décimaux (BigDecimal et decimal) en Java et .Net. En effet, même s’ils préviennent les problèmes de représentation, d’autres erreurs vous attendent à l’orée du bois.

Tuesday, March 7, 2017


PDF Tools

Apache™ FOP

Apache™ FOP (Formatting Objects Processor) is a print formatter driven by XSL formatting objects (XSL-FO) and an output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PS, PCL, AFP, XML (area tree representation), Print, AWT and PNG, and to a lesser extent, RTF and TXT. The primary output target is PDF.

https://xmlgraphics.apache.org/fop/
 

PDFtk

https://en.wikipedia.org/wiki/PDFtk

 

Monday, March 6, 2017

Memory Analyzer (MAT)

The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.
Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the retained sizes of objects, see who is preventing the Garbage Collector from collecting objects, run a report to automatically extract leak suspects.


http://www.eclipse.org/mat/

Thursday, March 2, 2017



Récupération de données selon le pays de Windows


  • Récupérer la langue de Windows 

Clé de registre :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language


valeur = InstallLanguage*
 

https://www.developpez.net/forums/d812588/environnements-developpement/windev/recuperer-langue-windows-oui/


 
  • Séparateur décimal

Clé : HKCU \Control Panel \International
Entrée : sMonDecimalSep
Système : 95, 95+IE4.x, 98, ME, NT, 2K
Signification : Séparateur décimal
Type : REG_SZ Séparateur décimal dans les valeurs monétaires.


http://franck.kiechel.free.fr/dbr_fre/Country.htm
 





*: ID associé au langage de l'OS :

Identifier Locale
0x0000 Language Neutral
0x0400 Process Default Language
0x0401 Arabic (Saudi Arabia)
0x0801 Arabic (Iraq)
0x0c01 Arabic (Egypt)
0x1001 Arabic (Libya)
0x1401 Arabic (Algeria)
0x1801 Arabic (Morocco)
0x1c01 Arabic (Tunisia)
0x2001 Arabic (Oman)
0x2401 Arabic (Yemen)
0x2801 Arabic (Syria)
0x2c01 Arabic (Jordan)
0x3001 Arabic (Lebanon)
0x3401 Arabic (Kuwait)
0x3801 Arabic (U.A.E.)
0x3c01 Arabic (Bahrain)
0x4001 Arabic (Qatar)
0x0402 Bulgarian
0x0403 Catalan
0x0404 Chinese (Taiwan)
0x0804 Chinese (PRC)
0x0c04 Chinese (Hong Kong)
0x1004 Chinese (Singapore)
0x0405 Czech
0x0406 Danish
0x0407 German (Standard)
0x0807 German (Swiss)
0x0c07 German (Austrian)
0x1007 German (Luxembourg)
0x1407 German (Liechtenstein)
0x0408 Greek
0x0409 English (United States)
0x0809 English (United Kingdom)
0x0c09 English (Australian)
0x1009 English (Canadian)
0x1409 English (New Zealand)
0x1809 English (Ireland)
0x1c09 English (South Africa)
0x2009 English (Jamaica)
0x2409 English (Caribbean)
0x2809 English (Belize)
0x2c09 English (Trinidad)
0x040a Spanish (Traditional Sort)
0x080a Spanish (Mexican)

0x0c0a Spanish (Modern Sort)
0x100a Spanish (Guatemala)
0x140a Spanish (Costa Rica)
0x180a Spanish (Panama)
0x1c0a Spanish (Dominican Republic)
0x200a Spanish (Venezuela)
0x240a Spanish (Colombia)
0x280a Spanish (Peru)
0x2c0a Spanish (Argentina)
0x300a Spanish (Ecuador)
0x340a Spanish (Chile)
0x380a Spanish (Uruguay)
0x3c0a Spanish (Paraguay)
0x400a Spanish (Bolivia)
0x440a Spanish (El Salvador)
0x480a Spanish (Honduras)
0x4c0a Spanish (Nicaragua)
0x500a Spanish (Puerto Rico)
0x040b Finnish
0x040c French (Standard)
0x080c French (Belgian)
0x0c0c French (Canadian)
0x100c French (Swiss)
0x140c French (Luxembourg)

0x040d Hebrew
0x040e Hungarian
0x040f Icelandic
0x0410 Italian (Standard)
0x0810 Italian (Swiss)
0x0411 Japanese
0x0412 Korean
0x0812 Korean (JoHab)
0x0413 Dutch (Standard)
0x0813 Dutch (Belgian)
0x0414 Norwegian (Bokmal)
0x0814 Norwegian (Nynorsk)
0x0415 Polish
0x0416 Portuguese (Brazilian)
0x0816 Portuguese (Standard)
0x0418 Romanian
0x0419 Russian
0x041a Croatian
0x0c1a Serbian
0x041b Slovak
0x041c Albanian
0x041d Swedish
0x081d Swedish (Finland)
0x041e Thai
0x041f Turkish
0x0421 Indonesian
0x0422 Ukrainian
0x0423 Belarusian
0x0424 Slovenian
0x0425 Estonian
0x0426 Latvian
0x0427 Lithuanian
0x081a Serbian
0x0429 Farsi
0x042d Basque
0x0436 Afrikaans
0x0438 Faeroese

 






 

Wednesday, March 1, 2017

 
GWT (Google Web Toolkit)


GWT is used by many products at Google, including Google AdWords and Google Wallet. It's open source, completely free, and used by thousands of enthusiastic developers around the world.




Qu'est-ce que le Paris JUG ?