Public Class Form1 Private NumPage As Integer ' numéro de page de 0 à NbreTotalPage - 1 Private NombreContenusRestants As Integer = 50 ' nombre de contenus restants à imprimer ( 50 pour l'exemple ) Private Const NombreContenusParPage As Integer = 21 Private NbreTotalPage As Integer ' nombre total de pages à imprimer Private Sub PrintTest2_Load(sender As Object, e As EventArgs) Handles MyBase.Load NumPage = 0 ' calcul nombre total de pages NbreTotalPage = NombreContenusRestants \ NombreContenusParPage If NombreContenusRestants Mod NombreContenusParPage > 0 Then NbreTotalPage += 1 ' on imprime PrintDocument1.DefaultPageSettings.Landscape = True PrintDocument1.Print() End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Try ' on regroupe toutes les variables par type Dim StfTitre, StfSem, StfDate As StringFormat Dim FontTitre, FontSem, FontDate, FontCont As Font Dim RectEntete, RectPied, RectCont As RectangleF Dim Lefmargin, Topmargin, LargPage, HautPage, NombreContenusBoucle As Integer Dim Pos As Integer Dim LeTitre As String = "Le Titre ici " Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy") Dim LaSem As String = "Semaine " & "14 " & "Année " & "2021" Lefmargin = e.MarginBounds.Left Topmargin = e.MarginBounds.Top LargPage = e.PageSettings.PaperSize.Width HautPage = e.PageSettings.PaperSize.Height StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near} StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center} StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far} FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point) RectEntete = New RectangleF(5, e.PageBounds.Top + 5, e.PageBounds.Width - 10, 30) RectPied = New RectangleF(5, e.PageBounds.Height - 35, e.PageBounds.Width - 10, 30) 'en-tête e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) e.Graphics.DrawString(LaDate, FontDate, Brushes.Black, RectEntete, StfDate) 'Contenu FontCont = New Font("Arial", 9, FontStyle.Bold, GraphicsUnit.Point) Pos = 40 If NombreContenusRestants > 20 Then NombreContenusBoucle = 21 Else NombreContenusBoucle = NombreContenusRestants End If For i = 1 To NombreContenusBoucle ' les contenus d'une page à imprimer RectCont = New RectangleF(50, Pos, 500, 30) e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectCont)) e.Graphics.DrawString(((NumPage * NombreContenusParPage) + i).ToString, FontCont, Brushes.Black, RectCont, StfTitre) Pos += 35 Next i 'Pied de page e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectPied)) e.Graphics.DrawString("Page n°" & (NumPage + 1).ToString & " / " & NbreTotalPage.ToString, FontDate, Brushes.Black, RectPied, StfDate) NumPage += 1 ' on augmente le numéro de page NombreContenusRestants -= NombreContenusParPage e.HasMorePages = NombreContenusRestants > 0 Catch ex As Exception MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) End Try End Sub End Class
Imports System.Globalization Public Class PrintTest2 Private NumPage As Integer ' numéro de page de 0 à NbreTotalPage - 1 Private NombreContenusRestants As Integer = 50 ' nombre de contenus restants à imprimer ( 50 pour l'exemple ) Private Const NombreContenusParPage As Integer = 21 Private NbreTotalPage As Integer ' nombre total de pages à imprimer Private Sub PrintTest2_Load(sender As Object, e As EventArgs) Handles MyBase.Load StartPosition = FormStartPosition.CenterScreen ' on centre la Form à l'écran NumPage = 0 ' calcul nombre total de pages NbreTotalPage = NombreContenusRestants \ NombreContenusParPage If NombreContenusRestants Mod NombreContenusParPage > 0 Then NbreTotalPage += 1 ' on imprime PrintDocument1.DefaultPageSettings.Landscape = True PrintDocument1.Print() End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Try ' on regroupe toutes les variables par type Dim StfTitre, StfSem, StfDate As StringFormat Dim FontTitre, FontSem, FontDate, FontCont As Font Dim RectEntete, RectPied, RectCont As RectangleF Dim Lefmargin, Topmargin, LargPage, HautPage, NombreContenusBoucle As Integer Dim Pos As Integer Dim LeTitre As String = "Le Titre ici " Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy") Dim LaSem As String = "Semaine " & CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday).ToString & " Année " & DateTime.Now.Year.ToString Lefmargin = e.MarginBounds.Left Topmargin = e.MarginBounds.Top LargPage = e.PageSettings.PaperSize.Width HautPage = e.PageSettings.PaperSize.Height StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near} StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center} StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far} FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point) RectEntete = New RectangleF(5, e.PageBounds.Top + 5, e.PageBounds.Width - 10, 30) RectPied = New RectangleF(5, e.PageBounds.Height - 35, e.PageBounds.Width - 10, 30) 'en-tête e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) e.Graphics.DrawString(LaDate, FontDate, Brushes.Black, RectEntete, StfDate) 'Contenu FontCont = New Font("Arial", 9, FontStyle.Bold, GraphicsUnit.Point) Pos = 40 If NombreContenusRestants > 20 Then NombreContenusBoucle = 21 Else NombreContenusBoucle = NombreContenusRestants End If For i = 1 To NombreContenusBoucle ' les contenus d'une page à imprimer RectCont = New RectangleF(50, Pos, 500, 30) e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectCont)) e.Graphics.DrawString(((NumPage * NombreContenusParPage) + i).ToString, FontCont, Brushes.Black, RectCont, StfTitre) Pos += 35 Next i 'Pied de page e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectPied)) e.Graphics.DrawString("Page n°" & (NumPage + 1).ToString & " / " & NbreTotalPage.ToString, FontDate, Brushes.Black, RectPied, StfDate) NumPage += 1 ' on augmente le numéro de page NombreContenusRestants -= NombreContenusParPage e.HasMorePages = NombreContenusRestants > 0 Catch ex As Exception MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) End Try End Sub End Class
Dim RecupTextbox1 As Integer = TextBox1.Text
Dim RecupTextbox1 As Integer = Convert.Toint32(TextBox1.Text)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Imports MySql.Data.MySqlClient
Public Class PrintTest5
Private SelectSemaine As Integer = 15 ' la semaine sélectionnée
Private SelectAnnee As Integer = 2021 ' l'année sélectionnée
Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles )
Private NbreRectParPage As Integer ' le nombre de rectangles àafficher par parge
Private LargPage As Integer ' la largeur de la page à imprimer mode paysage
Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage
Private BoundTopPage As Integer
Private BoundHeight As Integer
Private BoundWidth As Integer
Private pageNum As Integer ' le numero de la page
Private PoliceEnGras As New Font("Arial", 12, FontStyle.Bold)
Private PoliceNormale As New Font("Arial", 11)
Private IdCmde As Integer
Private PosConteneur As Integer
Private PosConTSurPage As Integer
Private PosTopCont As Integer
Private XPosTexte, YPosTexte As Single
Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CentrageGrpBox()
ComptNbreCmd()
' MsgBox(NbreCmd)
Label5.Text = NbreCmd
End Sub
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Try
LargPage = e.PageSettings.PaperSize.Height
HautPage = e.PageSettings.PaperSize.Width
BoundTopPage = e.PageBounds.Top
BoundHeight = e.PageBounds.Height
BoundWidth = e.PageBounds.Width
PosConteneur = 40
XPosTexte = 50
Dim SautLigne As Single = 20
Dim HauteurConteneur As Single
Dim StfTitre, StfSem, StfDate As StringFormat
Dim FontTitre, FontSem, FontDate, FontTitreCont As Font
FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
Dim RectEntete, RectPied, RectangleConteneur As RectangleF
RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30)
RectPied = New RectangleF(5, BoundHeight - 25, BoundWidth - 10, 20)
Dim LeTitre As String = "Liste des départs "
Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021"
'en-tête
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete))
e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre)
e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem)
e.Graphics.DrawString(LaDate & " (Page n°" & pageNum & " / " & pageNum & ")", FontDate, Brushes.Black, RectEntete, StfDate)
'Le contenu
Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer
Dim NomClient, RefCmd, CdePostalCli As String
FontTitreCont = New Font("Arial", 15, FontStyle.Bold, FontStyle.Regular) 'GraphicsUnit.Point)
Mysqlconn.Open()
Dim sqlCdeCmd As New MySqlCommand
Dim rdCmd As MySqlDataReader
sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY CdePostalLivClient,ClientCmd " 'ORDER BY ClientCmd "
sqlCdeCmd.Connection = Mysqlconn
rdCmd = sqlCdeCmd.ExecuteReader
While rdCmd.Read
IdCmde = rdCmd("idCmde")
NomClient = rdCmd("ClientCmd")
RefCmd = rdCmd("RefCmd")
CdePostalCli = rdCmd("CdePostalLivClient")
ReSulComptProSimp = NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'")
ReSulComptProComp = NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'")
ResulComElemCompose = NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'")
ReSulComptTmpsDiv = NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'")
RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, HauteurConteneur)
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur))
Dim CalculTotalLignes = ReSulComptProSimp + ReSulComptProComp + ResulComElemCompose + ReSulComptTmpsDiv
If CalculTotalLignes = 0 Then
RectangleConteneur.Height = 30
Else
RectangleConteneur.Height = (SautLigne * CalculTotalLignes) + (SautLigne * 3)
End If
RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, RectangleConteneur.Height)
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur))
e.Graphics.DrawString("CLIENT : " & NomClient & " / REF : " & RefCmd & " / DEP : " & CdePostalCli, PoliceEnGras, Brushes.Black, XPosTexte, RectangleConteneur.Top + 5) ' RectangleConteneur.Top)
YPosTexte = RectangleConteneur.Top + 5 + SautLigne
If ReSulComptProSimp > 0 Then
e.Graphics.DrawString("-Châssis Simple :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn3.Open()
Dim sqlCChasSimple As New MySqlCommand
Dim RdChasSimple As MySqlDataReader
sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "' " 'ORDER BY ClientCmd "
sqlCChasSimple.Connection = Mysqlconn3
RdChasSimple = sqlCChasSimple.ExecuteReader
While RdChasSimple.Read
e.Graphics.DrawString("---" & RdChasSimple("NomProdcmdprod") & " Quantité : " & RdChasSimple("QteProdcmdprod"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
End While
RdChasSimple.Close()
Mysqlconn3.Close()
End If
If ReSulComptProComp > 0 Then
e.Graphics.DrawString("-Châssis Composé :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn3.Open()
Dim sqlCChasComp As New MySqlCommand
Dim RdChasComp As MySqlDataReader
sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd "
sqlCChasComp.Connection = Mysqlconn3
RdChasComp = sqlCChasComp.ExecuteReader
While RdChasComp.Read
e.Graphics.DrawString("---" & RdChasComp("NomCmdCompos") & " Quantité : " & RdChasComp("QtecdmComp"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn4.Open()
Dim sqlCElemComp As New MySqlCommand
Dim RdElemComp As MySqlDataReader
sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos") & "' " 'ORDER BY ClientCmd "
sqlCElemComp.Connection = Mysqlconn4
RdElemComp = sqlCElemComp.ExecuteReader
While RdElemComp.Read
e.Graphics.DrawString("------" & RdElemComp("TypeElement") & " Désignation : " & RdElemComp("DesigElement") & " Quantité : " & RdElemComp("QteProdcmdprod"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
End While
RdElemComp.Close()
Mysqlconn4.Close()
End While
RdChasComp.Close()
Mysqlconn3.Close()
End If
If ReSulComptTmpsDiv > 0 Then
e.Graphics.DrawString("-Temps Divers :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn3.Open()
Dim sqlCChasTmpDiv As New MySqlCommand
Dim RdChasTmpDiv As MySqlDataReader
sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd "
sqlCChasTmpDiv.Connection = Mysqlconn3
RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader
While RdChasTmpDiv.Read
e.Graphics.DrawString("---" & RdChasTmpDiv("DesiTd"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
End While
RdChasTmpDiv.Close()
Mysqlconn3.Close()
End If
PosConteneur = RectangleConteneur.Location.Y + RectangleConteneur.Height + 10
PosConTSurPage = RectangleConteneur.Location.Y + RectangleConteneur.Height + 2
Label5.Text -= 1
NbreCmd -= 1
End While
rdCmd.Close()
Mysqlconn.Close()
Catch ex As Exception
Mysqlconn.Close()
Mysqlconn2.Close()
Mysqlconn3.Close()
Mysqlconn4.Close()
MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
End Sub
Private Sub CentrageGrpBox()
GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2
GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2
GroupBox1.Location = New Point(GroupBox1.Left)
End Sub
Public Function NbreData(ByVal RequetCompteData As String)
Cursor.Current = Cursors.WaitCursor ' affiche sablier
Mysqlconn2.Open()
Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
Dim i As Integer = cmd.ExecuteScalar()
cmd = Nothing
Mysqlconn2.Close()
Return i
Cursor.Current = Cursors.Default
End Function
Private Sub ComptNbreCmd()
Try
Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ")
NbreCmd = ReqMysqlCountCmd
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub ButPagePlus_Click(sender As Object, e As EventArgs) Handles ButPagePlus.Click
Dim RecupTextbox1 As Integer = TextBox1.Text
Dim RecupTextbox2 As Integer = TextBox2.Text
If RecupTextbox1 < RecupTextbox2 Then
PrintPreviewControl1.StartPage = RecupTextbox1
TextBox1.Text = RecupTextbox1 + 1
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PrintPreviewControl1.Document = PrintDocument1
pageNum = 0
PrintDocument1.DefaultPageSettings.Landscape = True
End Sub
End Class
PosConteneur = RectangleConteneur.Location.Y + RectangleConteneur.Height + 10
PosConTSurPage = RectangleConteneur.Location.Y + RectangleConteneur.Height + 2
Label5.Text -= 1
NbreCmd -= 1
If PosConteneur > 800 Then
e.HasMorePages = True
pageNum = +1
TextBox1.Text = 1
TextBox2.Text = pageNum
PosConteneur = 40
XPosTexte = 50
Else
e.HasMorePages = False
End If
End While
rdCmd.Close()
Mysqlconn.Close()
Catch ex As Exception
Mysqlconn.Close()
Mysqlconn2.Close()
Mysqlconn3.Close()
Mysqlconn4.Close()
MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
Imports MySql.Data.MySqlClient Public Class PrintTest5 Private SelectSemaine As Integer = 15 ' la semaine sélectionnée Private SelectAnnee As Integer = 2021 ' l'année sélectionnée Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles ) Private NbreRectParPage As Integer ' le nombre de rectangles àafficher par parge Private LargPage As Integer ' la largeur de la page à imprimer mode paysage Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage Private BoundTopPage As Integer Private BoundHeight As Integer Private BoundWidth As Integer Private pageNum As Integer ' le numero de la page Private PoliceEnGras As New Font("Arial", 12, FontStyle.Bold) Private PoliceNormale As New Font("Arial", 11) Private IdCmde As Integer Private PosConteneur As Integer Private PosConTSurPage As Integer Private PosTopCont As Integer Private XPosTexte, YPosTexte As Single Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load CentrageGrpBox() ComptNbreCmd() Label5.Text = CType(NbreCmd, String) End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Try LargPage = e.PageSettings.PaperSize.Height HautPage = e.PageSettings.PaperSize.Width BoundTopPage = e.PageBounds.Top BoundHeight = e.PageBounds.Height BoundWidth = e.PageBounds.Width PosConteneur = 40 XPosTexte = 50 Dim SautLigne As Single = 20 Dim HauteurConteneur As Single Dim StfTitre, StfSem, StfDate As StringFormat Dim FontTitre, FontSem, FontDate, FontTitreCont As Font FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point) StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near} StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center} StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far} Dim RectEntete, RectPied, RectangleConteneur As RectangleF RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30) RectPied = New RectangleF(5, BoundHeight - 25, BoundWidth - 10, 20) Dim LeTitre As String = "Liste des départs " Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy") Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021" 'en-tête e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) e.Graphics.DrawString(LaDate & " (Page n°" & pageNum & " / " & pageNum & ")", FontDate, Brushes.Black, RectEntete, StfDate) 'Le contenu Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer Dim NomClient, RefCmd, CdePostalCli As String FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) Mysqlconn.Open() Dim sqlCdeCmd As New MySqlCommand Dim rdCmd As MySqlDataReader sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY CdePostalLivClient,ClientCmd " 'ORDER BY ClientCmd " sqlCdeCmd.Connection = Mysqlconn rdCmd = sqlCdeCmd.ExecuteReader While rdCmd.Read IdCmde = CInt(rdCmd("idCmde")) NomClient = CType(rdCmd("ClientCmd"), String) RefCmd = CType(rdCmd("RefCmd"), String) CdePostalCli = CType(rdCmd("CdePostalLivClient"), String) ReSulComptProSimp = CInt(NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'")) ReSulComptProComp = CInt(NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'")) ResulComElemCompose = CInt(NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'")) ReSulComptTmpsDiv = CInt(NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'")) RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, HauteurConteneur) e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur)) Dim CalculTotalLignes = ReSulComptProSimp + ReSulComptProComp + ResulComElemCompose + ReSulComptTmpsDiv If CalculTotalLignes = 0 Then RectangleConteneur.Height = 30 Else RectangleConteneur.Height = (SautLigne * CalculTotalLignes) + (SautLigne * 3) End If RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, RectangleConteneur.Height) e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur)) e.Graphics.DrawString("CLIENT : " & NomClient & " / REF : " & RefCmd & " / DEP : " & CdePostalCli, PoliceEnGras, Brushes.Black, XPosTexte, RectangleConteneur.Top + 5) ' RectangleConteneur.Top) YPosTexte = RectangleConteneur.Top + 5 + SautLigne If ReSulComptProSimp > 0 Then e.Graphics.DrawString("-Châssis Simple :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne Mysqlconn3.Open() Dim sqlCChasSimple As New MySqlCommand Dim RdChasSimple As MySqlDataReader sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "' " sqlCChasSimple.Connection = Mysqlconn3 RdChasSimple = sqlCChasSimple.ExecuteReader While RdChasSimple.Read e.Graphics.DrawString("---" & RdChasSimple("NomProdcmdprod").ToString & " Quantité : " & RdChasSimple("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne End While RdChasSimple.Close() Mysqlconn3.Close() End If If ReSulComptProComp > 0 Then e.Graphics.DrawString("-Châssis Composé :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne Mysqlconn3.Open() Dim sqlCChasComp As New MySqlCommand Dim RdChasComp As MySqlDataReader sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' " sqlCChasComp.Connection = Mysqlconn3 RdChasComp = sqlCChasComp.ExecuteReader While RdChasComp.Read e.Graphics.DrawString("---" & RdChasComp("NomCmdCompos").ToString & " Quantité : " & RdChasComp("QtecdmComp").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne Mysqlconn4.Open() Dim sqlCElemComp As New MySqlCommand Dim RdElemComp As MySqlDataReader sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos").ToString & "' " sqlCElemComp.Connection = Mysqlconn4 RdElemComp = sqlCElemComp.ExecuteReader While RdElemComp.Read e.Graphics.DrawString("------" & RdElemComp("TypeElement").ToString & " Désignation : " & RdElemComp("DesigElement").ToString & " Quantité : " & RdElemComp("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne End While RdElemComp.Close() Mysqlconn4.Close() End While RdChasComp.Close() Mysqlconn3.Close() End If If ReSulComptTmpsDiv > 0 Then e.Graphics.DrawString("-Temps Divers :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne Mysqlconn3.Open() Dim sqlCChasTmpDiv As New MySqlCommand Dim RdChasTmpDiv As MySqlDataReader sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd " sqlCChasTmpDiv.Connection = Mysqlconn3 RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader While RdChasTmpDiv.Read e.Graphics.DrawString("---" & RdChasTmpDiv("DesiTd").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne End While RdChasTmpDiv.Close() Mysqlconn3.Close() End If PosConteneur = CInt(RectangleConteneur.Location.Y + RectangleConteneur.Height + 10) PosConTSurPage = CInt(RectangleConteneur.Location.Y + RectangleConteneur.Height + 2) NbreCmd -= 1 If PosConteneur > 800 Then e.HasMorePages = True pageNum = +1 TextBox1.Text = CType(1, String) TextBox2.Text = CType(pageNum, String) PosConteneur = 40 XPosTexte = 50 Else e.HasMorePages = False End If End While rdCmd.Close() Mysqlconn.Close() Catch ex As Exception Mysqlconn.Close() Mysqlconn2.Close() Mysqlconn3.Close() Mysqlconn4.Close() MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) End Try End Sub Private Sub CentrageGrpBox() GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2 GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2 GroupBox1.Location = New Point(GroupBox1.Left) End Sub Public Function NbreData(ByVal RequetCompteData As String) As Object Mysqlconn2.Open() Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2) Dim i As Integer = CInt(cmd.ExecuteScalar()) cmd = Nothing Mysqlconn2.Close() Return i End Function Private Sub ComptNbreCmd() Try Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ") NbreCmd = CInt(ReqMysqlCountCmd) Catch ex As Exception MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) End Try End Sub Private Sub ButPagePlus_Click(sender As Object, e As EventArgs) Handles ButPagePlus.Click Dim RecupTextbox1 As Integer = CInt(TextBox1.Text) Dim RecupTextbox2 As Integer = CInt(TextBox2.Text) If RecupTextbox1 < RecupTextbox2 Then PrintPreviewControl1.StartPage = RecupTextbox1 TextBox1.Text = CType(RecupTextbox1 + 1, String) End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PrintPreviewControl1.Document = PrintDocument1 pageNum = 0 PrintDocument1.DefaultPageSettings.Landscape = True End Sub End Class
Label5.Text = CType(NbreCmd, String)
Label5.Text = NbreCmd.ToString)
Public Function NbreData(ByVal RequetCompteData As String) As Object Mysqlconn2.Open() Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2) Dim i As Integer = CInt(cmd.ExecuteScalar()) cmd = Nothing Mysqlconn2.Close() Return i End Function
''' <summary> ''' retourne le nombre de requêtes dans RequetCompteData ''' </summary> ''' <param name="RequetCompteData"></param> ''' <returns></returns> Public Function NbreData(ByVal RequetCompteData As String) As Integer Mysqlconn2.Open() Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2) Dim Valeur As Integer = CInt(cmd.ExecuteScalar()) cmd = Nothing Mysqlconn2.Close() Return Valeur End Function
ReSulComptProSimp = CInt(NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'")) ReSulComptProComp = CInt(NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'")) ResulComElemCompose = CInt(NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'")) ReSulComptTmpsDiv = CInt(NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'"))
Imports MySql.Data.MySqlClient Public Class PrintTest5 Private SelectSemaine As Integer = 15 ' la semaine sélectionnée Private SelectAnnee As Integer = 2021 ' l'année sélectionnée Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles ) Private NbreRectParPage As Integer ' le nombre de rectangles àafficher par parge Private LargPage As Integer ' la largeur de la page à imprimer mode paysage Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage Private BoundTopPage As Integer Private BoundHeight As Integer Private BoundWidth As Integer Private pageNum As Integer ' le numero de la page Private PoliceEnGras As New Font("Arial", 12, FontStyle.Bold) Private PoliceNormale As New Font("Arial", 11) Private IdCmde As Integer ' id de la commande Private PosConteneur As Integer ' position du conteneur ( le rectangle qui contient les données ) Private XPosTexte, YPosTexte As Single ' position du texte dans le conteneur Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load CentrageGrpBox() ' on centre le groupbox ComptNbreCmd() ' on compte le nombre de commandes Label5.Text = NbreCmd.ToString End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Try LargPage = e.PageSettings.PaperSize.Height ' non utilisé HautPage = e.PageSettings.PaperSize.Width ' non utilisé BoundTopPage = e.PageBounds.Top ' limite la hauteur de la page BoundHeight = e.PageBounds.Height ' non utilisé BoundWidth = e.PageBounds.Width ' limite la largeur de la page PosConteneur = 40 ' position de départ du 1er conteneur XPosTexte = 50 ' position du texte sur les X Dim SautLigne As Single = 20 ' hauteur de la ligne du conteneur Dim StfTitre, StfSem, StfDate As StringFormat Dim FontTitre, FontSem, FontDate As Font FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point) StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near} StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center} StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far} Dim RectEntete, RectangleConteneur As RectangleF RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30) ' paramètre du rectangle de l'en-tête Dim LeTitre As String = "Liste des départs " Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy") Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021" 'en-tête e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) ' on dessine le rectangle d'en-tête e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) ' on dessine le titre de l'en-tête e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) ' on dessine la semaine de l'en-tête e.Graphics.DrawString(LaDate & " (Page n°" & pageNum & " / " & pageNum & ")", FontDate, Brushes.Black, RectEntete, StfDate) ' on dessine la date et numero de page de l'en-tête 'Le contenu Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer Dim NomClient, RefCmd, CdePostalCli As String FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) Mysqlconn.Open() Dim sqlCdeCmd As New MySqlCommand Dim rdCmd As MySqlDataReader sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY CdePostalLivClient,ClientCmd " ' on récupére les commandes qui sont dans certain état d'avancement sqlCdeCmd.Connection = Mysqlconn rdCmd = sqlCdeCmd.ExecuteReader While rdCmd.Read IdCmde = CInt(rdCmd("idCmde")) ' on récupére l'id de la commande NomClient = CType(rdCmd("ClientCmd"), String) ' on récupére le nom du client RefCmd = CType(rdCmd("RefCmd"), String) ' on récupére la référence de la commande CdePostalCli = CType(rdCmd("CdePostalLivClient"), String) ' on récupére le code postal du client ReSulComptProSimp = NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'") ' on compte le nombre de produits simple ( suivant l'id de la commande ) ReSulComptProComp = NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'") ' on compte le nombre de produits composés ( suivant l'id de la commande ) ResulComElemCompose = NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'") ' on compte le nombre d'éléments dans le produit composé ( suivant l'id de la commande ) ReSulComptTmpsDiv = NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'") ' on compte le nombre de produits divers ( suivant l'id de la commande ) Dim CalculTotalLignes = ReSulComptProSimp + ReSulComptProComp + ResulComElemCompose + ReSulComptTmpsDiv ' on additionne le nombre de produits pour déterminer le nombre de lignes totales If CalculTotalLignes = 0 Then RectangleConteneur.Height = 30 ' on détermine la hauteur du conteneur si il n'y a pas de données ( dans la logique elle ne sera jamais vide ) Else RectangleConteneur.Height = (SautLigne * CalculTotalLignes) + (SautLigne * 3) ' on détermine la hauteur du conteneur suivant le nombres d'enregistrements dans la BD End If RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, RectangleConteneur.Height) ' paramètres du conteneur e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur)) ' on déssine le conteneur suivant les paramètres e.Graphics.DrawString("CLIENT : " & NomClient & " / REF : " & RefCmd & " / DEP : " & CdePostalCli, PoliceEnGras, Brushes.Black, XPosTexte, RectangleConteneur.Top + 5) ' on déssine la 1ere ligne du conteneur ( Client / Référence / département ) YPosTexte = RectangleConteneur.Top + 5 + SautLigne ' on calcule la position pour la nouvelle ligne du conteneur ' si la commande comporte des produits simple nous les affichons If ReSulComptProSimp > 0 Then e.Graphics.DrawString("-Châssis Simple :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne ' on calcule la position pour la nouvelle ligne du conteneur Mysqlconn3.Open() Dim sqlCChasSimple As New MySqlCommand Dim RdChasSimple As MySqlDataReader sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "' " sqlCChasSimple.Connection = Mysqlconn3 RdChasSimple = sqlCChasSimple.ExecuteReader While RdChasSimple.Read e.Graphics.DrawString("---" & RdChasSimple("NomProdcmdprod").ToString & " Quantité : " & RdChasSimple("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne End While RdChasSimple.Close() Mysqlconn3.Close() End If ' si la commande comporte des produits composés nous les affichons If ReSulComptProComp > 0 Then e.Graphics.DrawString("-Châssis Composé :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne Mysqlconn3.Open() Dim sqlCChasComp As New MySqlCommand Dim RdChasComp As MySqlDataReader sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' " sqlCChasComp.Connection = Mysqlconn3 RdChasComp = sqlCChasComp.ExecuteReader While RdChasComp.Read e.Graphics.DrawString("---" & RdChasComp("NomCmdCompos").ToString & " Quantité : " & RdChasComp("QtecdmComp").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne 'nous affichons les éléments du produit composé Mysqlconn4.Open() Dim sqlCElemComp As New MySqlCommand Dim RdElemComp As MySqlDataReader sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos").ToString & "' " sqlCElemComp.Connection = Mysqlconn4 RdElemComp = sqlCElemComp.ExecuteReader While RdElemComp.Read e.Graphics.DrawString("------" & RdElemComp("TypeElement").ToString & " Désignation : " & RdElemComp("DesigElement").ToString & " Quantité : " & RdElemComp("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne End While RdElemComp.Close() Mysqlconn4.Close() End While RdChasComp.Close() Mysqlconn3.Close() End If ' si la commande comporte des produits divers nous les affichons If ReSulComptTmpsDiv > 0 Then e.Graphics.DrawString("-Temps Divers :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne Mysqlconn3.Open() Dim sqlCChasTmpDiv As New MySqlCommand Dim RdChasTmpDiv As MySqlDataReader sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd " sqlCChasTmpDiv.Connection = Mysqlconn3 RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader While RdChasTmpDiv.Read e.Graphics.DrawString("---" & RdChasTmpDiv("DesiTd").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte) YPosTexte = YPosTexte + SautLigne End While RdChasTmpDiv.Close() Mysqlconn3.Close() End If PosConteneur = CInt(RectangleConteneur.Location.Y + RectangleConteneur.Height + 10) ' on calcule ici la position du conteneur suivant NbreCmd -= 1 'je soustrais la commande traitée au nobre total de commande à traiter End While rdCmd.Close() Mysqlconn.Close() Catch ex As Exception Mysqlconn.Close() Mysqlconn2.Close() Mysqlconn3.Close() Mysqlconn4.Close() MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) End Try End Sub Private Sub CentrageGrpBox() GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2 GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2 GroupBox1.Location = New Point(GroupBox1.Left) End Sub ''' <summary> ''' compte le nombres d'enregistrements que comporte la commande ''' </summary> ''' <param name="RequetCompteData"></param> ''' <returns></returns> Public Function NbreData(ByVal RequetCompteData As String) As Integer Mysqlconn2.Open() Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2) Dim Valeur As Integer = CInt(cmd.ExecuteScalar()) cmd = Nothing Mysqlconn2.Close() Return Valeur End Function Private Sub ComptNbreCmd() Try Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ") NbreCmd = CInt(ReqMysqlCountCmd) Catch ex As Exception MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) End Try End Sub Private Sub ButPagePlus_Click(sender As Object, e As EventArgs) Handles ButPagePlus.Click Dim RecupTextbox1 As Integer = CInt(TextBox1.Text) Dim RecupTextbox2 As Integer = CInt(TextBox2.Text) If RecupTextbox1 < RecupTextbox2 Then PrintPreviewControl1.StartPage = RecupTextbox1 TextBox1.Text = CType(RecupTextbox1 + 1, String) End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PrintPreviewControl1.Document = PrintDocument1 pageNum = 0 PrintDocument1.DefaultPageSettings.Landscape = True End Sub End Class
Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer Dim NomClient, RefCmd, CdePostalCli As String ListContenusRectangle = New List(Of ClassContenuRectangle) Mysqlconn.Open() Dim sqlCdeCmd As New MySqlCommand Dim rdCmd As MySqlDataReader sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY CdePostalLivClient,ClientCmd " 'ORDER BY ClientCmd " sqlCdeCmd.Connection = Mysqlconn rdCmd = sqlCdeCmd.ExecuteReader While rdCmd.Read ' rdCmd.Read permet-il de lire les informations contenues dans les différentes tables de la base de données pour un seul et unique rectangle pour une commande client? End While
Private Sub ComptNbreCmd() Try Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ") NbreCmd = CInt(ReqMysqlCountCmd) Catch ex As Exception MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) NbreCmd = 0 End Try End Sub
Dim ReqMysqlCountCmd as ?????????
'Chemin du fichier ini Public INI_File As New IniFile(My.Application.Info.DirectoryPath + "/Config/Config.ini") 'Lecture de l'Adresse du serveur base de donnée Mysql ( ip ou locahost ) sur le fichier config Public Urlserveur = INI_File.GetString("Serveur-BD", "Url", "(none)").ToString 'Le mot de passe Public Pass_sql As String = "Mon Mot de passe" 'connexion à la bd Public Mysqlconn As New MySqlConnection("server=""" & Urlserveur & """; user id = " & UserBaseDonnee & " ;password= " & Pass_sql & " ;database=" & BaseDonnee & "")
Public Function NbreData(ByVal RequetCompteData As String) As Integer Mysqlconn2.Open() Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2) Dim Valeur As Integer = CInt(cmd.ExecuteScalar()) cmd = Nothing Mysqlconn2.Close() Return Valeur End Function
While rdCmd.Read ''' Code pour afficher un conteneur ''' etc ..... End While
Imports MySql.Data.MySqlClient Public Class PrintTest5 Private ContenuRectangle As ClassContenuRectangle ' le contenu d'un rectangle Private ListContenusRectangle As List(Of ClassContenuRectangle) ' la liste des rectangles Private ListConteneursParPage As List(Of Integer) ' nombre de conteneurs par page Private ReadOnly SelectSemaine As Integer = 15 ' la semaine sélectionnée Private ReadOnly SelectAnnee As Integer = 2021 ' l'année sélectionnée Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles ) Private LargPage As Integer ' la largeur de la page à imprimer mode paysage Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage Private ReadOnly SautLigne As Integer = 20 ' hauteur de la ligne du conteneur Private BoundTopPage, BoundHeight, BoundWidth As Integer Private ReadOnly PoliceEnGras As New Font("Arial", 12, FontStyle.Bold) Private ReadOnly PoliceNormale As New Font("Arial", 11) Private PageNum As Integer ' numéro de page Private TotalPages As Integer ' nombre total de pages Private IdCmde As Integer Private PosYConteneur As Single ' position Y du conteneur ( le rectangle qui contient les données ) Private NumeroConteneur As Integer ' numéro conteneur lors du dessin de ceux-ci Private XPosTexte, YPosTexte As Single ' position du texte dans le conteneur ''' <summary> ''' Classe avec le contenu d'un rectangle ''' </summary> Public Class ClassContenuRectangle Public Property ListLignes As List(Of String) ' liste des lignes contenues dans un rectangle Public Property ListPolices As List(Of Font) ' la police de caractères de chaque ligne Public Property NbLignes As Integer ' nombre de lignes d'un rectangle Public Property Hauteur As Single ' hauteur d'un rectangle conteneur ( selon le nombre de lignes ) Public Property Largeur As Single ' largeur d'un rectangle conteneur ( ne varie pas ) Public Property PosY As Single ' position Y d'un rectangle conteneur ( position Y du conteneur sur une page ) Public Property PosX As Single ' position X d'un rectangle conteneur ( ne varie pas ) End Class ''' <summary> ''' Chargement de la Form ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' centrage à l'écran With GroupBox1 .Top = (Height - .Height) \ 2 .Left = (Width - .Width) \ 2 .Location = New Point(.Left, .Top) End With End Sub ''' <summary> ''' Affichage de la Form ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub PrintTest5_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown Try ' on compte le nombre de commandes NbreCmd = NbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ") Catch ex As Exception MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning) NbreCmd = 0 End Try If NbreCmd > 0 Then LectureBaseDonnees() PageNum = 1 ' la première page est la page 1 TotalPages = DeterminerNombreTotalPages() NumeroConteneur = 0 ' numéro du premier conteneur End If End Sub ''' <summary> ''' Détermination du nombre total de pages ''' </summary> Private Function DeterminerNombreTotalPages() As Integer Dim PositionConteneurSuivant As Single Dim NombreConteneursPage As Integer ListConteneursParPage = New List(Of Integer) ' cette liste contiendra le nombre de conteneurs par page et sa taille correspond au nombre de pages NombreConteneursPage = 1 ' premier conteneur de la page For i = 1 To ListContenusRectangle.Count - 1 With ListContenusRectangle(i - 1) PositionConteneurSuivant = .PosY + .Hauteur + 10 ' on calcule ici la position du conteneur suivant en tenant compte du conteneur précédent End With With ListContenusRectangle(i) If PositionConteneurSuivant + .PosY + .Hauteur + 10 < 800 Then ' le conteneur suivant tient sur la page NombreConteneursPage += 1 Else ' le conteneur suivant est sur la prochaine page : évite que des conteneurs soit à cheval sur 2 pages ListConteneursParPage.Add(NombreConteneursPage) NombreConteneursPage = 1 ' premier conteneur de la page suivante End If End With Next Return ListConteneursParPage.Count End Function ''' <summary> ''' Impression d'une page et gestion du e.HasMorePages ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim RectEntete, RectPied, RectangleConteneur As RectangleF Dim StfTitre, StfSem, StfDate As StringFormat Dim FontTitre, FontSem, FontDate As Font Dim LeTitre As String = "Liste des départs " Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy") Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021" With e.PageSettings HautPage = e.PageSettings.PaperSize.Width LargPage = e.PageSettings.PaperSize.Height End With With e.PageBounds BoundTopPage = .Top BoundHeight = .Height BoundWidth = .Width End With FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point) FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point) StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near} StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center} StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far} RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30) RectPied = New RectangleF(5, BoundHeight - 25, BoundWidth - 10, 20) PosYConteneur = 40 ' position de départ du 1er conteneur XPosTexte = 50 ' position du texte sur les X 'en-tête de la page e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) ' on dessine le rectangle d'en-tête e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) ' on dessine le titre de l'en-tête e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) ' on dessine la semaine de l'en-tête e.Graphics.DrawString(LaDate & " (Page n° " & PageNum.ToString & " / " & TotalPages.ToString & ")", FontDate, Brushes.Black, RectEntete, StfDate) ' on dessine la date et numéro de page de l'en-tête 'contenus des conteneurs sur la page For i = 0 To ListConteneursParPage(PageNum) - 1 ' pour chaque conteneur de la page With ListContenusRectangle(NumeroConteneur) ' on dessine le conteneur RectangleConteneur = New RectangleF(.PosX, .PosY, .Largeur, .Hauteur) ' paramètres du conteneur e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur)) ' on déssine le conteneur suivant les paramètres ' on affiche les différentes lignes contenus dans ce rectangle YPosTexte = RectangleConteneur.Top + 5 For j = 0 To .ListLignes.Count - 1 e.Graphics.DrawString(.ListLignes(i), .ListPolices(i), Brushes.Black, XPosTexte, YPosTexte) ' on déssine unrligne YPosTexte += SautLigne ' on calcule la position pour la ligne suivante du conteneur Next End With NumeroConteneur += 1 ' numéro conteneur suivant Next If NumeroConteneur < ListContenusRectangle.Count Then ' il reste des conteneurs sur une page suivante e.HasMorePages = True PageNum = +1 TextBox1.Text = 1.ToString TextBox2.Text = PageNum.ToString Else ' plus de conteneur : l'impression est finie e.HasMorePages = False End If End Sub ''' <summary> ''' Lit la base de données et en déduit le contenu de chaque rectangle ''' </summary> Private Sub LectureBaseDonnees() Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer Dim NomClient, RefCmd, CdePostalCli As String ListContenusRectangle = New List(Of ClassContenuRectangle) Mysqlconn.Open() Dim sqlCdeCmd As New MySqlCommand Dim rdCmd As MySqlDataReader sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY CdePostalLivClient,ClientCmd " 'ORDER BY ClientCmd " sqlCdeCmd.Connection = Mysqlconn rdCmd = sqlCdeCmd.ExecuteReader While rdCmd.Read ' lecture des informations pour un rectangle ContenuRectangle = New ClassContenuRectangle With {.ListLignes = New List(Of String), .ListPolices = New List(Of Font)} ' nouveau conteneur With ContenuRectangle IdCmde = CInt(rdCmd("idCmde")) NomClient = rdCmd("ClientCmd").ToString RefCmd = rdCmd("RefCmd").ToString CdePostalCli = rdCmd("CdePostalLivClient").ToString ReSulComptProSimp = NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'") ReSulComptProComp = NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'") ResulComElemCompose = NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'") ReSulComptTmpsDiv = NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'") ' ajoute une ligne .ListLignes.Add("CLIENT : " & NomClient & " / REF : " & RefCmd & " / DEP : " & CdePostalCli) .ListPolices.Add(PoliceEnGras) If ReSulComptProSimp > 0 Then ' ajoute une ligne .ListLignes.Add("-Châssis Simple :") .ListPolices.Add(PoliceEnGras) Mysqlconn3.Open() Dim sqlCChasSimple As New MySqlCommand Dim RdChasSimple As MySqlDataReader sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "' " sqlCChasSimple.Connection = Mysqlconn3 RdChasSimple = sqlCChasSimple.ExecuteReader While RdChasSimple.Read ContenuRectangle.ListLignes.Add("---" & RdChasSimple("NomProdcmdprod").ToString & " Quantité : " & RdChasSimple("QteProdcmdprod").ToString) ContenuRectangle.ListPolices.Add(PoliceNormale) End While RdChasSimple.Close() Mysqlconn3.Close() End If If ReSulComptProComp > 0 Then ' ajoute une ligne .ListLignes.Add("-Châssis Composé :") .ListPolices.Add(PoliceEnGras) Mysqlconn3.Open() Dim sqlCChasComp As New MySqlCommand Dim RdChasComp As MySqlDataReader sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' " sqlCChasComp.Connection = Mysqlconn3 RdChasComp = sqlCChasComp.ExecuteReader While RdChasComp.Read ContenuRectangle.ListLignes.Add("---" & RdChasComp("NomCmdCompos").ToString & " Quantité : " & RdChasComp("QtecdmComp").ToString) ContenuRectangle.ListPolices.Add(PoliceNormale) Mysqlconn4.Open() Dim sqlCElemComp As New MySqlCommand Dim RdElemComp As MySqlDataReader sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos").ToString & "' " sqlCElemComp.Connection = Mysqlconn4 RdElemComp = sqlCElemComp.ExecuteReader While RdElemComp.Read ' ajoute une ligne .ListLignes.Add("------" & RdElemComp("TypeElement").ToString & " Désignation : " & RdElemComp("DesigElement").ToString & " Quantité : " & RdElemComp("QteProdcmdprod").ToString) .ListPolices.Add(PoliceNormale) End While RdElemComp.Close() Mysqlconn4.Close() End While RdChasComp.Close() Mysqlconn3.Close() End If If ReSulComptTmpsDiv > 0 Then ' ajoute une ligne .ListLignes.Add("-Temps Divers :") .ListPolices.Add(PoliceEnGras) Mysqlconn3.Open() Dim sqlCChasTmpDiv As New MySqlCommand Dim RdChasTmpDiv As MySqlDataReader sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd " sqlCChasTmpDiv.Connection = Mysqlconn3 RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader While RdChasTmpDiv.Read ' ajoute une ligne .ListLignes.Add("---" & RdChasTmpDiv("DesiTd").ToString) .ListPolices.Add(PoliceNormale) End While RdChasTmpDiv.Close() Mysqlconn3.Close() End If .NbLignes = .ListLignes.Count .Hauteur = Convert.ToSingle(SautLigne * (.NbLignes + 3)) ' on détermine la hauteur du conteneur suivant le nombre de lignes contenues dans le conteneur .Largeur = Convert.ToSingle(LargPage - 100) .PosX = 50 ' position X d'un rectangle .PosY = PosYConteneur ' position Y d'un rectangle ( sera calculé plus tard pour chaque conteneur rectangle ) End With ListContenusRectangle.Add(ContenuRectangle) ' on ajoute le rectangle à la liste End While rdCmd.Close() Mysqlconn.Close() End Sub ''' <summary> ''' Pour avoir les valeurs de ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv dans la sub LectureBaseDonnees ''' Pour avoir le nombre de commandes ''' </summary> ''' <param name="RequetCompteData"></param> ''' <returns></returns> Public Function NbreData(RequetCompteData As String) As Integer Mysqlconn2.Open() Dim Cmd As New MySqlCommand(RequetCompteData, Mysqlconn2) Dim Nombre As Integer = CInt(Cmd.ExecuteScalar()) Mysqlconn2.Close() Return Nombre End Function End Class
' centrage à l'écran With GroupBox1 .Top = (Panel1.Height - GroupBox1.Height) \ 2 '(Height - .Height) \ 2 .Left = (Panel1.Width - GroupBox1.Width) \ 2 '(Width - .Width) \ 2 .Location = New Point(GroupBox1.Left) 'Point(.Left, .Top) End With
' centrage à l'écran With GroupBox1 .Top = (Panel1.Height - Height) \ 2 .Left = (Panel1.Width - .Width) \ 2 .Location = New Point(.Left, .Top) End With
'contenus des conteneurs sur la page For i = 0 To ListConteneursParPage(PageNum) - 1
' contenus des conteneurs sur la page For i = 0 To ListConteneursParPage.Count - 1