Expression régulière date

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 177
Inscription : dim. 24/juin/2018 1:20

Expression régulière date

Message par Ekim »

Bonsoirs à tous

je m'adresse aux virtuose des "Expression régulière";

voilà mon problème, sur un bloc texte je souhaiterais repérer toute les dates
le souci c'est que je ne pige rien à ce langage :oops:

Code : Tout sélectionner


OpenWindow(0,0,0,200,200,"",#PB_Window_ScreenCentered)
EditorGadget(1,0,0,200,180)
;StringGadget(1,0,0,200,180,"")
ButtonGadget(2,0,180,30,20,"cap")

If CreateRegularExpression(10,"(0?[1-9]/[12][0-9]/3[01])") ;(0?[1-9]/[12][0-9]/3[01]) ;(\d{4})-(\d{1,2})-(\d{1,2})
	Debug "RegEx ok!"
Else
	Debug "RegEx erreur!"
EndIf

Dim Resultat$(0)

Repeat
	Event = WaitWindowEvent()
	WindowID = EventWindow()
	GadgetID = EventGadget()
	EventType = EventType()
	
	Select GadgetID
		Case 2
			txt$=GetGadgetText(1)

			If txt$
				Nb = ExtractRegularExpression(10, txt$, Resultat$())
					
				For k = 0 To Nb-1
					Debug Resultat$(k)
				Next
			EndIf
	EndSelect
ForEver
j'ai essayé de chopper sur le net quelques exemples de regex mais ils ne sont pas du tout valide((
éclairez moi svp
Ollivier
Messages : 3750
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Expression régulière date

Message par Ollivier »

Est-ce que tu es contraint d'utiliser les expressions régulières ?
Ekim
Messages : 177
Inscription : dim. 24/juin/2018 1:20

Re: Expression régulière date

Message par Ekim »

@Ollivier franchement oui ou bien alors je ne sais pas si on peut faire autrement!
voici un exemple de bloc texte copier à partir d'un logiciel au travail

Code : Tout sélectionner

07/04/19 P F5-121-04                   0       5       0       5       0  ((
((                                                                            ((
((  12/04/19 P F6-070-04                   0      30       0      30       0  ((
((           P F6-092-04                   0      30       0      30       0  ((
((                                   ---------------------------------------  ((
((       TOTAL DATE 12/04/19               0      60       0      60       0  ((
((                                                                            ((
((  13/04/19 P F4-110-04                   0      36       0      36       0
à terme, je souhaiterais pouvoir capturer le doublet (date - adresse - quantité) "07/04/19_F5-121-04_5"
représenté sous cette ligne d'exemple "07/04/19 P F5-121-04 0 5 0 5 0 "
Avatar de l’utilisateur
cage
Messages : 351
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Expression régulière date

Message par cage »

Bonsoir,

@Ekim, peux-tu souligner dans un exemple les parties que tu cherches a récupérer pour que l'on puisse mieux cerner ton besoin. Merci.

CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 5.73 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Marc56
Messages : 1948
Inscription : sam. 08/févr./2014 15:19

Re: Expression régulière date

Message par Marc56 »

à terme, je souhaiterais pouvoir capturer le doublet (date - adresse - quantité) "07/04/19_F5-121-04_5"
représenté sous cette ligne d'exemple "07/04/19 P F5-121-04 0 5 0 5 0 "
Si ta date a toujours la forme JJ/MM/AA, la regex est facile:

Code : Tout sélectionner

\b\d{2}/\d{2}/\d{2}.+\b
On peut faire plus élaboré pour vérifier jour (1 à 31, mois 1 à 12, année inférieurs à année en cours)
To code capture plusieurs fois le contenu de l’éditeur. Il faut penser à vider.
(Eviter d'utiliser des ID numériques pour les gadgets)

Code : Tout sélectionner

EnableExplicit

; Pour test
Define A$ = "07/04/19 P F5-121-04                   0       5       0       5       0  (("     + #CRLF$ +
            "((                                                                            ((" + #CRLF$ +
            "((  12/04/19 P F6-070-04                   0      30       0      30       0  ((" + #CRLF$ +
            "((           P F6-092-04                   0      30       0      30       0  ((" + #CRLF$ +
            "((                                   ---------------------------------------  ((" + #CRLF$ +
            "((       TOTAL DATE 12/04/19               0      60       0      60       0  ((" + #CRLF$ +
            "((                                                                            ((" + #CRLF$ +
            "((  13/04/19 P F4-110-04                   0      36       0      36       0"


Enumeration 
    #Win
    #Edt
    #Btn
    #Regex
EndEnumeration

OpenWindow(#Win, 0, 0, 200, 200, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
EditorGadget(#Edt, 0, 0, 200, 180)
ButtonGadget(#Btn, 0, 180, 30, 20, "cap")

If CreateRegularExpression(#Regex, "\b\d{2}/\d{2}/\d{2}.+\b")
    Debug "RegEx ok!"
    Debug "Cliquez sur Cap"
    Debug ""
Else
    Debug "RegEx erreur!"
EndIf

Dim Resultat$(0)

; Test
SetGadgetText(#Edt, A$)

Repeat
    Define Event        = WaitWindowEvent()
    ; Define WindowID     = EventWindow()
    Define GadgetID     = EventGadget()
    ; Define EventType    = EventType()
    
    Select GadgetID
        Case #Btn
            Define txt$ = GetGadgetText(1)
            
            If txt$
                Define Nb = ExtractRegularExpression(#Regex, txt$, Resultat$())
                
                Define k
                For k = 0 To Nb - 1
                    Debug Resultat$(k)
                Next
                ; Vider le gadget après usage
                ClearGadgetItems(#Edt)
            EndIf
    EndSelect
Until Event = #PB_Event_CloseWindow     

End
:wink:
Ollivier
Messages : 3750
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Expression régulière date

Message par Ollivier »

On peut carrément faire autrement et bien plus performant que les expressions régulières. Il faut juste savoir exactement ce que tu as besoin : tu as déjà commencé par scinder date, adresse et quantités, ce qui est une bonne étape.

Les dates, il y a un problème : le 10 Avril 2019 s'écrit 10/04/2019 ou bien 04/10/2019 selon les conventions. Soit c'est le jour AVANT le mois, soit c'est le jour APRES le mois.

Dans ton cas, est-ce que tu as la certitude que la convention est soit l'une ou, exclusivement, soit l'autre, et surtout jamais un mélange possible des deux conventions ?

Si jamais il n'y a pas de mélange possible, il y a une solution programmable.
S'il y a mélange possible, il n'y a pas de solution, c'est-à-dire qu'il sera impossible de faire un automate complètement autonome qui ne fera jamais d'erreur.

Dans ton cas, il n'y a qu'une convention ?
Marc56
Messages : 1948
Inscription : sam. 08/févr./2014 15:19

Re: Expression régulière date

Message par Marc56 »

:idea: Si le bloc de texte est formaté d'une manière constante (ce qui est souvent le cas de rapport) alors un simple FindString() + StringField() suffit. (ou Mid() et Trim() si pas de séparateurs standards)

Juste pour le fun, voici une version regex :)
Si ta ligne à utiliser est la première (celle dont la date est contre la marge) et que la quantité est le premier 5 de la même ligne.

Code : Tout sélectionner

EnableExplicit

Define A$ = "07/04/19 P F5-121-04                   0       5       0       5       0  (("     + #CRLF$ +
            "((                                                                            ((" + #CRLF$ +
            "((  12/04/19 P F6-070-04                   0      30       0      30       0  ((" + #CRLF$ +
            "((           P F6-092-04                   0      30       0      30       0  ((" + #CRLF$ +
            "((                                   ---------------------------------------  ((" + #CRLF$ +
            "((       TOTAL DATE 12/04/19               0      60       0      60       0  ((" + #CRLF$ +
            "((                                                                            ((" + #CRLF$ +
            "((  13/04/19 P F4-110-04                   0      36       0      36       0"


Enumeration 
    #Win
    #Edt
    #Btn
    #Regex
EndEnumeration

OpenWindow(#Win, 0, 0, 200, 200, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
EditorGadget(#Edt, 0, 0, 200, 180)
ButtonGadget(#Btn, 0, 180, 30, 20, "cap")

If CreateRegularExpression(#Regex, "^(\d{2}/\d{2}/\d{2})\s+(?:.)\s+([\w\d-]+)\s+(?:.)\s+(\d)")
    Debug "RegEx ok!"
    Debug "Cliquez sur Cap"
    Debug ""
Else
    Debug "RegEx erreur!"
EndIf

Dim Resultat$(0)

; Test
SetGadgetText(#Edt, A$)

Repeat
    Define Event        = WaitWindowEvent()
    Define GadgetID     = EventGadget()
    
    Select GadgetID
        Case #Btn
            Define txt$ = GetGadgetText(1)
            
            If txt$
                If ExamineRegularExpression(#Regex, txt$)
                    While NextRegularExpressionMatch(#Regex)
                    Define Date$        = RegularExpressionGroup(#Regex, 1)
                    Define Adresse$     = RegularExpressionGroup(#Regex, 2)
                    Define Quantite$    = RegularExpressionGroup(#Regex, 3)
                    Debug "Date     : " + Date$
                    Debug "Adresse  : " + Adresse$
                    Debug "Quantité : " + Val(Quantite$)
                    Debug ""
                    Debug "Code     : " + Date$ + "_" + Adresse$ + "_" + Quantite$
                    Wend
                 EndIf   
                ; Vider le gadget après usage
                ClearGadgetItems(#Edt)
            EndIf
    EndSelect
Until Event = #PB_Event_CloseWindow     

End

Code : Tout sélectionner

RegEx ok!
Cliquez sur Cap

Date     : 07/04/19
Adresse  : F5-121-04
Quantité : 5

Code     : 07/04/19_F5-121-04_5
:wink:
Ekim
Messages : 177
Inscription : dim. 24/juin/2018 1:20

Re: Expression régulière date

Message par Ekim »

Bonsoirs à tous les champions :D

@Cage j'avais précisé mais il est vrai que j'aurais dû écrire "triplet" au lieu de "Doublet" car il y a 3 infos qui m’intéresses Date_Adresse_Quantité

@Tous Oui j'ai effectivement oublier de préciser que la zone Quantité doit comporter des chiffres non nuls et une Date peut comporter plusieurs Adresses ainsi que leur Quantité

voici une copie d'écran du logiciel pro pas plus tard qu'aujourd'hui

Code : Tout sélectionner

28/04/19 P 34-058-04                   0       4       0       4       0  ((
((           P 34-074-05                   0      16       0      16       0  ((
((           P 34-082-05                   0      16       0      16       0  ((
((           P 34-088-05                   0      16       0      16       0  ((
((           P 35-085-05                   0      20       0      20       0  ((
((                                   ---------------------------------------  ((
((       TOTAL DATE 28/04/19               0      72       0      72       0  ((
((                                                                            ((
((  30/04/19 P 34-048-01                   0      16       0      16       0  ((
((           P 34-072-01                   0      16       0      16       0  ((
((           P 35-091-02                   0      20       0      20       0
Note: "TOTAL DATE 28/04/19 0 72 0 72 0"
à ne pas tenir compte car je n'en ai pas besoin

@Marc56 Oui la Date est toujours sous cette forme "jj/mm/aa" et
inutile d'élaborer ta RegEx car elle est amplement suffisante, pour
répondre à ta 2eme questions, effectivement le texte est toujours
formaté de cette façon, voici quelques copie différentes:

Code : Tout sélectionner

29/04/19 P 45-141-05                   0      11       0      11       0  ((
((                                                                            ((
((  30/04/19 P F1-075-03                   0      24       0      24       0  ((
((           P F1-075-04                   0      16       0      16       0  ((
((           P F1-077-02                   0      16       0      16       0  ((
((                                   ---------------------------------------  ((
((       TOTAL DATE 30/04/19               0      56       0      56       0
ou encore

Code : Tout sélectionner

20/04/19 P 37-035-02                   0      32       0      32       0  ((
((                                                                            ((
((  30/04/19 P 36-042-05                   0      42       0      42       0  ((
((           P 36-090-03                   0      72       0      72       0
les Adresses et Quantités ne possédants pas de Dates c'est tout simplement parce qu'ils
dépendent de la dernière Date

@Marc56 ton 1er code est intéressant mais il ne récupère que les dernières Date, mais sinon super l'idée
et le 2eme récupère la 1ere ligne, le style est très intéressant, grand bravo :D

@Ollivier pour mon cas la convention ne rentre pas en compte donc reste à 10/04/19 et c'est une certitude :wink:


@Tous en tout cas merci pour votre aides, au taff, je me sers d'un vieux logiciel pour gérer des stocks et j’essaie de m'épargner le couplet "papier/stylos" car je perd un temps fou
à tout noter/trié, par la suite, je ferais imprimer toutes ces données recueillit en condensé sur papier, gain de temps >2h minimum et cela me permettrais d'avoir enfin une pause déjeuné de 1h, vous vous en rendez compte? :lol:
Avatar de l’utilisateur
cage
Messages : 351
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Expression régulière date

Message par cage »

Bonsoir,
Pas eu le temps de regarder avant, aussi un code vite fait.
La sortie semble parfaitement formatée, aussi, j'ai fait au plus simple.

Code : Tout sélectionner

EnableExplicit

Define A$, L$, V, n, count, line, line$
Define addr$, date$, nbre$

; Pour test
A$ = "07/04/19 P F5-121-04                   0       5       0       5       0  (("     + #CRLF$ +
     "((                                                                            ((" + #CRLF$ +
     "((  12/04/19 P F6-070-04                   0      30       0      30       0  ((" + #CRLF$ +
     "((           P F6-092-04                   0      30       0      30       0  ((" + #CRLF$ +
     "((                                   ---------------------------------------  ((" + #CRLF$ +
     "((       TOTAL DATE 12/04/19               0      60       0      60       0  ((" + #CRLF$ +
     "((                                                                            ((" + #CRLF$ +
     "((  13/04/19 P F4-110-04                   0      36       0      36       0"
  
A$ + #CRLF$ ; on s'assure que la dernière ligne soit prise en compte

count = CountString(A$, #CRLF$) ;: Debug "count="+count
  
For line = 1 To count
  line$ = StringField(A$, line, #CRLF$)
  line$ = ReplaceString(line$, "((", "")
  line$ = Trim(line$)
  If line$ = "" : Continue : EndIf
  line$ = ReplaceString(line$, Chr(9), " ")
  For n = 1 To Len(line$)
    line$ = ReplaceString(line$, "  ", " ")
  Next
  If line$ = "" : Continue : EndIf
  Select UCase(Left(line$, 5))
   Case "TOTAL"
   Case "-----"
   Default
    L$ = Left(line$, 1)
    V  = Asc(L$)
    Select V
      Case 48 To 51 ; 0,1,2,3 Jours de (0)1 a (3)1
        date$ = StringField(line$, 1, " ")
        addr$ = StringField(line$, 2, " ") + " " + StringField(line$, 3, " ")
        nbre$ = StringField(line$, 5, " ")
        : Debug date$ + " ---> " + addr$ + " ---> " + nbre$
        : Debug ""
      Case 65 To 90 ; de A a Z on cherche P dans l'exemple
        addr$ = StringField(line$, 1, " ") + " " + StringField(line$, 2, " ")
        nbre$ = StringField(line$, 4, " ")
        : Debug date$ + " ---> " + addr$ + " ---> " + nbre$
        : Debug ""
    EndSelect
  EndSelect
Next
Ce qui donne en sortie:
07/04/19 ---> P F5-121-04 ---> 5

12/04/19 ---> P F6-070-04 ---> 30

12/04/19 ---> P F6-092-04 ---> 30

13/04/19 ---> P F4-110-04 ---> 36
Bonne nuit a tous.
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 5.73 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Marc56
Messages : 1948
Inscription : sam. 08/févr./2014 15:19

Re: Expression régulière date

Message par Marc56 »

Juste pour le fun :P version regex avec groupe nommé
À adapter notamment pour le code adresse (j'ai supposé que c'était toujours P espace puis un code)

Code : Tout sélectionner

EnableExplicit

Define A$ = "07/04/19 P F5-121-04                   0       5       0       5       0  (("     + #CRLF$ +
            "((                                                                            ((" + #CRLF$ +
            "((  12/04/19 P F6-070-04                   0      30       0      30       0  ((" + #CRLF$ +
            "((           P F6-092-04                   0      30       0      30       0  ((" + #CRLF$ +
            "((                                   ---------------------------------------  ((" + #CRLF$ +
            "((       TOTAL DATE 12/04/19               0      60       0      60       0  ((" + #CRLF$ +
            "((                                                                            ((" + #CRLF$ +
            "((  13/04/19 P F4-110-04                   0      36       0      36       0"


Enumeration 
    #Regex
EndEnumeration

; Regex par goupe nommé
; https://www.purebasic.com/french/documentation/regularexpression/regularexpressionnamedgroup.html
; date      : JJ/MM/AA si elle existe
; adresse   : P Lettres + Chiffres + '-'
; quantité  : deuxième groupe de chiffres


If CreateRegularExpression(#Regex, "(?<date>(\d{2}/\d{2}/\d{2})?) "     +
                                   "(?<adresse>P [\w\d-]+)\s+\d+\s+"    + 
                                   "(?<quantite>\d+)") 
Else
    Debug "RegEx erreur!"
    End
EndIf

Define Date$     
Define Date_Prec$
Define Adresse$  
Define Quantite$ 

If ExamineRegularExpression(#Regex, A$)
    While NextRegularExpressionMatch(#Regex)
        
        ; Conserver la date précédente
        Date_Prec$  = Date$
        
        Date$       = RegularExpressionNamedGroup(#Regex, "date")
        Adresse$    = RegularExpressionNamedGroup(#Regex, "adresse")
        Quantite$   = RegularExpressionNamedGroup(#Regex, "quantite")
        
        ; Donner la date précédente s'il n'y en a aucune
        If Date$ = "" : Date$ = Date_Prec$ : EndIf

        Debug Date$ + " ---> " + Adresse$ + " --- > " + Quantite$
        
    Wend
EndIf   

End

Code : Tout sélectionner

07/04/19 ---> P F5-121-04 --- > 5
12/04/19 ---> P F6-070-04 --- > 30
12/04/19 ---> P F6-092-04 --- > 30
13/04/19 ---> P F4-110-04 --- > 36
:wink:
Ekim
Messages : 177
Inscription : dim. 24/juin/2018 1:20

Re: Expression régulière date

Message par Ekim »

Alors là @Cage et @Marc56 vous êtes des pros c'est certain :D

deux styles différent pour un même résultat, c'est super cool :D
je me dépêche de les adapter :wink:

j'aurais enfin une vrai pause comme tout le monde :lol:

un grand merci à vous tous)
Avatar de l’utilisateur
cage
Messages : 351
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Expression régulière date

Message par cage »

Bonsoir,

La solution de Marc56 fait plus pro, mais peut-être plus difficile a comprendre pour qui ne connait les expressions régulières.
Quoi qu'il en soit, heureux qu'on ait pu te rendre service.
Repose toi bien.

CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 5.73 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Expression régulière date

Message par Zorro »

Version Old School ;)

Code : Tout sélectionner

;***********************************************
;Titre  :*extraction_fiche_pro
;Auteur  : Dobro
;Date  :12/04/2019
;Heure  :14:20:09
;Version Purebasic :  PureBasic 5.70 LTS (Windows - x64)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune 
;***********************************************

A$ = "07/04/19 P F5-121-04                   0       5       0       5       0  (("     + #CRLF$ +
"((                                                                            ((" + #CRLF$ +
"((  12/04/19 P F6-070-04                   0      30       0      30       0  ((" + #CRLF$ +
"((           P F6-092-04                   0      30       0      30       0  ((" + #CRLF$ +
"((                                   ---------------------------------------  ((" + #CRLF$ +
"((       TOTAL DATE 12/04/19               0      60       0      60       0  ((" + #CRLF$ +
"((                                                                            ((" + #CRLF$ +
"((  13/04/19 P F4-110-04                   0      36       0      36       0"
;

num_line=CountString(a$,chr(13))

For L=0 to num_line
		Ligne.s = StringField(A$, L+1, #CRLF$)
		Ligne.s=RemoveString(Ligne.s,"((")
		Ligne.s=replaceString(Ligne.s,chr(9),chr(32))
		Ligne.s=Trim(Ligne.s): Ligne.s=RemoveString(Ligne.s,"---------------------------------------")
		If Mid(Ligne.s,1,1)<>"T"  and  len(Ligne.s)>0; seulement les lignes  ne commençant pas par T.otal			
				If findString(left(Ligne.s,8),"/")=0
						Dates.s=mem$					
				Adresse.s=trim(mid(Ligne.s,1,12))	
				Else
						Dates.s=trim(left(Ligne.s,8))
						mem$=Dates.s					
				Adresse.s=trim(mid(Ligne.s,9,20))	
				Endif
				qua.s=trim(mid(Ligne.s,21,len(ligne.s)))
				qua.s=Trim(qua.s,"0"):	qua.s=Trim(qua.s," ")	 
				qua.s=stringField(qua.s,1," ")
				qua.s=trim(qua.s)				
				quantite.s=qua.s
				Debug Dates.s+"--->"+Adresse.s+"--->"+quantite.s
		Endif
Next L



Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Ekim
Messages : 177
Inscription : dim. 24/juin/2018 1:20

Re: Expression régulière date

Message par Ekim »

Merci @Cage :wink:

@Zorro elle fonctionne tout aussi bien en tout cas, c'est cool)

maintenant j'en suis à la dernière étape qui est l'impression sur papier!

avouons le, se n'est franchement pas évidant d'imaginer le dessin avec "MovePathCursor(X.d, Y.d [, Options])"
et "AddPathSegments(Segments$ [, Options])" :lol:

si il existe un éditeur tableau pour impression avec vecteur, je suis preneur))

Code : Tout sélectionner

Window=OpenWindow(#PB_Any, 0, 0, 400, 320, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget) 

If Window
	ListIcon_ITEM = ListIconGadget(#PB_Any, 0, 0, 400, 300, "CODEGAN", 42,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop|#PB_ListIcon_AlwaysShowSelection)
	
	AddGadgetColumn(ListIcon_ITEM, 1, "EAN",42)
	AddGadgetColumn(ListIcon_ITEM, 2, "PCB", 65)
	AddGadgetColumn(ListIcon_ITEM, 3, "Description", 40)
	AddGadgetColumn(ListIcon_ITEM, 4, "ADRESSE", 42)
	
	Button_Impr = ButtonGadget(#PB_Any, 0, 300, 70, 20, "Imprimer")
EndIf

For i=0 To 5
	AddGadgetItem(ListIcon_ITEM, i,Str(Random(4552,1224))+Chr(10)+"3561221244"+Str(Random(988,124))+Chr(10)+Str(Random(10,5))+Chr(10)+"Produit "+Str(i)+Chr(10)+"37-035-02 > 32]]30/04/19 > 36-042-05 > 42]]30/04/19 > 36-090-03 > 72]]")
Next i

Repeat
	Event = WaitWindowEvent()
	WindowID = EventWindow()
	GadgetID = EventGadget()
	EventType = EventType()
	
	Select GadgetID
		Case Button_Impr	
			
			If PrintRequester()
				If StartPrinting("Liste à contrôler")
					
					If Not LoadFont(0, "Arial", 12)
						Debug "Font impact non chargeable!"
					EndIf
					
					StartVectorDrawing(PrinterVectorOutput(#PB_Unit_Point))
					VectorFont(FontID(0),5)
					
					DrawVectorText("CODEGAN - EAN - PCB - DESCRIPTION - ADRESSE")
					
					For ln=0 To 5
						codegan$ = GetGadgetItemText(ListIcon_ITEM, ln,0)
						ean$ = GetGadgetItemText(ListIcon_ITEM, ln,1)
						pcb$ = GetGadgetItemText(ListIcon_ITEM, ln,2)
						desctmp$ = GetGadgetItemText(ListIcon_ITEM, ln,3)
						adr$ = ReplaceString(GetGadgetItemText(ListIcon_ITEM, ln,4),"]]",#CRLF$)
						
						DrawVectorText(desctmp$+" "+codegan$+" "+ean$+" "+pcb$+" ")
						DrawVectorText(adr$)
					Next ln
					
					StopVectorDrawing()
					StopPrinting()
				EndIf
			Else
				Debug "Erreur de parametrage d'imprimante"
			EndIf
			
	EndSelect
			
Until Event = #PB_Event_CloseWindow

Je suis incapable de faire figurer "CODEGAN - EAN - PCB - DESCRIPTION - ADRESSE" en en-tête dans un tableau!
Marc56
Messages : 1948
Inscription : sam. 08/févr./2014 15:19

Re: Expression régulière date

Message par Marc56 »

avouons le, ce n'est franchement pas évidant d'imaginer le dessin avec "MovePathCursor(X.d, Y.d
C'est pourtant comme cela qu'on fait :)
et il suffit d'ajouter une seul ligne à ton programme.

Code : Tout sélectionner

...
  For ln=0 To 5
    MovePathCursor(0, ln * 30 + 20) ; <--- Décalage ligne + Décalage paragraphe 
    codegan$ = GetGadgetItemText(ListIcon_ITEM, ln,0)
...
:idea: Tant qu'à utiliser la lib Vector, autant utiliser aussi ses fonctions de changement d'unité et travailler en mm plutôt qu'en dpi, ainsi pas besoin de se préoccuper de la résolution de l'imprimante.

Code : Tout sélectionner

StartVectorDrawing(PrinterVectorOutput(#PB_Unit_Millimeter))
Ça permet aussi de gérer les sauts de page facilement (puisqu'on travaille en coordonnées absolue) et remettre la ligne d'entête à chaque nouvelle page.

:idea: Remplacer le code html > ('>') par autre chose car il ne sera pas interprété par l'imprimante.

:idea: Le plus souvent on se fabrique une macro ou une procédure qui encapsule le positionnement, le texte, fonte, couleur, type.

Pas besoin de lib externe, tout est dans dans PB donc pérennité du code.
:wink:
Répondre