Mise en place de l'impression d'une facture sur matricielle [Résolu]

joujma5 153 Messages postés samedi 11 novembre 2006Date d'inscription 5 décembre 2014 Dernière intervention - 27 mai 2013 à 09:19 - Dernière réponse : joujma5 153 Messages postés samedi 11 novembre 2006Date d'inscription 5 décembre 2014 Dernière intervention
- 27 mai 2013 à 15:43
Bonjour,
Comme j'ai déjà mentionné dans l'article suivant

Je travaille sur l'impression d'une facture à travers une imprimante matricielle, comme début j'ai réussi à la mise en œuvre de l'imprimante matricielle, mais je me bloque de nouveau :
- la facture à imprimer supporte 32 ligne par page, c'est à dire si le nombre de ligne retourné par la requête sql (select) est supérieur à 32 ligne il faut passer à la page suivante, en outre il faut combler la différence avec des vbcrlf (si nombre de ligne retourné =22 alors il faut imprimer (32-22) vbcrlf.

Voici le code que j'utilise :
cnx.ConnectionString = chaine
            Dim npiece As String = TextBox1.Text
            Try
                cnx.Open()
                Dim cmd, cmd1 As New SqlCommand
                cmd.CommandText = "SELECT dbo.F_DOCLIGNE.Ar_Ref,dbo.F_DOCLIGNE.DL_Design," & _
                    "dbo.F_DOCLIGNE.DL_Qte,dbo.F_DOCLIGNE.DL_Taxe1,dbo.F_DOCLIGNE.DL_PrixUnitaire,dbo.F_DOCLIGNE.DL_MontantTTC,dbo.F_DOCLIGNE.CT_Num,dbo.DP_CLIENTS.CLI_INTITULE,dbo.F_DOCLIGNE.DL_DateBL,ISNULL(dbo.F_DOCLIGNE.PrixPublic,0),dbo.DP_CLIENTS.CLI_IDENTIFIANT,dbo.DP_CLIENTS.CLI_ADRESSE,dbo.DP_CLIENTS.CLI_CODEPOSTAL,dbo.DP_CLIENTS.CLI_VILLE,dbo.F_DOCLIGNE.CO_No,DO_Date,DO_Type FROM (dbo.F_DOCLIGNE LEFT JOIN  dbo.DP_CLIENTS ON dbo.DP_CLIENTS.CLI_UK=dbo.F_DOCLIGNE.cbCT_Num) where ([cbDO_Piece]=@Piece OR [cbDL_PieceBL]=@Piece) AND ([DO_Type]='3'OR [DO_Type]='6'OR [DO_Type]='7') ORDER BY  dbo.F_DOCLIGNE.DL_Design"
                Dim cb_DoPiece() As Byte
                Dim Str As String
                Str = npiece
                ' Convert string to bytes
                cb_DoPiece = System.Text.Encoding.Default.GetBytes(Str)
                cmd.Parameters.Add("@Piece", SqlDbType.VarBinary)
                cmd.Parameters("@Piece").Value = cb_DoPiece
                cmd.CommandType = CommandType.Text
                cmd.Connection = cnx
                cmd1.CommandText = ("SELECT COUNT(AR_ref) FROM F_DOCLIGNE WHERE ([cbDO_Piece]=@Piece1 OR [cbDL_PieceBL]=@Piece1)")
                Dim cb_DoPiece1() As Byte
                Dim Str1 As String
                Str1 = npiece
                ' Convert string to bytes
                cb_DoPiece1 = System.Text.Encoding.Default.GetBytes(Str)
                cmd1.Parameters.Add("@Piece1", SqlDbType.VarBinary)
                cmd1.Parameters("@Piece1").Value = cb_DoPiece1
                cmd1.CommandType = CommandType.Text
                cmd1.Connection = cnx
                Dim reader1 As SqlDataReader
                reader1 = cmd1.ExecuteReader
                reader1.Read()
                Dim rowcount As Integer = reader1(0)
                Dim restrowcount As Integer = 36 - reader1(0)
                reader1.Close()
                Dim reader As SqlDataReader
                reader = cmd.ExecuteReader()
                If reader.HasRows Then
                    MsgBox("Nombre de Lignes" & rowcount)
                    While reader.Read()
                        If rowcount > 32 Then
                            For i As Integer = 0 To 32
                               
                                MsgBox("Faire" & i)
                                Exit For
                            Next
                            For i As Integer = 33 To rowcount
                                
                                MsgBox("Faire" & i)
                                Exit For
                            Next

                        Else
                            If rowcount <= 32 Then
                                MsgBox("i inférieur à 32")
                            End If
                        End If

                    End While
                    reader.Close()
                End If
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical)
            End Try
            cnx.Close()

y' a t ' il quelqu'un qui peut me guider par me donner le principe avec le quel je dois travailler.
Merci
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
joujma5 153 Messages postés samedi 11 novembre 2006Date d'inscription 5 décembre 2014 Dernière intervention - 27 mai 2013 à 15:43
3
Merci
ça n'a pas marché mais par contre vous m'avez donner une idée qui est la suivante:
If reader.HasRows Then
                    Dim x As Integer = 0
                    While reader.Read()
                        'For x = 0 To pages - 1
                        '    MsgBox("X " & x & "| La page est : " & pages & "| Reste " & reste)
                        'Next
                        'For x As Integer = 0 To ((32 * (pages)) - 1)
                        If x Mod 32 = 0 Then
                           'c'est à dire qu'on est dans une nouvelle page
MyPrinter.Print(vbFormFeed)
                        Else
                            'on est dans la même page
                        End If
                        x = x + 1
                        'Next
                    End While
                    reader.Close()
                End If

ce qui reste maintenant c'est de gérer le reste (par exemple si le nombre de lignes retournés sera 34 alors les 32 premières lignes seront dans une page alors que le reste dans une nouvelle page.

Merci joujma5 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de joujma5
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 27 mai 2013 à 11:30
0
Merci
Salut

Saut de page : envoie un caractère ASCII 12 (décimal) FF FormFeed
comme ça tu es sûr d'être au début de la prochaine page

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Commenter la réponse de cs_Jack
joujma5 153 Messages postés samedi 11 novembre 2006Date d'inscription 5 décembre 2014 Dernière intervention - 27 mai 2013 à 11:39
0
Merci
bonjour,
je fais bien un saut de page comme ça:
 MyPrinter.Print(vbFormFeed)
                            MyPrinter.Close()

le problème ne réside pas dans le saut de page, mais dans la composition de saut de page ( c'est à dire si la requête retourne plus que 32 lignes il faut imprimer chaque 32 ligne dans une page séparée et passer à la suite):
exemple:
si nombre de ligne retourné = 96 alors
imprimer les 32 premiers ligne dans page1
puis un saut de page
imprimer les 32 lignes de suite dans page2
puis un saut de page
imprimer les 32 ligne de suite dans page 3
puis un saut de page
Commenter la réponse de joujma5
Utilisateur anonyme - 27 mai 2013 à 12:18
0
Merci
Salut,

Utilise Math.DivRem pour savoir le nombre de pages à imprimer et le reste de lignes :
Dim reste As Integer
Dim pages as integer = Math.DivRem(nombre_lignes_total, lignes_par_page, reste)

Ensuite, tu fais une boucle en ordonnant l'impression assorti d'un retour de page.
for x = 0 to pages-1 ...
     impression page
     si pas derniere page ou reste > 0 alors retour ligne
next
impression reste
Commenter la réponse de Utilisateur anonyme
joujma5 153 Messages postés samedi 11 novembre 2006Date d'inscription 5 décembre 2014 Dernière intervention - 27 mai 2013 à 12:31
0
Merci
merci, je vais tester et je vous rendrai compte
Commenter la réponse de joujma5
Utilisateur anonyme - 27 mai 2013 à 12:42
0
Merci
Oui d'ailleurs c'est plutôt
for x = 0 to pages-1 
     impression page
     si pas derniere page ou reste > 0 alors nouvelle page
next
si reste > 0 alors impression page
fermeture
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.