In an accounting WPF app we have a number of public DataTables that reload data once a tab is opened. This works great locally as the reports just refer to those tables..
For some more complex reports we have just set up a Web Service to run them and return a PDF... To make it easier I thought of loading these DataTables into a DataSet and then extracting them at the server end. This works perfectly the first time it's run, but then (as best as I can work out so far) it's sending the incorrect (last loaded) data for subsequent reports. Locally it still works as it should but the DataTables we are sending in the DataSet appear to not be updating. Have tried to remove the tables and re-add them again, but that just throws a 'object reference not set' the first time a DataRow is selected from a DataTable at the server.
Must be something very basic I have been missing :-(
Any ideas?
Thanks
Private Async Sub RunProfitAndLossOnServer(sender As Object, e As RoutedEventArgs)
Try
Dim StartDateTB As DateTBx = ReportBalanceSheet_Grid.FindName("BalanceSheet_StartDateTB")
Dim EndDateTB As DateTBx = ReportBalanceSheet_Grid.FindName("BalanceSheet_EndDateTB")
ReportStartDate = StartDateTB.Value
ReportEndDate = EndDateTB.Value
ReportDate = Today
ReportName = "Profit and Loss Report"
PaperLandscape = False
ReportFontSize = 8
PopupModals_ReportGenerator()
If ReportGeneratorRun = True Then
Dim vPDF() As Byte = Nothing
'Determine if the Export Dataset has already been created
If ExportDS Is Nothing Then
ExportDS = New DataSet
VariablesDT = New DataTable
With VariablesDT.Columns
.Add("Current_HOA_Name", GetType(String))
.Add("Current_HOA_ID", GetType(Integer))
.Add("ReportName", GetType(String))
.Add("ReportFontSize", GetType(Integer))
.Add("ReportStartDate", GetType(Date))
.Add("ReportEndDate", GetType(Date))
.Add("User_InternationalDate", GetType(Integer))
.Add("PaperSize", GetType(String))
.Add("PaperLandscape", GetType(Boolean))
.Add("Reports_IsSplitGL", GetType(Boolean))
.Add("Form_ID", GetType(Integer))
End With
With VariablesDT.Rows
.Add(Current_HOA_Name, Current_HOA_ID, ReportName, ReportFontSize, ReportStartDate, ReportEndDate, User_InternationalDate, PaperSize, PaperLandscape, False, Form_ID)
End With
VariablesDT.TableName = "VariablesDT"
ExportDS.Tables.Add(VariablesDT)
ResIncomeDT.TableName = "ResIncomeDT"
ExportDS.Tables.Add(ResIncomeDT)
ResIncNomDT.TableName = "ResIncNomDT"
ExportDS.Tables.Add(ResIncNomDT)
ResExpensesDT.TableName = "ResExpensesDT"
ExportDS.Tables.Add(ResExpensesDT)
ResExpNomDT.TableName = "ResExpNomDT"
ExportDS.Tables.Add(ResExpNomDT)
RevenueDT.TableName = "RevenueDT"
ExportDS.Tables.Add(RevenueDT)
ExpensesDT.TableName = "ExpensesDT"
ExportDS.Tables.Add(ExpensesDT)
RevenueNomDT.TableName = "RevenueNomDT"
ExportDS.Tables.Add(RevenueNomDT)
ExpensesNomDT.TableName = "ExpensesNomDT"
ExportDS.Tables.Add(ExpensesNomDT)
Else
ExportDS.Tables.Remove("ResIncomeDT")
ExportDS.Tables.Remove("ResIncNomDT")
ExportDS.Tables.Remove("ResExpensesDT")
ExportDS.Tables.Remove("ResExpNomDT")
ExportDS.Tables.Remove("RevenueDT")
ExportDS.Tables.Remove("ExpensesDT")
ExportDS.Tables.Remove("RevenueNomDT")
ExportDS.Tables.Remove("ExpensesNomDT")
ExportDS.Tables.Add(ResIncomeDT)
ExportDS.Tables.Add(ResIncNomDT)
ExportDS.Tables.Add(ResExpensesDT)
ExportDS.Tables.Add(ResExpNomDT)
ExportDS.Tables.Add(RevenueDT)
ExportDS.Tables.Add(ExpensesDT)
ExportDS.Tables.Add(RevenueNomDT)
ExportDS.Tables.Add(ExpensesNomDT)
ExportDS.Tables.Remove("VariablesDT")
For Each row As DataRow In VariablesDT.Rows
row("Current_HOA_Name") = Current_HOA_Name
row("current_HOA_ID") = Current_HOA_ID
row("ReportFontSize") = ReportFontSize
row("User_InternationalDate") = User_InternationalDate
row("PaperSize") = PaperSize
row("PaperLandscape") = PaperLandscape
row("Reports_IsSplitGL") = False
row("ReportStartDate") = ReportStartDate
row("ReportEndDate") = ReportEndDate
row("ReportName") = ReportName
row("Form_ID") = Form_ID
Next
ExportDS.Tables.Add(VariablesDT)
End If
Dim vImage As New LoadingImage
LoadingStarted("Uploading to xSoftware... Please wait...", vImage)
Await Task.Run(Sub()
Using vService As New Service5Client
vPDF = vService.ReturnProfitAndLossSheet(ExportDS)
End Using
End Sub)
LoadingCompleted("File uploaded to xSoftware...", "File was uploaded and PDF returned...", vImage)
Dim vFile As String = ByteToFilePath(vPDF)
If System.IO.File.Exists(vFile) Then
Dim P As New Process
With P
.StartInfo.FileName = vFile
.StartInfo.Verb = "Open"
.Start()
End With
Else
AppBoxError("The file path for the PDF is not valid!")
End If
End If
Catch ex As Exception
EmailError(ex)
End Try
End Sub
Throws an error at the server end if we remove and add the datatables back to the DataSet
Dim RevenueData() As DataRow = RevenueDT.Select("FormID = " & Form_ID, "Position")
Dim ExpenseData() As DataRow = ExpensesDT.Select("FormID = " & Form_ID, "Position")
Dim RevenueNomData() As DataRow = RevenueNomDT.Select("FormID = " & Form_ID, "Position")
Dim ExpenseNomData() As DataRow = ExpensesNomDT.Select("FormID = " & Form_ID, "Position")
It looks like the answer is
Remove the DataTables from the DataSet and add them again (which got us part of the way there)
Name the DataTables again!
ExportDS.Tables.Remove("ResIncomeDT")
ExportDS.Tables.Remove("ResIncNomDT")
ExportDS.Tables.Remove("ResExpensesDT")
ExportDS.Tables.Remove("ResExpNomDT")
ExportDS.Tables.Remove("RevenueDT")
ExportDS.Tables.Remove("ExpensesDT")
ExportDS.Tables.Remove("RevenueNomDT")
ExportDS.Tables.Remove("ExpensesNomDT")
ExportDS.Tables.Remove("VariablesDT")
VariablesDT.TableName = "VariablesDT"
ExportDS.Tables.Add(VariablesDT)
ResIncomeDT.TableName = "ResIncomeDT"
ExportDS.Tables.Add(ResIncomeDT)
ResIncNomDT.TableName = "ResIncNomDT"
ExportDS.Tables.Add(ResIncNomDT)
ResExpensesDT.TableName = "ResExpensesDT"
ExportDS.Tables.Add(ResExpensesDT)
ResExpNomDT.TableName = "ResExpNomDT"
ExportDS.Tables.Add(ResExpNomDT)
RevenueDT.TableName = "RevenueDT"
ExportDS.Tables.Add(RevenueDT)
ExpensesDT.TableName = "ExpensesDT"
ExportDS.Tables.Add(ExpensesDT)
RevenueNomDT.TableName = "RevenueNomDT"
ExportDS.Tables.Add(RevenueNomDT)
ExpensesNomDT.TableName = "ExpensesNomDT"
ExportDS.Tables.Add(ExpensesNomDT)
Now it appears to be working correctly :-)
Related
I have a document that is using tabs to fill a document. The document is signed before and after completion of a task. Is it possible to modify tabs on an envelope - then re-generate an DocuSign_eSign::RecipientViewRequest (still having the initial signature / fields)?
Thus far I've been able to generate two DocuSign_eSign::RecipientViewRequest, but cannot figure out how to change the tabs in between signing:
PRE_SIGNER = 'pre_signer'
POST_SIGNER = 'post_signer'
PRIVATE_KEY = CREDENTIALS['private_key']
PUBLIC_KEY = CREDENTIALS['public_key']
USER_ID = CREDENTIALS['user_id']
CLIENT_ID = CREDENTIALS['client_id']
ACCOUNT_ID = CREDENTIALS['account_id']
BASE_URL = CREDENTIALS['base_url']
configuration = DocuSign_eSign::Configuration.new
configuration.host = "#{BASE_URL}/restapi"
configuration.debugging = true
api_client = DocuSign_eSign::ApiClient.new(configuration)
api_client.base_path = BASE_URL
envelope_api = DocuSign_eSign::EnvelopesApi.new(api_client)
pre_signer_text = DocuSign_eSign::Text.new
pre_signer_text.value = 'Alpha'
pre_signer_text.tab_label = 'pre_value'
pre_signer = DocuSign_eSign::Signer.new
pre_signer.role_name = PRE_SIGNER
pre_signer.client_user_id = PRE_SIGNER
pre_signer.recipient_id = 1
pre_signer.name = 'Kevin Sylvestre'
pre_signer.email = 'kevin#fake.com'
pre_signer.tabs = DocuSign_eSign::Tabs.new
pre_signer.tabs.text_tabs = [pre_signer_text]
post_signer = DocuSign_eSign::Signer.new
post_signer.role_name = POST_SIGNER
post_signer.client_user_id = POST_SIGNER
post_signer.recipient_id = 2
post_signer.name = 'Kevin Sylvestre'
post_signer.email = 'kevin#fake.com'
post_signer.tabs = DocuSign_eSign::Tabs.new
post_signer.tabs.text_tabs = []
server_template = DocuSign_eSign::ServerTemplate.new
server_template.sequence = 0
server_template.template_id = TEMPLATE_ID
inline_template = DocuSign_eSign::InlineTemplate.new
inline_template.sequence = 0
inline_template.recipients = DocuSign_eSign::Recipients.new
inline_template.recipients.signers = [
pre_signer,
post_signer,
]
composite_template = DocuSign_eSign::CompositeTemplate.new
composite_template.server_templates = [server_template]
composite_template.inline_templates = [inline_template]
envelope_event = DocuSign_eSign::EnvelopeEvent.new
envelope_event.envelope_event_status_code = 'completed'
envelope_definition = DocuSign_eSign::EnvelopeDefinition.new
envelope_definition.status = 'sent'
envelope_definition.composite_templates = [composite_template]
api_client.request_jwt_user_token(CLIENT_ID, USER_ID, PRIVATE_KEY)
envelope = envelope_api.create_envelope(ACCOUNT_ID, envelope_definition)
pre_signer_recipient_view_request = DocuSign_eSign::RecipientViewRequest.new
pre_signer_recipient_view_request.authentication_method = 'none'
pre_signer_recipient_view_request.client_user_id = PRE_SIGNER
pre_signer_recipient_view_request.user_name = 'Kevin Sylvestre'
pre_signer_recipient_view_request.email = 'kevin#fake.com'
pre_signer_recipient_view_request.return_url = 'https://ksylvest.com'
pre_recipient_view = envelope_api.create_recipient_view(ACCOUNT_ID, envelope.envelope_id, pre_signer_recipient_view_request)
url = pre_recipient_view.url
`open #{url}`
puts "Continue?"
gets
# at this point I'd like to enter values for tabs...
post_signer_text = DocuSign_eSign::Text.new
post_signer_text.value = 'Omega'
post_signer_text.tab_label = 'post_value'
post_signer_recipient_view_request = DocuSign_eSign::RecipientViewRequest.new
post_signer_recipient_view_request.authentication_method = 'none'
post_signer_recipient_view_request.client_user_id = POST_SIGNER
post_signer_recipient_view_request.user_name = 'Kevin Sylvestre'
post_signer_recipient_view_request.email = 'kevin#fake.com'
post_signer_recipient_view_request.return_url = 'https://ksylvest.com'
post_recipient_view = envelope_api.create_recipient_view(ACCOUNT_ID, envelope.envelope_id, post_signer_recipient_view_request)
url = post_recipient_view.url
`open #{url}`
You could add the same person to sign twice, as two separate recipients that are the same person. You can generate different recipient views. You can set the routing order to be different. Only reason I didn't post this as an answer is that you may mean that you need to pause the envelope?
you can add tabs using your code where you have post_signer.tabs, but if you want to modify existing tabs that came from the template then you have to create the envelope in draft mode ("created") and then make a different API call to modify the tabs and then a final API call to send it. Another option is to pause the envelope and "correct" it.
Pause envelope workflow code examples
https://github.com/docusign/docusign-esign-ruby-client/blob/c477b07c2f578214fdf7d0c5a33355f01e9a0b4e/lib/docusign_esign/api/envelopes_api.rb#L6132 update_recipients() method should do the trick...
I'm trying to add records to an exisiting table called "Topics" (section as of "For Each SelectedTopic In SelectedTopicsCtl.ItemsSelected" in the code below).
When executing the code i always get "Run-time error '3022': The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. So it goes wrong at the creation of the Autonumber in the field "ID" (= the only field that is indexed - no duplicates).
When debugging, line "TopicRecord.Update" in the code below is highlighted.
I have read several posts on this topic on this forum and on other forums but still cannot get this to work - i must be overlooking something....
Private Sub Copy_Click()
Dim JournalEntrySourceRecord, JournalEntryDestinationRecord, TopicRecord As Recordset
Dim JournalEntryToCopyFromCtl, JournalEntryToCopyToCtl, JournalEntryDateCreatedCtl, SelectedTopicsCtl As Control
Dim Counter, intI As Integer
Dim SelectedTopic, varItm As Variant
Set JournalEntryToCopyFromCtl = Forms![Copy Journal Entry]!JournalEntryToCopyFrom
Set JournalEntryToCopyToCtl = Forms![Copy Journal Entry]!JournalEntryToCopyTo
Set JournalEntryDateCreatedCtl = Forms![Copy Journal Entry]!JournalEntryDateCreated
Set JournalEntrySourceRecord = CurrentDb.OpenRecordset("Select * from JournalEntries where ID=" & JournalEntryToCopyFromCtl.Value)
Set JournalEntryDestinationRecord = CurrentDb.OpenRecordset("Select * from JournalEntries where ID=" & JournalEntryToCopyToCtl.Value)
Set SelectedTopicsCtl = Forms![Copy Journal Entry]!TopicsToCopy
Set TopicRecord = CurrentDb.OpenRecordset("Topics", dbOpenDynaset, dbSeeChanges)
With JournalEntryDestinationRecord
.Edit
.Fields("InitiativeID") = JournalEntrySourceRecord.Fields("InitiativeID")
.Fields("DateCreated") = JournalEntryDateCreatedCtl.Value
.Fields("Comment") = JournalEntrySourceRecord.Fields("Comment")
.Fields("Active") = "True"
.Fields("InternalOnly") = JournalEntrySourceRecord.Fields("InternalOnly")
.Fields("Confidential") = JournalEntrySourceRecord.Fields("Confidential")
.Update
.Close
End With
JournalEntrySourceRecord.Close
Set JournalEntrySourceRecord = Nothing
Set JournalEntryDestinationRecord = Nothing
For Each SelectedTopic In SelectedTopicsCtl.ItemsSelected
TopicRecord.AddNew
For Counter = 3 To SelectedTopicsCtl.ColumnCount - 1
TopicRecord.Fields(Counter) = SelectedTopicsCtl.Column(Counter, SelectedTopic)
Next Counter
TopicRecord.Fields("JournalEntryID") = JournalEntryToCopyToCtl.Value
TopicRecord.Fields("DateCreated") = JournalEntryDateCreatedCtl.Value
TopicRecord.Update
Next SelectedTopic
TopicRecord.Close
Set TopicRecord = Nothing
End Sub
First, your Dims won't work as you expect. Use:
Dim JournalEntrySourceRecord As Recordset
Dim JournalEntryDestinationRecord As Recordset
Dim TopicRecord As Recordset
Second, it looks like you get your ID included here:
TopicRecord.Fields(Counter)
or Topic is a query that includes it somehow. Try to specify the fields specifically and/or debug like this:
For Counter = 3 To SelectedTopicsCtl.ColumnCount - 1
TopicRecord.Fields(Counter).Value = SelectedTopicsCtl.Column(Counter, SelectedTopic)
Debug.Print Counter, TopicRecord.Fields(Counter).Name
Next Counter
I have an application written in VB6.
This application contain a file with snippet containing a foreach loop. In this loop a method is adding controls to a section (section is a region in report).
I am trying to implement a functionality where:
when theheader is added in headerSection, tt will not add theHeader again, however this snippet is unable to do that. Where am I going wrong?
For Each thisColumn As Column In theColumns
If thisColumn.Type = Column.ColumnType.Description Then
AddDescriptionColumn(thisColumn, startColumnAt, headerTop)
End If
Private Sub AddDescriptionColumn(ByVal ColumnToAdd As Column, ByRef LeftPosition As Single, ByVal HeaderTop As Single)
'Get report sections
Dim headerSection As ActiveReports.Section = _theActiveReport.Sections(PageHeaderName)
'Add column header text
Dim theHeader As New ActiveReports.Label
theHeader.Name = "lblDescription"
theHeader.Text = ColumnToAdd.DisplayCaption
theHeader.Font = ColumnToAdd.HeaderFont
theHeader.Location = New PointF(LeftPosition, HeaderTop)
theHeader.Size = New SizeF(columnWidth, _columnHeaderHeight)
If TextHeight(ColumnToAdd.DisplayCaption, theHeader.Font, columnWidth) > _columnHeaderHeight Then
theHeader.VerticalAlignment = ActiveReports.VerticalTextAlignment.Top
Else
theHeader.VerticalAlignment = ActiveReports.VerticalTextAlignment.Bottom
End If
theHeader.BackColor = Color.Transparent
theHeader.MultiLine = True
theHeader.WordWrap = True
theHeader.Visible = True
headerSection.Controls.Add(theHeader)
I'm very new (1 week) to visual basic and basically I'm trying to automate some repetitive work, now to the point , within a number of files produced with varying data I need to format the selected range as a table (medium 9) but i'm in a block at the moment and need some help and would really appreciate it, here is what i have so far>>>>
Option Explicit
Dim strDate, strRepDate, strPath, strPathRaw , strDate2
dim dteTemp, dteDay, dteMth, dteYear, newDate, myDate
myDate = Date()
dteTemp = DateAdd("D", -1, myDate)
dteDay = DatePart("D", dteTemp)
dteMth = DatePart("M", dteTemp)
dteYear = DatePart("YYYY", dteTemp)
If (Len(dteDay) = 1) Then dteDay = "0" & dteDay
If (Len(dteMth) = 1) Then dteMth = "0" & dteMth
strDate = dteYear&"-"&dteMth&"-"&dteDay
strDate2 = dteYear&""&dteMth&""&dteDay
Dim objXLApp, objXLWb, objXLWs
Set objXLApp = CreateObject("Excel.Application")
Set objXLWb = objXLApp.Workbooks.Open("C:\Users\CuRrY\Desktop\"&strDate2&"\Agent Daily Disposition "&strDate2&".xls")
objXLApp.Application.Visible = True
'start excell
Set objXLWs = objXLWb.Sheets(1)
'objXLWs.Cells(Row, Column ).Value
With objXLWs
objXLWs.Cells(3, 1).Value = "Agent Name"
'objXLWs.Range("A3").Select
objXLWs.Range("A3").CurrentRegion.Select
'End With
as you can see i reached as far as CurrentRegion.Select but how to format selected cells into (medium 9) i've tried so much and failed
Thanks for any help
You can configure the CurrentRegion(which represents a Range object) through the SpecialCells Submethod. Although your conditions are specific to your xls sheet, you will still have to follow the formatting available through the specialcells() method properties. Also, by utilizing the currentregion property, the page assumes you have a xls header. So it is important to verify your table structure before trying to incorporate this property.
For instance:
Sub FillIn()
Range("A1").CurrentRegion.SpecialCells(xlCellTypeBlanks).FormulaR1C1 _
= "=R[-1]C"
Range("A1").CurrentRegion.Value = Range("A1").CurrentRegion.Value
End Sub
View the available properties that can be applied to CurrentRegion -> Here
And the MSDN Article -> Here
I'm trying to get a record and store it for later use if an error occurs on the page.
This code is used on Create/Edit. So I'm getting values from a View Model and mapping to the db entity:
Dim objExistingSupplier As SUPPLIER = db.SUPPLIER.Single(Function(e) e.SUPPLIER_ID = Supplier.SUPPLIER_ID)
objPermStaffAction = objExistingSupplier
objSupplier = Mapper.Map(Of SupplierViewModel, SUPPLIER)(Supplier, objExistingSupplier)
From what I understand, the .Single should force evaluation. However, after the mapping occurs properties are lost/changed in the objPermStaffAction object. Can someone explain what I'm doing wrong?
Here is the whole function:
Private Function SaveSupplier(Supplier As SupplierViewModel) As ActionResult
Dim objSupplier, objPermStaffAction As SUPPLIER
If Supplier.SUPPLIER_ID = 0 Then
objSupplier = Mapper.Map(Of SupplierViewModel, SUPPLIER)(Supplier)
Else
Dim objExistingSupplier As SUPPLIER = db.SUPPLIER.Single(Function(e) e.SUPPLIER_ID = Supplier.SUPPLIER_ID)
objPermStaffAction = objExistingSupplier
objSupplier = Mapper.Map(Of SupplierViewModel, SUPPLIER)(Supplier, objExistingSupplier)
End If
If ModelState.IsValid Then
If Supplier.SUPPLIER_ID = 0 Then
objSupplier.CREATED_BY = Session("AppUserID")
db.SUPPLIER.Add(objSupplier)
Else
objSupplier.UPDATED_BY = Session("AppUserID")
UpdateModel(objSupplier)
End If
Try
db.SaveChanges()
Return RedirectToAction("Index")
Catch ex As Exception
If InStr(ex.InnerException.InnerException.Message, "PRSNL.SUPPLIER_UK") > 0 Then
ModelState.AddModelError("SUPPLIER_CODE", "Supplier Code already exists. Please choose another.")
End If
End Try
End If
'This will run if an error occured
If Supplier.SUPPLIER_ID > 0 Then
Supplier = Mapper.Map(Of SupplierViewModel)(objPermStaffAction)
End If
ViewBag.YNList = Common.GetYNList
Return View(Supplier)
End Function
SupplierViewModel is reference type. So objPermStaffAction refer to the same object which is getting updated after mapping.
Why do you need original (not mapped) object?