asakust Posted May 22, 2015 Posted May 22, 2015 (edited) Having some issues here... I'm trying to pull two numbers from a .tab text file, and one from an internal control inside another program. The only field I can access is the static text control that the program, and when I'm trying to subtract the two to double-check my numbers, I'm getting extra decimals added in. I'm not sure where they're coming from.I've tried using Round() to drop it down to 2 places, in the current iteration I'm trying to use StringFormat to cut it down to 2 places, but every time I try it out, an extra 0.000000001 or so is added to the $vDifference variable. Here's my code (it's sloppy, forgive me - first attempt at GUIs as well). UPDATE: Solved. Melba is a genius, and I have no idea how to syntax. expandcollapse popup#include <File.au3> #include <FileConstants.au3> #include <Array.au3> #include <MsgBoxConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> ;~ Declare Variables Global $vSourcePlanName Global $vSourceRxNum Global $vSourceRxPaid Global $vIsolatedRxDate Global $vIsolatedRxNum Global $vIsolatedRxPaid Global $vRunningTotal Global $aTextArray Global $vSourceArrayLine Global $aPlanArray Global $vPlanName Global $vPlan Global $vNocTotal Global $vTabFile = "C:\Users\Owner\Downloads\EPIC_PaymentReport.tab" Global $vPioneerClass = "0.2804c64" Global $pButton = "[CLASS:WindowsForms10.BUTTON.app." Global $pEdit = "[CLASS:WindowsForms10.EDIT.app." ;~ Create array from payment .tab file Func CreatePaymentArray() _FileReadToArray ($vTabFile, $aTextArray, Default, @TAB) ;~ Create Result Array to be filled with data Global $aResultArray[0][4] ;~ Check if $aTextArray is valid and pull variables from it If IsArray($aTextArray) Then $iMax = UBound($aTextArray) For $i = 0 to $iMax -1; ;~ Save Plan Name to Variable $vSourcePlanName = $aTextArray[$i][1] ;~ Save Rx Date to Variable $vSourceRxDate = $aTextArray[$i][2] Local $vSourceRxDateYear = StringRight($vSourceRxDate,4) $vSourceRxDate = StringReplace($vSourceRxDate,"/","") $vSourceRxDate = $vSourceRxDateYear & StringTrimRight($vSourceRxDate,4) ;~ Save Rx Number to Variable, Strip White Space, and - if no text - change to Number $vSourceRxNum = $aTextArray[$i][3] $vSourceRxNum = StringStripWS($vSourceRxNum, $STR_STRIPALL) If StringIsDigit($vSourceRxNum) Then $vSourceRxNum = Number($vSourceRxNum) EndIf ;~ Save Rx Paid Amount to Variable and change to Number $vSourceRxPaid = $aTextArray[$i][5] $vSourceRxPaid = StringStripWS($vSourceRxPaid, $STR_STRIPALL) If StringIsDigit($vSourceRxPaid) Then $vSourceRxPaid = Number($vSourceRxPaid) EndIf ;~ Add Payment Data to $aResultArray $vSourceArrayLine = $vSourcePlanName & "|" & $vSourceRxDate & "|" & $vSourceRxNum & "|" & $vSourceRxPaid _ArrayAdd($aResultArray, $vSourceArrayLine) Next ;~ _ArrayDisplay($aResultArray, "Result Array", Default, 8) EndIf ;~ Create $aPlanArray - an Array of Plan Names $aPlanArray = _ArrayUnique($aResultArray) ;~ _ArrayDisplay($aPlanArray) Global $iPlanMax = UBound($aPlanArray) EndFunc ;~ Create GUI Func CreateWindow() Local $hGUI = GUICreate("Apply Payments", 285, 250, 550, 300, -1) Local $idComboBox = GUICtrlCreateCombo("Choose Insurance Plan",10,10,230) Local $vPaymentDateLabel = GUICtrlCreateLabel("Payment Date:",10,152) Local $vPaymentDateInput = GUICtrlCreateInput("mm/dd/yyyy",85,149,75) Local $vEpicDateLabel = GUICtrlCreateLabel("EPIC Date:",10,175) Local $vEpicDateInput = GUICtrlCreateInput("mm/dd/yyyy",85,171,75) Local $idOkButton = GUICtrlCreateButton("OK",250,8,25,25) Local $idOpenButton = GUICtrlCreateButton("Open...",10,215,50) Local $idContinueButton = GUICtrlCreateButton("Continue",120,215,75) GUICtrlSetState($idContinueButton,$GUI_DISABLE) Local $idCancelButton = GUICtrlCreateButton("Cancel",200,215,75) Local $vPlanLabel = GUICtrlCreateLabel("Insurance Plan Selected: ", 10, 40) Local $vPlanSelect = GUICtrlCreateLabel("None", 135, 40, 120) Local $vNocLabel = GUICtrlCreateLabel("Number of Claims: ", 10, 60) Local $vNoc = GUICtrlCreateLabel(0,100,60,20) Local $vTotalPayLabel = GUICtrlCreateLabel("Total Payment Amount: ", 10, 80) Local $vTotalPayAmt = GUICtrlCreateLabel(0,125,80,75) Local $vMinDateLabel = GUICtrlCreateLabel("Date Range - From ", 10, 100) Local $vMinDate = GUICtrlCreateLabel("yyyyMMdd", 105, 100) Local $vMaxDateLabel = GUICtrlCreateLabel("To ", 87, 120) Local $vMaxDate = GUICtrlCreateLabel("yyyyMMdd", 105, 120) GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping GUISetState(@SW_SHOW) If IsArray($aPlanArray) Then For $i = 3 to $iPlanMax -1; $vPlanName = $aPlanArray[$i] GUICtrlSetData($idComboBox,$vPlanName) Next EndIf ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $idOkButton $vPlan = GUICtrlRead($idComboBox) If Not($vPlan == "Choose Insurance Plan") Then ;~ Search $aResultArray for all entries with Plan Name Global $aPlanSearch = _ArrayFindAll($aResultArray, $vPlan, Default, Default, Default, Default, 0) If IsArray($aPlanSearch) Then $vRunningTotal = 0 $jMax = UBound($aPlanSearch) For $j = 0 to $jMax -1; $vIsolatedRxDate = $aResultArray[$aPlanSearch[$j]][1] $vIsolatedRxNum = $aResultArray[$aPlanSearch[$j]][2] $vIsolatedRxPaid = $aResultArray[$aPlanSearch[$j]][3] ;~ MsgBox($MB_OK,"",$vIsolatedRxDate & "|" & $vIsolatedRxNum & "|" & $vIsolatedRxPaid,3) $vRunningTotal += $vIsolatedRxPaid Next EndIf GUICtrlSetData($vNoc,UBound($aPlanSearch)) GUICtrlSetData($vTotalPayAmt, $vRunningTotal) Global $vMaxRange = UBound($aPlanSearch) $vMaxRange -= 1 Local $vMinDateUnformatted = _ArrayMin($aResultArray, 1, $aPlanSearch[0], $aPlanSearch[$vMaxRange], 1) Local $vMinDateYear = StringLeft($vMinDateUnformatted,4) $vMinDateUnformatted = StringTrimLeft($vMinDateUnformatted,4) & $vMinDateYear GUICtrlSetData($vMinDate, $vMinDateUnformatted) Local $vMaxDateUnformatted = _ArrayMax($aResultArray, 1, $aPlanSearch[0], $aPlanSearch[$vMaxRange], 1) Local $vMaxDateYear = StringLeft($vMaxDateUnformatted,4) $vMaxDateUnformatted = StringTrimLeft($vMaxDateUnformatted,4) & $vMaxDateYear GUICtrlSetData($vMaxDate, $vMaxDateUnformatted) Global $vPaymentDate = GUICtrlRead($vPaymentDateInput) Global $vEpicDate = GUICtrlRead($vEpicDateInput) If ($vPaymentDate == "mm/dd/yyyy") OR ($vEpicDate == "mm/dd/yyyy") Then MsgBox($MB_ICONERROR,"Invalid Selection","Date(s) Entered Invalid.") Else GUICtrlSetState($idContinueButton, $GUI_ENABLE) EndIf Else MsgBox($MB_ICONERROR,"Invalid Selection","No Insurance Plan Selected.") EndIf Case $idOpenButton OpenFile() ExitLoop Case $idContinueButton Global $vContinuePaidTotal = 0 $vContinuePaidTotal = Number($vContinuePaidTotal) If WinExists("Reconcile Payment") Then Local $vContinueMin = $aPlanSearch[0] Local $vContinueMax = $aPlanSearch[$vMaxRange] Global $vReconciledAmt ;~ _ArrayDisplay($aResultArray,"Result Array", $vContinueMin & ":" & $vContinueMax) For $i = $vContinueMin to $vContinueMax ;~ Send Rx Number to Reconcile Payment Screen ControlFocus("Reconcile Payment","",$pEdit & $vPioneerClass & "; INSTANCE:1]") ControlSend("Reconcile Payment","",$pEdit & $vPioneerClass & "; INSTANCE:1]",$aResultArray[$i][2]) ControlFocus("Reconcile Payment","",$pButton & $vPioneerClass & "; INSTANCE:1]") ControlClick("Reconcile Payment","",$pButton & $vPioneerClass & "; INSTANCE:1]") Local $vContineRxNum = $aResultArray[$i][2] Local $vContinueRxDate = $aResultArray[$i][1] Local $vContinueRxPaidAmt = Number($aResultArray[$i][3]) $vContinueRxPaidAmt = StringFormat($vContinueRxPaidAmt, "%.2f") Local $vDifference = 0 $vReconciledAmt = ControlGetText("Reconcile Payment","","[CLASS:WindowsForms10.STATIC.app." & $vPioneerClass & "; INSTANCE:36]") $vReconciledAmt = Number(StringTrimLeft($vReconciledAmt, 1)) $vReconciledAmt = StringFormat($vReconciledAmt, "%.2f") $vContinuePaidTotal = StringFormat($vContinuePaidTotal,"%.2f") $vContinueRxPaidAmt = StringFormat($vContinueRxPaidAmt, "%.2f") $vContinuePaidTotal = $vContinuePaidTotal + $vContinueRxPaidAmt $vContinuePaidTotal = StringFormat($vContinuePaidTotal, "%.2f") $vDifference = $vContinuePaidTotal - $vReconciledAmt $vDifference = StringFormat($vDifference, "%.2f") MsgBox($MB_OK,"",$vReconciledAmt & @CRLF & $vContinuePaidTotal & @CRLF & @CRLF & "Difference: " & $vDifference) If $vReconciledAmt = $vContinuePaidTotal Then MsgBox($MB_OK,"","Amounts Match.") Else MsgBox($MB_OK,"","Amounts Do Not Match.") $vContinuePaidTotal = StringFormat($vContinuePaidTotal, "%.2f") $vDifference = StringFormat($vDifference, "%.2f") $vContinuePaidTotal = $vContinuePaidTotal - $vDifference $vContinuePaidTotal = StringFormat($vContinuePaidTotal, "%.2f") $vDifference = StringFormat($vDifference, "%.2f") EndIf Next Else MsgBox($MB_ICONERROR,"Invalid Selection","Reconcile Payment Screen not found.") EndIf Case $idCancelButton, $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd EndFunc ;~ Open File Func OpenFile() Local $sFileOpenDialog = FileOpenDialog("Select Payment Data to Import","C:\Users\Owner\Downloads\","Payment Files (*.xls;*.tab)", $FD_FILEMUSTEXIST) If @error Then MsgBox($MB_SYSTEMMODAL,"","No file was selected.") Else $vTabFile = $sFileOpenDialog EndIf CreatePaymentArray() CreateWindow() EndFunc ;~ Set up Payments in Pioneer - UNFINISHED Func SetupPioneer() If WinExists("PioneerRx Quinlans Pharmacy") Then WinActivate("PioneerRx Quinlans Pharmacy") Send("{ESC 3}") Send("!{S}") Send("{P 2}") WinWait("Save Rx?","",1) If WinExists("Save Rx?") Then Send("{N}") Sleep(200) WinActivate("PioneerRx Quinlans Pharmacy") ControlClick("PioneerRx Quinlans Pharmacy","", $pButton & $vPioneerClass & "; INSTANCE:8]") Else WinActivate("PioneerRx Quinlans Pharmacy") EndIf ControlClick("PioneerRx Quinlans Pharmacy","", $pButton & $vPioneerClass & "; INSTANCE:8]") WinWait("Action Menu") ControlClick("Action Menu","", $pButton & $vPioneerClass & "; INSTANCE:5]") WinWait("Add Third Party Payment") ControlSend("Add Third Party Payment", "", $pEdit & $vPioneerClass & "; INSTANCE:4]", StringLeft($vPlan,5)) Send("{ENTER 2}") Sleep(100) ControlClick("Add Third Party Payment","","[CLASS:WindowsForms10.COMBOBOX.app." & $vPioneerClass & "; INSTANCE:1]") Send("{DOWN}") ControlFocus("Add Third Party Payment","",$pEdit & $vPioneerClass & "; INSTANCE:3]") ControlSend("Add Third Party Payment","",$pEdit & $vPioneerClass & "; INSTANCE:3]", $vPaymentDate) ControlFocus("Add Third Party Payment","",$pEdit & $vPioneerClass & "; INSTANCE:2]") ControlSend("Add Third Party Payment","",$pEdit & $vPioneerClass & "; INSTANCE:2]", "EPIC " & $vEpicDate & " Automated") ;~ ControlClick("Add Third Party Payment","",$pButton & $vPioneerClass & "; INSTANCE:4]") Else MsgBox ($MB_ICONERROR,"Window Test", "PioneerRx Quinlans Pharmacy Window Does Not Exist") EndIf EndFunc CreatePaymentArray() CreateWindow() Edited May 27, 2015 by asakust Solved
Moderators Melba23 Posted May 22, 2015 Moderators Posted May 22, 2015 asakust,Go and look up "floating point arithmetic" - or search the forum because it has been discussed I do not know how many times. And before you ask, this is NOT an Autoit problem - it affects all computers regardless of language unless they use special arithmetic routines.M23 asakust 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
asakust Posted May 26, 2015 Author Posted May 26, 2015 (edited) Go and look up "floating point arithmetic" - or search the forum because it has been discussed I do not know how many times.Good deal, I'll look into it. Thanks for giving me the name of something to look for, I had no idea where to even start - I tried searching for "extra decimal places," "math extra decimals," and anything else I could think of, but since I had no idea what to look for, I couldn't find anything to start from. I'll update when I get somewhere. Thanks, M! Edited May 26, 2015 by asakust
asakust Posted May 26, 2015 Author Posted May 26, 2015 Actually, I still have issues with this... I'm trying to use StringFormat to force the numbers to truncate anyway, and it's still coming out with the extra decimals. Code snippet below.$vContinuePaidTotal = StringFormat($vContinuePaidTotal, "%.2f") $vDifference = StringFormat($vDifference, "%.2f") $vContinuePaidTotal = $vContinuePaidTotal - $vDifference $vContinuePaidTotal = StringFormat($vContinuePaidTotal, "%.2f")I'm assuming I'm using the StringFormat correctly, but even after repeatedly trying to force it into 2 decimal places (yes, I'm working with money) the $vContinuePaidTotal variable always returns with added decimal places. I have tried the same thing I'm doing here with Round(), am I missing something? Should I be formatting the string and/or rounding it as I'm trying to return the value?MsgBox($MB_OK,"Total Amount","ContinuePaidTotal = " & Round($vContinuePaidTotal,2)) ;~ OR MsgBox($MB_OK,"Total Amount","ContinuePaidTotal = " & StringFormat($vContinuePaidTotal, "%.2f")Something like this?I understand the floating point issue is not one with AutoIt, but I'm just confused as to where I'm going wrong in attempting to format the resulting values.
Moderators Melba23 Posted May 26, 2015 Moderators Posted May 26, 2015 (edited) asakust,I'm assuming I'm using the StringFormat correctlyCheck the order of the parameters for StringFormat - you might find it works better if you get them the right way round.But you might get .99999999999 returned and so I would not recommend that method.If you are working with cash, why not convert everything to cents/pence/lowest and do all the maths on integers, reconverting at the end?M23 Edited May 26, 2015 by Melba23 Wrong button too soon asakust 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
asakust Posted May 26, 2015 Author Posted May 26, 2015 Melba - I got stuck in the reference with this PrintFormat Function. Thanks for that.PrintFormat($iInt_Unsigned, "%.2f", "floating point with 2 digits after decimal point", 1) ; 43951789.00The only reason I haven't switched everything into cents and reconverted is that... Well, I figured it would be more difficult and take more time - but with the issues I'm having on the floating-point nonsense, that may be the easier route. Thanks again, I'll try it again later on and update you!
asakust Posted May 26, 2015 Author Posted May 26, 2015 Melba -You're a genius, and I am a syntax fool. Thank you very much.
Moderators Melba23 Posted May 26, 2015 Moderators Posted May 26, 2015 asakust,Glad I could help.M23 asakust 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now