UFT : How to identify a webEdit in a dynamic webtable - hp-uft

I have a dynamic webtable on a page in which i have to set values one by one. There is button to add webedit to that table.When i click on that button a webedit is get added, then i have to set a value in that. Same process i have to repeat for different values.
All the webedits have same properties only the name is different like
"name:=\$ABC_1\$ABCList\$l1\$ABCName" "name:=\$ABC_1\$ABCList\$l2\$ABCName"
"name:=\$ABC_1\$ABCList\$l3\$ABCName" . . .
"name:=\$ABC_1\$ABCList\$l200\$ABCName"
I am not able to identify the newly added webedit.

If there is a consistency in the name property you can identify the object using that. For example if it contains a counter you can do something like.
counter = 1
Browser("B").Page("P").WebButton("B").Click
Browser("B").Page("P").WebEdit("name:=\$ABC_1\$ABCList\$l" & counter & "\$ABCName").Set theValue
counter = counter + 1 ' repeat
The next best option is if the new WebEdit is the added after the previous values, in this case you can use the index property
counter = 1
Browser("B").Page("P").WebButton("B").Click
Browser("B").Page("P").WebEdit("name:=\$ABC_1\$ABCList\$l.*", "index:=" & counter).Set theValue
counter = counter + 1 ' repeat
Worst case (the name isn't consistent and nor is its index), you can store the names existing WebEdits and see what is new.
Set seenEdits = CreateObject("Scripting.Dictionary")
Function GetNewEdit()
Set desc = Description.Create()
desc("name").Value = "\$ABC_1\$ABCList\$l.*"
Set edits = Browser("B").Page("P").ChildObjects(desc)
For i = 0 to edits.Count() - 1
name = edits(i).GetROProperty("name")
If Not seenEdits.Exists(name) Then
seenEdits.Add name, True
Set GetNewEdit edits(i)
Exit Function
End If
Next
End Function
Browser("B").Page("P").WebButton("B").Click
GetNewEdit().Set theValue
Warning: All code not tested.

Related

Looping error, too many records added

Ive been trying to write Access VBA code to automate the addition of replicates for germination tests.
Basically I have a form where I enter the total number of Reps (NoofReps) and the number of seeds per rep (RepSize) (e.g. 50 seeds). For each record added I want it to automatically add a record for each rep and automatically calc the Rep Number (i.e if i have 4 reps then it should add 4 records, numbered 1-4 reps) as well as the RepSize (e.g 50).
I have been trying out various loops based on information from this forum and other but am still getting errors with the number of records that it generates. I have tried both the "Do while" and "Do Until" but get the same result below either way.
Could someone please let me know where I am going wrong?...If i want 2 reps then it adds 2, If i want 3 then its 246, and if i want 4 it adds >30,000!!!
For the purposes of trying to fix the code I have started to type the number of reps manually into the code in the iNoofReps so that I know the error is in the code and not from the form.
Private Sub CmdAddReps3_Click()
Dim iRepNo As Integer ' stores the current value in the series
'Open the table
Set db = CurrentDb()
Set rstGReps = db.OpenRecordset("tblGReplicates")
' Initialise the variables
iRepNo = 1
iNoofReps = 3 'iNoofReps = Me.txtNoofReps
' Add the records using a loop
rstGReps.movefirst
Do 'Until rstGReps("RepNo") = (iNoofReps + 1) ' always want to include at least 1 repNo
rstGReps.AddNew
rstGReps("GTestID") = Me.GTestID
rstGReps("RepNo") = iRepNo
rstGReps("NoofSeed") = Me.txtNoOfSeeds
' Calculate the next RepNo value in the loop
iRepNo = iRepNo + 1
rstGReps.Update
rstGReps.moveNext
Loop Until rstGReps("RepNo") = (iNoofReps) + 1 ' so that the loop includes the final repNo.
MsgBox "Finished Looping"
rstGReps.Close
Set rstGReps = Nothing
Set db = Nothing
End Sub
Any help would be appreciated!!!
Well, you're moving next here: rstGReps.moveNext, and then you're comparing rstGReps("RepNo") = (iNoofReps) + 1 after moving next, thus being on an empty record, thus always equating to false.
Loop Until iRepNo = (iNoofReps) + 1 should fix it, then you're no longer referring to the recordset, which has already been set to the next record by the time you're referring to it.
You could also fix it by just eliminating this line:
rstGReps.moveNext
Since rstGReps.AddNew already moves the recordset to a new blank record, moving it forward after adding the record doesn't make much sense. If you remove it, you might want to remove the + 1 in Loop Until rstGReps("RepNo") = (iNoofReps) + 1

Setting a variable in AppleScript based on a list in a Numbers sheet

AppleScript beginner here. Searching high and low hasn't led me to the answer yet.
I'm using AppleScript to help run youth wrestling tournaments. Each division (based on age) is broken down into weight classes. For example: Novice 80 or Cadet 105.
Once a certain group of kids is put into a certain division/weight class, those kids get added to a new sheet that contains their bracket (think March Madness bracket but a small number of kids wrestling instead of playing basketball).
I've figured out how to get a group into a new sheet where they populate the bracket, but when this new sheet is created, I don't know how to make AppleScript change the name of the sheet to the correct division/weight class. I'm sure it has something to do with creating variables based on a list of the divisions/weight classes (that I have), but I can't figure out how to do it. Here's the relevant portion of the code:
tell document 1
set active sheet to the last sheet
set thisSheet to make new sheet
set the name of thisSheet to "[Division variable – Weight class variable]"
tell thisSheet
delete every table
end tell
Any ideas on how to make AppleScript name the sheet like I want?
To give you a small example that you're able to visualize what you're going after, heres a small snippet. I think its self explanatory, iterate through a list of titles, then apply the names to the sheets.
set divisionNames to {"Novice", "Cadet"} -- How You Grab These Values Matters
set weightClasses to {"80", "105"} -- These Values Too
tell application "Numbers"
activate
set thisDocument to make new document
tell thisDocument
repeat with i from 1 to count of divisionNames
make new sheet with properties {name:item i of divisionNames & space & item i of weightClasses}
end repeat
end tell
end tell
Alternately, if you're pulling the values from a list as a whole then you could
set sheetTitles to {"Novice 80", "Cadet 105"}
tell application "Numbers"
activate
set thisDocument to make new document
tell thisDocument
repeat with division in sheetTitles
make new sheet with properties {name:division}
end repeat
end tell
end tell
EDIT: In the spirit of helping a low to no budget school/organization.. here's another example answering the second question issued in comments. Again without knowing the structure of your data its hard to give you an exact answer on your specific case. Additionally, here's a link to a site they may help further the advancement on your project. https://iworkautomation.com/numbers/index.html
(*
set sampleKids to {"John Doe", "Jane Doe", "Johnny Foe", "Janie Foe", "Tommy Joe", "Tammy Joe"}
set sampleDivisions to {"Novice-80", "Novice-85", "Cadet-105", "Cadet-110", "Novice-80", "Cadet-105"}
tell application "Numbers"
activate
set thisDoc to make new document with properties {name:"Wrestling Sample"}
tell thisDoc
set the name of sheet 1 to "Sign In Sheet"
tell active sheet
delete every table
set newTable to make new table with properties {row count:(count of sampleKids) + 1, column count:2, name:"Sign In Sheet"}
tell newTable
set value of cell 1 of column "A" to "Name"
set value of cell 1 of column "B" to "Division"
set x to 2
repeat with eachName in sampleKids
set value of cell x of column "A" to eachName
set x to (x + 1)
end repeat
set x to 2
repeat with eachDivision in sampleDivisions
set value of cell x of column "B" to eachDivision
set x to (x + 1)
end repeat
end tell
end tell
end tell
end tell
*)
--********** IGNORE ABOVE THIS LINE IT'S ONLY BUILDING A SAMPLE TABLE **********--
--********** SAVE ABOVE TO ANOTHER SCRIPT FOR TESTING WITH NEW TABLE **********--
(*
ERROR HANDLING ISN'T PRESENT - AN EMPTY CELL IN FIRST COLUMN OR CHOSEN COLUMN WILL THROW AN
ERROR SINCE THEY ARE THE IMPORTANT PIECES OF DATA FOR GRABBING LISTS - SAVE SCRIPT
TO NUMBERS SCRIPT FOLDER OF YOUR CHOICE - ENTER ALL INFO ON FIRST TABLE OF FIRST SHEET OF
DOCUMENT THEN RUN SCRIPT - SCRIPT ACCEPTS ANY AMOUNT OF ROWS OR COLUMNS
*)
tell application "Numbers"
activate
-- Display A Simple Reminder That You're About To Lose Some Existing Data
display dialog "This Script Will Delete All Sheets Except The First Sheet Of This Document Before It Proceeds To Make New Sheets & Tables Based On The First Table Of The First Sheet." buttons {"Cancel", "Start"} default button 2 with icon 1
tell document 1
-- Get A List of the Sheet Names
set sheetNames to name of sheets
-- Start With A Fresh Slate, No Old Sheets
delete (every sheet whose name is not item 1 of sheetNames)
tell sheet 1
-- Grab and Set Future Header Values
set columnHeaders to value of cell of row 1 in table 1
-- Display A List Of Possible Choices To Create New Sheets With From The List We Make Above
set chosenColumn to choose from list columnHeaders with prompt "Which Column Do You Want To Use For New Sheets?" default items item 1 of columnHeaders
set chosenColumn to chosenColumn as text
tell table 1
-- Remove All Empty Rows to Help Prevent Error In Script
set {row_count, col_count} to {count rows, count columns}
set blank_row to {}
repeat with x from 1 to col_count
set blank_row to blank_row & missing value
end repeat
set x to 1
-- Delete Empty Rows In Reverse, It's Logical
repeat with y from row_count to 1 by -1
set row_values to value of cells of row y
if row_values = blank_row then delete row y
end repeat
-- Grab A List of All Divisions for Future Use Depending on Choice From Prompt, excluding the First Row Which Is A Header. If You Selected The First Column, We Have to Handle That Differently
if chosenColumn is item 1 of columnHeaders then
set theDivisions to the value of every cell of column "A" whose value is not chosenColumn
else
set theDivisions to the value of every cell of column named chosenColumn whose value is not chosenColumn
end if
end tell
end tell
-- Start the New "Sheet Making" Loop
repeat with division in theDivisions
-- Make An Empty Blank List At the Start of Every Loop
set matchingDivisions to {}
tell table 1 of sheet 1
-- Get All Rows Matching the Current Division of the Loop We Are On, to Make New Tables With Later
repeat with x from 1 to count of cells
if the value of cell x is division then
-- Put All Data About the Rows We Gathered Above Into the Empty List We Made
set the end of matchingDivisions to value of cells of row of cell x
end if
end repeat
-- Reset x, Because I'm Not Creative and Want to Use It Later
set x to 1
end tell
-- If The Sheet Of the Division We Are On, of the Loop, Doesn't Exist, Make It
if not (exists sheet division) then
make new sheet with properties {name:division}
tell sheet division
-- Start With A Fresh Slate On This New Sheet
delete every table
-- Make the Table With All Relevant Parameters
set currentDivisionTable to make new table with properties ¬
{row count:((count of matchingDivisions) + 1), column count:count of item 1 of matchingDivisions, name:division}
tell currentDivisionTable
set x to 1
-- Set The Header Values from A List We Created Earlier
repeat with theHeader in columnHeaders
set the value of cell x to theHeader
set x to (x + 1)
end repeat
-- Reset x Again, I'm Lazy
set x to 1
-- Set Starting Point to Start Filling The Table, Compensate For Our Headers
set rowIndex to 1
set columnIndex to 0
-- Start Filling The Table With Data, Which Comes From The List Earlier
repeat with x from 1 to count of the matchingDivisions
set rowData to item x of the matchingDivisions
tell row (rowIndex + x)
repeat with i from 1 to the count of rowData
tell cell (columnIndex + i)
set value to item i of rowData
end tell
end repeat
end tell
end repeat
end tell
end tell
end if
end repeat
-- Return To the First Sheet
set the active sheet to the first sheet
-- Display Notification That The Tables Are Done Being Made -- OPTIONAL
display notification "Processing is complete." with title "Numbers Table Converter" subtitle "All Tables Have Been Made." sound name "Hero"
end tell
end tell
Try
set thisSheet to make new sheet with properties {name:"yourname"}
Edit
Some explanation: if your struggling on how to adress third party apps try to load it's library and look up the methods you need. In applescript editor you will find it in the (I guess) menu. Then select the desired app to get the library
The full code modify at below:
set {begCol, endCol} to {2, 17}
set tgtCol to 1
tell application "Numbers"
tell front sheet of front document
tell active sheet
set getVal to rows's cells's value
set myOriginalTable to front table
set itemCode to {"CardNo", "SAL-DAY", "OT15-Money",
"OT2-Money", "OT3-Money", "OTHINC", "P0007", "DILIG", "P0004", "P0003",
"SEV_SPE", "P0011", "SI-SSF", "TI-TAXITEM", "P0022", "P0021", "P0025"} --
change to variable
set Amount to {"CardNo", "SAL-DAY", "OT15-Money",
"OT2-Money", "OT3-Money", "OTHINC", "P0007", "DILIG", "P0004", "P0003",
"SEV_SPE", "P0011", "SI-SSF", "TI-TAXITEM", "P0022", "P0021", "P0025"} --
change to variable
set setCols to 8
end tell
set myNewTable to make new table with properties ¬
{column count:setCols, row count:(count of itemCode) + 1,
header column count:0}
tell myNewTable
set value of cell 1 of column "A" to "cardNo"
set value of cell 1 of column "B" to "emCode"
set value of cell 1 of column "C" to "emName"
set value of cell 1 of column "D" to "itemCode"
set value of cell 1 of column "E" to "itemName"
set value of cell 1 of column "F" to "effDate"
set value of cell 1 of column "G" to "amt"
set value of cell 1 of column "H" to "remark"
set x to 2
repeat with eachAmount in Amount
set value of cell x of column "G" to eachAmount
set x to (x + 1)
end repeat
set x to 2
repeat with eachItemCode in itemCode
set value of cell x of column "D" to eachItemCode
set x to (x + 1)
end repeat
end tell
end tell
end tell
Thank you
According source code above. I found other way for use range select for determine data. But it still incorrect because the code pickup all data to one cell like this.
result after ran script
Could some one able to suggest me?
try
tell application "Numbers" to tell front document to tell active sheet
set delimiter to ","
set selected_table to first table whose class of selection range is range
tell selected_table
set my_selection to the selection range
set begCol to address of first column of my_selection
set endCol to address of last column of my_selection
set begRow to address of first row of my_selection
set endRow to address of last row of my_selection
set getVal to ""
repeat with j from begRow to endRow
repeat with i from begCol to endCol
set getVal to (getVal & (value of cell j of column i of selected_table) as text) & delimiter
set getVal to getVal & return
end repeat
end repeat
end tell
end tell
set AmountVal to {getVal}
tell application "Numbers"
activate
tell front sheet of front document
set myOriginalTable to front table
set setCols to 8
set myNewTable to make new table with properties ¬
{row count:(count of AmountVal) + 1, column count:setCols, header column count:0}
tell myNewTable
set value of cell 1 of column "A" to "cardNo"
set value of cell 1 of column "B" to "emCode"
set value of cell 1 of column "C" to "emName"
set value of cell 1 of column "D" to "itemCode"
set value of cell 1 of column "E" to "itemName"
set value of cell 1 of column "F" to "effDate"
set value of cell 1 of column "G" to "amt"
set value of cell 1 of column "H" to "remark"
set x to 2
repeat with eachAmount in AmountVal
set value of cell x of column "G" to eachAmount
set x to (x + 1)
end repeat
end tell
end tell
end tell
display notification "Already Done!" with title "Numbers"
on error
display dialog "Select a range first and then try again"
end try

Search WebList for particular item count from Excel sheet

I need a help in VBScript or either in QTP for the below case.
For example:
I have nearly 40 items in the weblist. I have only one item in the Excel sheet that is one among the 40 in the weblist. If I run the script, the one in the Excel should be select in the weblist. How do I perform this? I tried many scenarios, but couldn't get it to work.
Below are some of the sample pieces of code I tried in QTP:
ocount=Browser("name:=brw").Page("title:=brw").WebList("htmlid:=tabContainerBrandSite_123&rtyoh").GetROProperty("items count")
msgbox ocount
var7=mySheet2.Cells(2,"C")
For k=2 to ocount
ocount2=Browser("name:=brw").Page("title:=brw").WebList("html id:=tabContainerBrandSite_123&rtyoh").GetItem(k)
msgbox ocount2
merchantName = DataTable("Merchant_Name","Global") 'an example if value is saved in global sheet
items_count = Browser("Sarit").Page("Sarit_2").WebList("txtVendorCode").GetROProperty("Items Count") 'This will get all the items from your weblist.
i = 1
Do
webListName = Browser("Sarit").Page("Sarit_2").WebList("txtVendorCode").GetItem(i)
'this will get first value from the web list
If merchantName = webListName Then 'comparing first value from your value from global sheet
Browser("Sarit").Page("Sarit_2").WebList("txtVendorCode").Select(i) 'selects that value
Exit do 'because it has found your only value from the local sheet, it exits
else
i = i + 1
End If
Loop While i <= items_count

Copy all sheet contents from one excel and paste in one sheet of other excel using VBscript

Sub Prats
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objRawData = objExcel.Workbooks.Open("C:\A.xlsx") 'Copy From File
Set objPasteData= objExcel.Workbooks.Open("C:\B.xlsx") 'Paste To File
Set obj1 = objPasteData.WorkSheets("Sheet1") 'Worksheet to be cleared
obj1.Cells.Clear
countSheet = objRawData.Sheets.Count
log.Message("Prats " &countsheet)
For i = 1 to countSheet
objRawData.Activate
name = objRawData.Sheets(i).Name
objRawData.WorkSheets(name).Select
objRawData.Worksheets(name).Range("A1").Select
objExcel.ActiveSheet.UsedRange.Select
usedRowCount2 = objExcel.Selection.Rows.Count
objExcel.Range("A1:B" & usedRowCount2).Copy
objPasteData.Activate
objPasteData.WorkSheets("Sheet1").Select
objExcel.ActiveSheet.UsedRange.Select
usedRowCount1= objExcel.Selection.Rows.Count
objExcel.ActiveSheet.UsedRange.Select
objExcel.Range("A" & usedRowCount1).Select
objPasteData.Worksheets("Sheet1").Range("A" &(usedRowCount1+1)).PasteSpecial Paste =xlValues
Next
objPasteData.Save
End sub
This is the code that I am using.
The problem is it over rides the last row of the first sheet with the first row from the second sheet.
I already told the person you copied the code from that he should use the Cells property instead of working with ranges. However, if you absolutely must use ranges, at least refrain from activating and selecting all the time. The following lines should suffice for copying:
For i = 1 To countSheet
usedRowCount2 = objRawData.Sheets(i).UsedRange.Rows.Count
If i = 1 Then
usedRowCount1 = 0
Else
usedRowCount1 = objPasteData.Sheets(1).UsedRange.Rows.Count
End If
objRawData.Sheets(i).Range("A1:B" & usedRowCount2).Copy
objPasteData.Sheets(1).Range("A" & (usedRowCount1+1)).PasteSpecial -4163
Next
Edit: The UsedRange row count is at least 1, so usedRowCount1+1 produces an empty first row when copying the data from the first sheet. This row remains unused (i.e. it's not included in UsedRange), so the used row count is one less than the number of the last used row. Because of this you have to distinguish between the first sheet and all other sheets.

LotusScript - Setting element in for loop

I have an array set up
Dim managerList(1 To 50, 1 To 100) As String
what I am trying to do, is set the first, second, and third elements in the row
managerList(index,1) = tempManagerName
managerList(index,2) = tempIdeaNumber
managerList(index,3) = 1
But get an error when I try to do that saying that the object variable is not set. I maintain index as an integer, and the value corresponds to a single manager, but I can't seem to manually set the third element. The first and second elements set correctly.
On the flip side, I have the following code that will allow for the element to be set,
For x=1 To 50
If StrConv(tempManagerName,3) = managerList(x,1) Then
found = x
For y=3 to 100
If managerList(x,y) = "" Then
managerList(x,y) = tempIdeaNumber
Exit for
End If
Next
Exit For
End If
Next
It spins through the array (laterally) trying to find an empty element. Ideally I would like to set the index of the element the y variable is on into the 3rd element in the row, to keep a count of how many ideas are on the row.
What is the best way to keep a count like this? Any idea why I am getting a Object variable not set error when I try to manually set the element?
object variable not set means that you are trying to call methods or access properties on an un-initialized object. I don't see anything like that in the code snippets you have published, are you sure the error occurs in those lines?
A good way to pin-point errors is to include the module and line number in the error message. Add this around your subroutine to get a more detailed message:
Sub Initialize
On Error Goto errorthrower
//
// your code goes here...
//
Exit sub
ErrorThrower:
Error Err, Str$(Err) & " " & Error & Chr(13) + "Module: " & Cstr( Getthreadinfo(1) ) & ", Line: " & Cstr( Erl )
End sub
(I originally found this on Ferdy Christants blog)
It's not quite clear what problem you are trying to resolve here, but it looks like you have 1..50 "managers" that can have 1..100 "ideas" ? I'd make a class for managers instead:
Class manager
Private managername As String
Private ideas(1 To 100) As String
Sub new(managername As String)
Me.managername=managername
End Sub
// whatever methods you need....
End Class
Then, I'd keep track of them with a list of these objects:
Dim managerlist List As manager
Dim key As String
key = Strconv(tempmanagername,3)
if not iselement(managerlist(key)) then
set managerlist(key) = new manager(key)
end if
Dim currentmanager As manager
Set currentmanager = managerlist(key)
This is only an example to get you started, you will have to adapt this to solve your actual problem.

Resources