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 |
Tuesday, March 14, 2017
Choisir les applications utilisées par défaut sur Android
http://www.prodigemobile.com/tutoriel/choisir-applications-defaut-android/
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/
Thursday, March 9, 2017
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/
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.
« Ah ben zut alors! C’est pas le bon résultat ».
Qu’est-ce qui se passe?
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
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.
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é:
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.
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
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.
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 |
2 | public void testAddCommission() { |
3 | double actual = addCommission(1000000.1); |
4 | assertEquals(1000001.3, actual, 0); |
5 | } |
6 |
7 | public 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 typesfloat, 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é:
1 | float f = 0.1f; |
2 | System.out.println(f); // affiche 0.1 |
3 | BigDecimal d = new BigDecimal(f); |
4 | System.out.println(d); // affiche 0.100000001490116119384765625 |
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/
Friday, March 3, 2017
Jira
Jira est un système de suivi de bugs, un système de gestion des incidents, et un système de gestion de projets développé par Atlassian.
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
Subscribe to:
Comments (Atom)