1. Sang Hee Cho
  2. PowerBuilder
  3. Tuesday, 7 September 2021 23:42 PM UTC

Hi All,

My program is generating reports in excel format which contains 8 sheets. It is batch program to pick up the request from the queue, generate the reports, and send them to the user. And 4 sessions are running at the same time to process the report as many as possible as fast as possible.

 

A few days ago, I found that if "something" is copied in clipboard outside of the program while below program is running between "copy" and "paste", then that "something" is pasted into the final output file instead of the sheet copied in the program, which is not correct. (It means while "A" session is generating a report, other sheet generated by session("B") is pasted into the excel generated by session "A")

I could re-generate the error by copying other sheet manually while debugging after copy and before paste. 

Is there any way to avoid it? Using a shared clipboard at the same time is the problem here. but I can't find solution.

Please advise. Thank you in advance.

============================================================================

// Combine the reports and create final Report
oleobject lole_excel
oleobject lole_MainWorkBook, lole_TempWorkBook
oleobject lole_sheet
Integer li_worksheet_cnt
Long ll_rtn

lole_excel = create oleobject
lole_MainWorkBook = create oleobject
lole_TempWorkBook = create oleobject
lole_sheet = create oleobject

ll_rtn = lole_excel.ConnectToNewObject("excel.application")
If ll_rtn <> 0 Then
wf_write_error_msg(is_reportid, 'Error in running MicroSoft Excel API - SPR ALL')
Destroy lole_excel
Return -1
End If

// Add Sheets
lole_MainWorkBook = lole_excel.WorkBooks.Add()
li_worksheet_cnt = lole_MainWorkBook.WorkSheets.count

Do While li_worksheet_cnt < 8
lole_MainWorkBook.WorkSheets.Add
li_worksheet_cnt = lole_MainWorkBook.WorkSheets.count
Loop

String ls_tabname[8] = {"LCL", "FCL", "FAK", "T-FCL", "T-FAK_T-LCL", "T-FAK", "T-LCL", "FAK and LCL"}
Integer li_n

// Combine Sheets into one excel file (Using ole object)

FOR li_n = 1 TO 8

lole_TempWorkBook = lole_excel.WorkBooks.Open(is_currDirectory+as_filename_tab[li_n])

lole_TempWorkBook.WorkSheets(1).Cells.Select

lole_excel.CutCopyMode = False

lole_TempWorkBook.WorkSheets(1).Cells.Copy <=========================

lole_MainWorkBook.Activate

lole_sheet = lole_MainWorkBook.WorkSheets(li_n)

lole_sheet.Name = ls_tabname[li_n]

lole_sheet.Paste <============================================

//lole_sheet.Cells.EntireColumn.AutoFit

lole_excel.CutCopyMode = False

lole_TempWorkBook.Close(False)

NEXT

.......

 

 

John Fauss Accepted Answer Pending Moderation
  1. Wednesday, 8 September 2021 04:25 AM UTC
  2. PowerBuilder
  3. # 1

Hi, Sang -

As you've probably discovered by now, the basic premise of your design for this task is flawed, since there is but one Clipboard provided by the Windows operating system per login. If multiple instances of this application are indeed running under one login as it sounds like from your description, the chance that one instance/session will replace the contents of the Clipboard before it can be pasted by another instance will always exist.

One solution would be to run each "session" in a separate login, but that may not be feasible in your case.

Another alternative to consider is you might be able to utilize a Windows Mutex to ensure that only one of your "sessions" is able to execute the five lines of code you have highlighted in your post as a logical unit of work... at least, that's what I would investigate if I were experiencing this issue.

Here is a link to some explanation on using Windows Mutex objects:

https://docs.microsoft.com/en-us/windows/win32/sync/using-mutex-objects

Roland Smith has a free code example of using Mutex from a PowerBuilder application at his TopWizProgramming web site:

https://www.topwizprogramming.com/freecode_mutex.html

His example prevents multiple instances of an application from being run simultaneously by one user - Not your exact situation, but you'll be able to see how the Windows API external function declaration(s) are coded and called from PB.

Best regards, John

Comment
There are no comments made yet.
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.