EDN Admin
Well-known member
Hi guys, im having an issue when using the print button on a print preview dialog. im creating a document for customers statements that shows all the debits/credits to their account and a running balance. i have the code creating the document and populating
the print preview dialog from an adodb recordset, and it shows the preview not a problem. its when you click the print button in the preview that it throws up an EOF/BOF error on the recordset.
i now understand that the printpage even handles both the preview and the printing so i included coding that closed off the recordset, re-set all the counters and balance totals, re-set the connection string (i have to re-set it because there is the capability
of printing only a partial statement, so i have to select all records before the selected date, calculate the balance up to that point, then select all the records from the selected date and use the calculated balance from that point in the statement), then
re-open the connection. but this still throws up the error, when the error appears its as if the code isnt resetting the recordset and when it prints its trying to print everything after the last record?
some abbreviated code is below
Public reference_no, qtr, fyear As Integer<br/>
Public statement_type, statement, sqlString As String<br/>
Dim balance As Decimal = 0<br/>
Dim startdate As Date<br/>
Dim payments As ADODB.Recordset = New ADODB.Recordset<br/>
Dim no_of_payments As Integer = 0<br/>
Dim mpages As Integer = 0<br/>
Dim SalesReport As PrintDocument<br/>
<br/>
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim dlgPreview As New PrintPreviewDialog
payments.LockType = ADODB.LockTypeEnum.adLockReadOnly<br/>
payments.CursorType = ADODB.CursorTypeEnum.adOpenStatic
reference_no = "Customer Ceference Number"<br/>
statement_type = "Customers account type" we have a number of different accounts for our customers<br/>
statement = "Full" or "Partial" depends whether a full or partial statement is required<br/>
If statement = "Partial" Then<br/>
qtr = "Chosen Quarter for statement to commence from"<br/>
fyear = "Chosen Financial Year for statement to commence from"<br/>
End If<br/>
sconnectstring = "my connection string for the recordset"
getdate() gets the start date for the statement to commence from<br/>
setsql() sets the sql string for the adodb recordset<br/>
getbalance() gets the balance for the start of the statement<br/>
ordersql() adds the order by part of the sql statement
SalesReport = New PrintDocument<br/>
SalesReport.DefaultPageSettings.Landscape = True
payments.Open(sqlString, sConnectstring)
AddHandler SalesReport.PrintPage, AddressOf PrintSalesPage
dlgPreview.Document = SalesReport<br/>
dlgPreview.WindowState = FormWindowState.Maximized
payments.Close()
balance = 0 set the customer starting balance to 0<br/>
getdate() re-set the start date for the statement to commence from<br/>
setsql() re-set the sql string for the adodb recordset<br/>
getbalance() re-sets the balance for the start of the statement<br/>
ordersql() re-add the order by part of the sql statement<br/>
payments.Open(sqlString, sConnectstring) re-open the connection<br/>
no_of_payments = 0 re-set the number of payments processed
dlgPreview.ShowDialog()
payments.Close()
Me.Close()
End Sub<br/>
<br/>
Private Sub getdate()
check if its a partial statement thats required then set the statement start date<br/>
If statement = "Partial" Then<br/>
Select Case qtr<br/>
Case 1<br/>
startdate = FormatDateTime("01/04/" & fyear, DateFormat.ShortDate)<br/>
Case 2<br/>
startdate = FormatDateTime("01/07/" & fyear, DateFormat.ShortDate)<br/>
Case 3<br/>
startdate = FormatDateTime("01/10/" & fyear, DateFormat.ShortDate)<br/>
Case 4<br/>
startdate = FormatDateTime("01/01/" & fyear + 1, DateFormat.ShortDate)<br/>
End Select<br/>
End If
End Sub
Private Sub setsql()
check which account type the statement is for and set up the sql string<br/>
Select Case type<br/>
Case "Account type 1"<br/>
sqlString = "select * from database_table where reference = " & reference_no & ""<br/>
Case "Account type 2"<br/>
sqlString = "select * from database_table where reference = " & reference_no & " and payment_type like Blah"<br/>
End Select
End Sub
Private Sub getbalance()
check if its a partial statement that is required and calculate the statements starting balance if it is<br/>
If statement = "Partial" Then<br/>
add the date requirement to the sql string<br/>
sqlString = sqlString & " and datediff(day, payment_date, convert(datetime, " & startdate & ", 103)) >0"<br/>
ordersql()
payments.Open(sqlString, sConnectstring)<br/>
While Not payments.EOF<br/>
addpayment() add the payments to the balance<br/>
payments.MoveNext() get the next payment<br/>
End While<br/>
payments.Close()
setsql() reset the sql string<br/>
sqlString = sqlString & " and datediff(day, convert(datetime, " & startdate & ", 103), pdate) >=0" add the date requirement to the sql string<br/>
End If
End Sub
Private Sub ordersql()<br/>
add the order to the sql string<br/>
sqlString = sqlString & " order by pdate asc,payment_type"
End Sub
Private Sub addpayment()<br/>
check the payment type and add/subtract the amount to the balance as necessary<br/>
Select Case payments.Fields("payment_type").Value<br/>
Case "Payment_type_1"<br/>
balance = payments.Fields("payment_amount").Value<br/>
Case "Payment_type_2"<br/>
balance = balance + payments.Fields("payment_amount").Value<br/>
Case "Payment_type_3"<br/>
balance = balance - payments.Fields("payment_amount").Value<br/>
End Select
End Sub
Private Sub PrintSalesPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim RecordsPerPage As Integer = 25<br/>
Dim CurrentRecord As Integer = 0<br/>
Dim CurrentY As Integer = 300<br/>
Dim ReportFont As New Font("Arial", 10, FontStyle.Regular)<br/>
Dim ReportFont2 As New Font("Arial", 8, FontStyle.Regular)<br/>
Dim ReportFontHeight As Integer = ReportFont.GetHeight(e.Graphics)
SetupHeader(e.Graphics) set the document header
While CurrentRecord < RecordsPerPage<br/>
no_of_payments += 1
Dim datehold As Date<br/>
Dim typehold As String<br/>
Dim cha As Char
typehold = payments.Fields("payment_type").Value
addpayment() adds od subtracts the payment amount to the balance
balance = Math.Round(balance, 2)
Dim x As Integer<br/>
x = Len(payments.Fields("payment_type").Value) get the length of the payment type<br/>
cha = Mid(typehold, x, 1) get the last letter of the payment type ( this determines if its a credit or a debit to the account)
datehold = FormatDateTime(payments.Fields("payment_date").Value, DateFormat.ShortDate) get the payment date
write the payment type<br/>
e.Graphics.DrawString(payments.Fields("payment_type").Value, ReportFont, Brushes.Black, 200, CurrentY)<br/>
Select Case cha so it writes the payment amount in the appropriate credit/debit column<br/>
Case "t"<br/>
Select Case x<br/>
Case 14, 16, 21, 27, 31, 26<br/>
e.Graphics.DrawString(payments.Fields("payment_amount").Value, ReportFont, Brushes.Black, 500,
CurrentY)<br/>
Case Else<br/>
Dim payh As Double<br/>
payh = Val(payments.Fields("payment_amount").Value)<br/>
payh = payh * -1<br/>
e.Graphics.DrawString(payh, ReportFont, Brushes.Black, 555, CurrentY)<br/>
End Select
Case "s", "f", "n"<br/>
e.Graphics.DrawString(payments.Fields("payment_amount").Value, ReportFont, Brushes.Black, 500, CurrentY)<br/>
Case Else<br/>
e.Graphics.DrawString(payments.Fields("payment_amount").Value, ReportFont, Brushes.Black, 555, CurrentY)<br/>
End Select<br/>
write the rest of the payment info<br/>
e.Graphics.DrawString(datehold, ReportFont, Brushes.Black, 80, CurrentY)<br/>
e.Graphics.DrawString(Math.Round(balance, 2), ReportFont, Brushes.Black, 625, CurrentY)<br/>
e.Graphics.DrawString(payments.Fields("payment_by").Value, ReportFont, Brushes.Black, 685, CurrentY)<br/>
e.Graphics.DrawString(payments.Fields("notes").Value, ReportFont2, Brushes.Black, 825, CurrentY)<br/>
CurrentY = CurrentY + ReportFontHeight
check there are still payments needing processed<br/>
If no_of_payments = payments.RecordCount Then<br/>
Exit While<br/>
End If
CurrentRecord += 1<br/>
payments.MoveNext()
End While
checks to see if the last payment was before the end of the page<br/>
If CurrentRecord < RecordsPerPage Then<br/>
e.HasMorePages = False<br/>
mpages = 1<br/>
Else<br/>
If no_of_payments = payments.RecordCount Then<br/>
e.HasMorePages = False<br/>
mpages = 1<br/>
Else<br/>
e.HasMorePages = True<br/>
mpages = 0<br/>
End If<br/>
End If
Setupfooter(e.Graphics) set the page footer
End Sub
Private Sub SetupHeader(ByRef gx As Graphics)<br/>
set the company logo<br/>
Dim sPictureFile As String<br/>
sPictureFile = "company logo file location"<br/>
If System.IO.File.Exists(sPictureFile) Then<br/>
gx.DrawImage(New Bitmap(sPictureFile), 350, 10)<br/>
End If
Dim customer As ADODB.Recordset<br/>
Dim fullname, street, town, postcode, sag As String
get the customer info<br/>
customer = New ADODB.Recordset<br/>
customer.CursorType = ADODB.CursorTypeEnum.adOpenStatic<br/>
customer.LockType = ADODB.LockTypeEnum.adLockReadOnly<br/>
customer.Open("select * from database_table where reference = " & reference_no & "", sConnectstring)
fullname = customer.Fields("full_n").Value<br/>
street = customer.Fields("street").Value<br/>
town = customer.Fields("town").Value<br/>
postcode = customer.Fields("postcode").Value
customer.Close()
write the customer details and set up the statement table headers<br/>
gx.DrawString("Statement Printout for : " & fullname, New Font("Arial", 18, FontStyle.Bold), Brushes.Black, 50, 220)<br/>
gx.DrawString(street, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 120)<br/>
gx.DrawString(town, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 140)<br/>
gx.DrawString(postcode, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 160)<br/>
gx.DrawString("Our Ref:", New Font("Arial", 12, FontStyle.Regular), Brushes.Black, 780, 185)<br/>
gx.DrawString(sag, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 185)<br/>
gx.DrawString("Description", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 200, 275)<br/>
gx.DrawString("Paid", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 505, 275)<br/>
gx.DrawString("Date Recieved", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 80, 275)<br/>
gx.DrawString("Charged", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 555, 275)<br/>
gx.DrawString("Balance", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 625, 275)<br/>
gx.DrawString("Paid By", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 685, 275)<br/>
gx.DrawString("Notes", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 825, 275)<br/>
gx.DrawLine(New Pen(Brushes.Black), 50, 295, 1000, 295)
End Sub
Private Sub Setupfooter(ByRef gx As Graphics)
Dim yr As Integer<br/>
yr = DatePart(DateInterval.Year, Today)<br/>
<br/>
gx.DrawLine(New Pen(Brushes.Black), 50, 750, 1000, 750)<br/>
check there are no more pages to the statement and write the final balance<br/>
If mpages = 1 Then<br/>
gx.DrawString("Current Account Balance", New Font("Arial", 12, FontStyle.Regular), Brushes.Black, 490, 730)<br/>
gx.DrawString(" " & balance, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 700, 730)<br/>
End If<br/>
<br/>
End Sub
sorry for the code not being in a code block to make it easier to understand but the blocks arent working at the moment.
if someone could have a look to help me find out why its wanting to print the statement from after the last record that would be great.
thanks in advance
View the full article
the print preview dialog from an adodb recordset, and it shows the preview not a problem. its when you click the print button in the preview that it throws up an EOF/BOF error on the recordset.
i now understand that the printpage even handles both the preview and the printing so i included coding that closed off the recordset, re-set all the counters and balance totals, re-set the connection string (i have to re-set it because there is the capability
of printing only a partial statement, so i have to select all records before the selected date, calculate the balance up to that point, then select all the records from the selected date and use the calculated balance from that point in the statement), then
re-open the connection. but this still throws up the error, when the error appears its as if the code isnt resetting the recordset and when it prints its trying to print everything after the last record?
some abbreviated code is below
Public reference_no, qtr, fyear As Integer<br/>
Public statement_type, statement, sqlString As String<br/>
Dim balance As Decimal = 0<br/>
Dim startdate As Date<br/>
Dim payments As ADODB.Recordset = New ADODB.Recordset<br/>
Dim no_of_payments As Integer = 0<br/>
Dim mpages As Integer = 0<br/>
Dim SalesReport As PrintDocument<br/>
<br/>
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim dlgPreview As New PrintPreviewDialog
payments.LockType = ADODB.LockTypeEnum.adLockReadOnly<br/>
payments.CursorType = ADODB.CursorTypeEnum.adOpenStatic
reference_no = "Customer Ceference Number"<br/>
statement_type = "Customers account type" we have a number of different accounts for our customers<br/>
statement = "Full" or "Partial" depends whether a full or partial statement is required<br/>
If statement = "Partial" Then<br/>
qtr = "Chosen Quarter for statement to commence from"<br/>
fyear = "Chosen Financial Year for statement to commence from"<br/>
End If<br/>
sconnectstring = "my connection string for the recordset"
getdate() gets the start date for the statement to commence from<br/>
setsql() sets the sql string for the adodb recordset<br/>
getbalance() gets the balance for the start of the statement<br/>
ordersql() adds the order by part of the sql statement
SalesReport = New PrintDocument<br/>
SalesReport.DefaultPageSettings.Landscape = True
payments.Open(sqlString, sConnectstring)
AddHandler SalesReport.PrintPage, AddressOf PrintSalesPage
dlgPreview.Document = SalesReport<br/>
dlgPreview.WindowState = FormWindowState.Maximized
payments.Close()
balance = 0 set the customer starting balance to 0<br/>
getdate() re-set the start date for the statement to commence from<br/>
setsql() re-set the sql string for the adodb recordset<br/>
getbalance() re-sets the balance for the start of the statement<br/>
ordersql() re-add the order by part of the sql statement<br/>
payments.Open(sqlString, sConnectstring) re-open the connection<br/>
no_of_payments = 0 re-set the number of payments processed
dlgPreview.ShowDialog()
payments.Close()
Me.Close()
End Sub<br/>
<br/>
Private Sub getdate()
check if its a partial statement thats required then set the statement start date<br/>
If statement = "Partial" Then<br/>
Select Case qtr<br/>
Case 1<br/>
startdate = FormatDateTime("01/04/" & fyear, DateFormat.ShortDate)<br/>
Case 2<br/>
startdate = FormatDateTime("01/07/" & fyear, DateFormat.ShortDate)<br/>
Case 3<br/>
startdate = FormatDateTime("01/10/" & fyear, DateFormat.ShortDate)<br/>
Case 4<br/>
startdate = FormatDateTime("01/01/" & fyear + 1, DateFormat.ShortDate)<br/>
End Select<br/>
End If
End Sub
Private Sub setsql()
check which account type the statement is for and set up the sql string<br/>
Select Case type<br/>
Case "Account type 1"<br/>
sqlString = "select * from database_table where reference = " & reference_no & ""<br/>
Case "Account type 2"<br/>
sqlString = "select * from database_table where reference = " & reference_no & " and payment_type like Blah"<br/>
End Select
End Sub
Private Sub getbalance()
check if its a partial statement that is required and calculate the statements starting balance if it is<br/>
If statement = "Partial" Then<br/>
add the date requirement to the sql string<br/>
sqlString = sqlString & " and datediff(day, payment_date, convert(datetime, " & startdate & ", 103)) >0"<br/>
ordersql()
payments.Open(sqlString, sConnectstring)<br/>
While Not payments.EOF<br/>
addpayment() add the payments to the balance<br/>
payments.MoveNext() get the next payment<br/>
End While<br/>
payments.Close()
setsql() reset the sql string<br/>
sqlString = sqlString & " and datediff(day, convert(datetime, " & startdate & ", 103), pdate) >=0" add the date requirement to the sql string<br/>
End If
End Sub
Private Sub ordersql()<br/>
add the order to the sql string<br/>
sqlString = sqlString & " order by pdate asc,payment_type"
End Sub
Private Sub addpayment()<br/>
check the payment type and add/subtract the amount to the balance as necessary<br/>
Select Case payments.Fields("payment_type").Value<br/>
Case "Payment_type_1"<br/>
balance = payments.Fields("payment_amount").Value<br/>
Case "Payment_type_2"<br/>
balance = balance + payments.Fields("payment_amount").Value<br/>
Case "Payment_type_3"<br/>
balance = balance - payments.Fields("payment_amount").Value<br/>
End Select
End Sub
Private Sub PrintSalesPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim RecordsPerPage As Integer = 25<br/>
Dim CurrentRecord As Integer = 0<br/>
Dim CurrentY As Integer = 300<br/>
Dim ReportFont As New Font("Arial", 10, FontStyle.Regular)<br/>
Dim ReportFont2 As New Font("Arial", 8, FontStyle.Regular)<br/>
Dim ReportFontHeight As Integer = ReportFont.GetHeight(e.Graphics)
SetupHeader(e.Graphics) set the document header
While CurrentRecord < RecordsPerPage<br/>
no_of_payments += 1
Dim datehold As Date<br/>
Dim typehold As String<br/>
Dim cha As Char
typehold = payments.Fields("payment_type").Value
addpayment() adds od subtracts the payment amount to the balance
balance = Math.Round(balance, 2)
Dim x As Integer<br/>
x = Len(payments.Fields("payment_type").Value) get the length of the payment type<br/>
cha = Mid(typehold, x, 1) get the last letter of the payment type ( this determines if its a credit or a debit to the account)
datehold = FormatDateTime(payments.Fields("payment_date").Value, DateFormat.ShortDate) get the payment date
write the payment type<br/>
e.Graphics.DrawString(payments.Fields("payment_type").Value, ReportFont, Brushes.Black, 200, CurrentY)<br/>
Select Case cha so it writes the payment amount in the appropriate credit/debit column<br/>
Case "t"<br/>
Select Case x<br/>
Case 14, 16, 21, 27, 31, 26<br/>
e.Graphics.DrawString(payments.Fields("payment_amount").Value, ReportFont, Brushes.Black, 500,
CurrentY)<br/>
Case Else<br/>
Dim payh As Double<br/>
payh = Val(payments.Fields("payment_amount").Value)<br/>
payh = payh * -1<br/>
e.Graphics.DrawString(payh, ReportFont, Brushes.Black, 555, CurrentY)<br/>
End Select
Case "s", "f", "n"<br/>
e.Graphics.DrawString(payments.Fields("payment_amount").Value, ReportFont, Brushes.Black, 500, CurrentY)<br/>
Case Else<br/>
e.Graphics.DrawString(payments.Fields("payment_amount").Value, ReportFont, Brushes.Black, 555, CurrentY)<br/>
End Select<br/>
write the rest of the payment info<br/>
e.Graphics.DrawString(datehold, ReportFont, Brushes.Black, 80, CurrentY)<br/>
e.Graphics.DrawString(Math.Round(balance, 2), ReportFont, Brushes.Black, 625, CurrentY)<br/>
e.Graphics.DrawString(payments.Fields("payment_by").Value, ReportFont, Brushes.Black, 685, CurrentY)<br/>
e.Graphics.DrawString(payments.Fields("notes").Value, ReportFont2, Brushes.Black, 825, CurrentY)<br/>
CurrentY = CurrentY + ReportFontHeight
check there are still payments needing processed<br/>
If no_of_payments = payments.RecordCount Then<br/>
Exit While<br/>
End If
CurrentRecord += 1<br/>
payments.MoveNext()
End While
checks to see if the last payment was before the end of the page<br/>
If CurrentRecord < RecordsPerPage Then<br/>
e.HasMorePages = False<br/>
mpages = 1<br/>
Else<br/>
If no_of_payments = payments.RecordCount Then<br/>
e.HasMorePages = False<br/>
mpages = 1<br/>
Else<br/>
e.HasMorePages = True<br/>
mpages = 0<br/>
End If<br/>
End If
Setupfooter(e.Graphics) set the page footer
End Sub
Private Sub SetupHeader(ByRef gx As Graphics)<br/>
set the company logo<br/>
Dim sPictureFile As String<br/>
sPictureFile = "company logo file location"<br/>
If System.IO.File.Exists(sPictureFile) Then<br/>
gx.DrawImage(New Bitmap(sPictureFile), 350, 10)<br/>
End If
Dim customer As ADODB.Recordset<br/>
Dim fullname, street, town, postcode, sag As String
get the customer info<br/>
customer = New ADODB.Recordset<br/>
customer.CursorType = ADODB.CursorTypeEnum.adOpenStatic<br/>
customer.LockType = ADODB.LockTypeEnum.adLockReadOnly<br/>
customer.Open("select * from database_table where reference = " & reference_no & "", sConnectstring)
fullname = customer.Fields("full_n").Value<br/>
street = customer.Fields("street").Value<br/>
town = customer.Fields("town").Value<br/>
postcode = customer.Fields("postcode").Value
customer.Close()
write the customer details and set up the statement table headers<br/>
gx.DrawString("Statement Printout for : " & fullname, New Font("Arial", 18, FontStyle.Bold), Brushes.Black, 50, 220)<br/>
gx.DrawString(street, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 120)<br/>
gx.DrawString(town, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 140)<br/>
gx.DrawString(postcode, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 160)<br/>
gx.DrawString("Our Ref:", New Font("Arial", 12, FontStyle.Regular), Brushes.Black, 780, 185)<br/>
gx.DrawString(sag, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 850, 185)<br/>
gx.DrawString("Description", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 200, 275)<br/>
gx.DrawString("Paid", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 505, 275)<br/>
gx.DrawString("Date Recieved", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 80, 275)<br/>
gx.DrawString("Charged", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 555, 275)<br/>
gx.DrawString("Balance", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 625, 275)<br/>
gx.DrawString("Paid By", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 685, 275)<br/>
gx.DrawString("Notes", New Font("Arial", 10, FontStyle.Bold), Brushes.Black, 825, 275)<br/>
gx.DrawLine(New Pen(Brushes.Black), 50, 295, 1000, 295)
End Sub
Private Sub Setupfooter(ByRef gx As Graphics)
Dim yr As Integer<br/>
yr = DatePart(DateInterval.Year, Today)<br/>
<br/>
gx.DrawLine(New Pen(Brushes.Black), 50, 750, 1000, 750)<br/>
check there are no more pages to the statement and write the final balance<br/>
If mpages = 1 Then<br/>
gx.DrawString("Current Account Balance", New Font("Arial", 12, FontStyle.Regular), Brushes.Black, 490, 730)<br/>
gx.DrawString(" " & balance, New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 700, 730)<br/>
End If<br/>
<br/>
End Sub
sorry for the code not being in a code block to make it easier to understand but the blocks arent working at the moment.
if someone could have a look to help me find out why its wanting to print the statement from after the last record that would be great.
thanks in advance
View the full article