Wingens

Read and combine multiple sections inifile

4 posts in this topic

Hi I am trying to read multiple sections from an ini file into an array and use the result to calculate how many records there are from the suppliers and this devided into the status records that belong to it. The problem I am having; I am able to use Ubound to calculate how many record there are in total to the option chosen from the combo box, but where I am getting stuck is the part to link the status and leverancier to each other and count them.

Hope some one can help me.

My code right now:

#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <file.au3>
#include <array.au3>

$Form1 = GUICreate("Form1", 615, 437, 569, 253)
$LEVCOMBO = GUICtrlCreateCombo("", 184, 112, 145, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))

    Global $aSections = IniReadSectionNames(@ScriptDir & "\leveranciers.ini")
    If (Not @Error) Then GUICtrlSetData($LEVCOMBO, _ArraytoString($aSections, "|", 1), $aSections[1])

    $LABEL              = GUICtrlCreateLabel("Totaal aantal RMA aanvragen: ", 48, 200, 250, 21)
    $TOTALCOUNT         = GUICtrlCreateLabel("", 200, 200, 100, 21)
    $LABEL2             = GUICtrlCreateLabel("Aantal aangevraagd: ", 48, 225, 250, 21)
    $TOTALAANGEVRAAGD   = GUICtrlCreateLabel("", 200, 225, 100, 21)
    $LABEL3             = GUICtrlCreateLabel("Aantal verzonden: ", 48, 250, 250, 21)
    $TOTALVERZONDEN     = GUICtrlCreateLabel("", 200, 250, 100, 21)
    $LABEL4             = GUICtrlCreateLabel("Aantal afgehandeld: ", 48, 275, 250, 21)
    $TOTALAFGEHANDELD   = GUICtrlCreateLabel("", 200, 275, 100, 21)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $LEVCOMBO
            COMBO()
    EndSwitch
WEnd

Func COMBO()
    Local $hINI_FILENAME = @ScriptDir & "\ini.ini"
        $READAANGEVRAAGDRMA         = IniReadSection($hINI_FILENAME, 'LEVERANCIER')
        $READSTATUS                 = IniReadSection($hINI_FILENAME, 'STATUS')
        $VAR                        = GUICtrlRead($LEVCOMBO)
        $READAANGEVRAAGDRMACOUNT    = _ArrayFindAll($READAANGEVRAAGDRMA, $VAR, Default, Default, Default, Default, 1)
                                      GUICtrlSetData($TOTALCOUNT,UBound($READAANGEVRAAGDRMACOUNT))
        $nb = $READAANGEVRAAGDRMA[0][0]
            Local $res[$nb+1][3]
            $res[0][0] = $nb
                For $i = 1 to $nb
                    $res[$i][0] = $READAANGEVRAAGDRMA[$i][1]
                    $res[$i][1] = $READSTATUS[$i][1]
                Next
            _ArrayDisplay($res)
EndFunc

And the ini files that goes with it:

ini.ini:

[STATUS]
1=Afgehandeld
3=Verzonden
4=Aangevraagd
5=Aangevraagd
6=Aangevraagd
7=Aangevraagd
8=Verzonden
9=Aangevraagd
10=Aangevraagd
11=Aangevraagd
12=Aangevraagd
13=Aangevraagd
14=Aangevraagd
15=Aangevraagd
16=Aangevraagd
17=Aangevraagd
18=Aangevraagd
19=Aangevraagd
20=Aangevraagd
21=Aangevraagd
22=Aangevraagd

[LEVERANCIER]
9=Dobit B.V.
1=Dobit B.V.
10=Dobit B.V.
11=Dobit B.V.
12=Dobit B.V.
13=Dobit B.V.
14=Asus
15=Asus
16=Brother
17=Dobit B.V.
18=Dobit B.V.
19=Dobit B.V.
20=Dobit B.V.
21=Dobit B.V.
22=Asus

leveranciers.ini:

[Kies een leverancier...]

[Dobit B.V.]
URL =http://eline.dobit.be/eline/master.php
[TechData B.V.]
URL =   
[MaxICT B.V.]
URL =   
[Brother]
URL=
[Asus]
URL=https://eu-rma.asus.com/pickup_europe/pickup.aspx?country=nl
[HP]
URL=
[Lenovo]
URL=
[CCV]
URL=

 

test.au3

ini.ini

leveranciers.ini

Share this post


Link to post
Share on other sites



Can you what you are attempting to achieve?  

Share this post


Link to post
Share on other sites

Wingens,

I think this does what you want:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <GuiComboBox.au3>

$Form1 = GUICreate("Form1", 615, 437, 569, 253)
$LEVCOMBO = GUICtrlCreateCombo("", 184, 112, 145, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
_GUICtrlComboBox_SetCueBanner($LEVCOMBO, "Kies een leverancier...") ; Remove this phrase from the ini file

Global $aSections = IniReadSectionNames(@ScriptDir & "\leveranciers.ini")
If (Not @error) Then GUICtrlSetData($LEVCOMBO, _ArrayToString($aSections, "|", 1), $aSections[1])

GUICtrlCreateLabel("Totaal aantal RMA aanvragen: ", 48, 200, 250, 21) ; Why store the ControlId if you are not going to use it again?
$TOTALCOUNT = GUICtrlCreateLabel("", 200, 200, 100, 21)
GUICtrlCreateLabel("Aantal aangevraagd: ", 48, 225, 250, 21)
$TOTALAANGEVRAAGD = GUICtrlCreateLabel("", 200, 225, 100, 21)
GUICtrlCreateLabel("Aantal verzonden: ", 48, 250, 250, 21)
$TOTALVERZONDEN = GUICtrlCreateLabel("", 200, 250, 100, 21)
GUICtrlCreateLabel("Aantal afgehandeld: ", 48, 275, 250, 21)
$TOTALAFGEHANDELD = GUICtrlCreateLabel("", 200, 275, 100, 21)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $LEVCOMBO
            _COMBO(GUICtrlRead($LEVCOMBO))
    EndSwitch
WEnd

Func _COMBO($VAR)
    
    Local $hINI_FILENAME = @ScriptDir & "\ini.ini"
    $READAANGEVRAAGDRMA = IniReadSection($hINI_FILENAME, 'LEVERANCIER')
    $READSTATUS = IniReadSection($hINI_FILENAME, 'STATUS')
    $READAANGEVRAAGDRMACOUNT = _ArrayFindAll($READAANGEVRAAGDRMA, $VAR, Default, Default, Default, Default, 1)
    ; Varibales to hold counts
    Local $TOTALAANGEVRAAGD_Sel = 0, $TOTALVERZONDEN_Sel = 0, $TOTALAFGEHANDELD_Sel = 0
    ; For each found index
    For $i = 0 To UBound($READAANGEVRAAGDRMACOUNT) - 1
        ; Check value of that index
        Switch $READSTATUS[$READAANGEVRAAGDRMACOUNT[$i]][1]
            Case "Aangevraagd"
                ; And adjust counts
                $TOTALAANGEVRAAGD_Sel += 1
            Case "Verzonden"
                $TOTALVERZONDEN_Sel += 1
            Case "Afgehandeld"
                $TOTALAFGEHANDELD_Sel += 1
        EndSwitch
    Next
    ; Set data in the labels
    GUICtrlSetData($TOTALCOUNT, $i)
    GUICtrlSetData($TOTALAANGEVRAAGD, $TOTALAANGEVRAAGD_Sel)
    GUICtrlSetData($TOTALVERZONDEN, $TOTALVERZONDEN_Sel)
    GUICtrlSetData($TOTALAFGEHANDELD, $TOTALAFGEHANDELD_Sel)

EndFunc   ;==>_COMBO

Come back if not.

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

Thanks Melba this is just what I was looking for.

You commented the label why I had a ControlID attached to it: in the full script I use it like this: 

GUICtrlSetBkColor($LABEL, $GUI_BKCOLOR_TRANSPARENT)

I need to do this because the GUI has an background image.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • chacoya121
      By chacoya121
      plz help how to organize information from notepad or INIfile
      Example:
      0=000308 1=000308 2=000308 3=000308 4=000408 5=000408 6=000408 7=000408 8=000408 9=000408 10=000308 11=000308 12=000308 13=000408 14=000408 15=000408 16=000408 17=000408 18=000408 19=000408 20=000308 21=000308 22=000308 23=000408 24=000408 25=000408 26=000408 27=000408 28=000408 29=000408 30=000308  0=000308 x 11 total
       1=000408 x 20 total
      2 lines summary all
       
      Thank you
       
    • TheDcoder
      By TheDcoder
      Hello , I was thinking of a situation where a key in a ini file can contain anything, If we were to know if the key does not exists using IniRead, Its not possible to do it without compromising a single possibility... I was thinking that if IniRead were to set @error when a key does not exist, it solves the problem which I mentioned before
       
      What do you think? Would you like this feature?
      TD
    • zemkor
      By zemkor
      Hello, i have question. How to save and read data from "GUICtrlCreateEdit" to ini file ?. Problem is: IniWrite write only first line of text and IniRead read only first line text.
      How to do it?
      Thanks for answer.
      $text = GUICtrlCreateEdit("Text", 20, 165, 120, 50) Func save() Local $ini_file, $workingdir ; save workingdir $workingdir = @WorkingDir ; save file dialog $ini_file = FileSaveDialog('Save', @ScriptDir, 'Ini (*.ini)|All (*.*)', 10, 'Config.ini', $Form1) ; check if return is valid If @error Or $ini_file == '' Then FileChangeDir($workingdir) Return SetError(1, 0, '') EndIf ; write to ini file IniWrite($ini_file, "Data", "Text", GUICtrlRead($Text)) EndFunc $text = GUICtrlCreateEdit("Text", 20, 165, 120, 50) Func load() ;natiahne nastavenia z .ini Local $ini_file, $workingdir ; save workingdir $workingdir = @WorkingDir ; open file dialog $ini_file = FileOpenDialog('Open', @ScriptDir, 'Ini (*.ini)|All (*.*)', 1, 'Config.ini', $Form1) ; check if return is valid If @error Or $ini_file == '' Then FileChangeDir($workingdir) Return SetError(1, 0, '') EndIf ; read from ini file GUICtrlSetData($text, IniRead($ini_file, "Data", "Text", "")) EndFunc This not working, read and write only firt line
    • MattX
      By MattX
      My goal is to read the ini file in so if the computer / server name is in the list then it will simply pop it up in the msg box - problem is it's not working - I've obviously done something wrong here !!
      The .ini file looks like this.
      [servers]
      server1=aaa-srv1
      server2=bbb-srv1
      server3=ccc-srv5
      server4=ddd-srv2
      server5=eee-srv1
      server6=ggg-srv5
      server7=kkk-srv1
      server8=ppp-srv2
      server9=zzz-srv3
      server10=xxx-srv1
      server11=mmm-srv1
      The code:

      $cname = @ComputerName $ip = @IPAddress1 $user = @UserName $name = IniReadSection(@ScriptDir & "\server_list.ini", "servers") If @error Then     MsgBox(4096, "", "Error occurred,  probably no INI file.") Else     For $i = 1 To $name[0][0]         ;MsgBox(4096, "", $name[$i])     Next EndIf If $cname = $name Then     MsgBox(4096, "", $name[$i])     EndIf  
      Would appreciated a pointer where I've gone wrong.
    • MHz
      By MHz
      These functions handle ANSI and unicode inifiles similar to IniRead, IniWrite and IniDelete.
      _WinAPI_WritePrivateProfileStringW _WinAPI_GetPrivateProfileStringW So you can read from unicode inifiles created from other programs or perhaps read and write to your own inifiles.
      I was unable to figure out how the API function of WritePrivateProfileStringW can create a unicode file initially so I instead used FileOpen to create a unicode file and write the 1st entry to achieve this. Further use uses WritePrivateProfileStringW is ok to handle the unicode entries. ANSI file creation is done by WritePrivateProfileStringW by default.
      Deletion of keys and sections may need use of Null which is in AutoIt 3.3.9.0 and later. I put comments with the code so hopefully understandable to you.
      The functions use a similar parameter syntax to IniRead and IniWrite. _WinAPI_WritePrivateProfileStringW has an additional parameter to handle the flag passed to FileOpen for the initial creation of the inifile. _WinAPI_GetPrivateProfileStringW has an additional parameter in case you want the buffer that holds the return value within the UDF to be larger.
      The example has some russian text in it so you need to save it in a unicode script for correct testing.
      Example
      ; show message if script is not unicode. Unicode text in this script requires it to be UTF encoded. ; if needed in Scite, use menu bar, File -> Encoding -> UTF (any UTF type that suits you) and save the script. If Not FileGetEncoding(@ScriptFullPath) Then MsgBox(0, @ScriptName, 'Script is not unicode') ; write to ini file $return = _WinAPI_WritePrivateProfileStringW("test.ini", 'russian', 'Open', 'Открыть', 0x21) _Notify('Write', $return) ; read from ini file $return = _WinAPI_GetPrivateProfileStringW("test.ini", 'russian', 'Open', 'Default') _Notify('Read', $return) #cs AutoIt 3.3.9.0 or later using Null keyword ; setting $sValue parameter with Null keyword will delete a key using AutoIt 3.3.9.x or later. $return = _WinAPI_WritePrivateProfileStringW("test.ini", 'russian', 'Open', Null) ; setting $sKey parameter with Null keyword will delete a section using AutoIt 3.3.9.x or later. $return = _WinAPI_WritePrivateProfileStringW("test.ini", 'russian', Null, Null) ; setting $sSection parameter with Null keyword will flush using AutoIt 3.3.9.x or later. $return = _WinAPI_WritePrivateProfileStringW("test.ini", Null, Null, Null) #ce ; More info of an API that mimics these functions and explains use of Null at http://code.google.com/p/privateprofilestring/ Func _Notify($title, $return = 0, $error = @error, $extended = @extended) ; notify results from other function calls MsgBox(StringRegExpReplace($error, '-{0,1}([1-9])[0-9]*', '0x30'), $title, _ '@error = ' & $error & @CRLF & _ '@extended = ' & $extended & @CRLF & _ '$return = ' & $return _ ) EndFunc User defined functions
      ; #FUNCTION# ==================================================================================================================== ; Name...........: _WinAPI_WritePrivateProfileStringW ; Description ...: Write to ANSI and unicode encoded ini files ; Syntax.........: _WinAPI_WritePrivateProfileStringW($sFileName, $sSection, $sKey, $sValue[, $iMode = 1]) ; Parameters ....: $sFileName - The filename of the .ini file ; $sSection - The section name in the .ini file ; $sKey - The key name in the in the .ini file ; $sValue - The value to write/change ; $iMode - Refer to FileOpen mode parameter ; Return values .: Success - Not 0 ; Failure - 0 ; @error 1 to 5 - Refer to DllCall ; @error 6 - FileOpen failed to open a handle to create the file ; Author ........: MHz ; Modified.......: ; Remarks .......: Similar to IniWrite but uses unicode API calls. If $sValue is Null then $sKey is deleted. If $sKey is Null, ; then $sSection is deleted. If $sSection, $sKey and $sValue are all Null, then $sFileName is ; flushed. *** Null is a keyword that only exists in AutoIt3 versions 3.3.9.x and later *** ; Related .......: DllCall, FileOpen, IniWrite ; Link ..........: http://msdn.microsoft.com/en-us/library/windows/desktop/ms725501%28v=vs.85%29.aspx ; http://msdn.microsoft.com/en-us/library/windows/desktop/bb773660%28v=vs.85%29.aspx ; Example .......: Yes ; =============================================================================================================================== Func _WinAPI_WritePrivateProfileStringW($sFileName, $sSection, $sKey, $sValue, $iMode = 1) Local $handle_write, $ret ; check if path is relative and make it absolute if it is relative $ret = DllCall('Shlwapi.dll', 'bool', 'PathIsRelativeW', 'wstr', $sFileName); lpszPath If Not @error And $ret[0] Then $sFileName = @WorkingDir & '\' & $sFileName ; create a unicode encoded file if needed and write the entry If Not FileExists($sFileName) And $iMode > 0x20 Then $handle_write = FileOpen($sFileName, $iMode) If $handle_write = -1 Then Return SetError(6, 0, 0) FileWrite($handle_write, '[' & $sSection & ']' & @CRLF & $sKey & '=' & $sValue & @CRLF) FileClose($handle_write) Return 1 EndIf ; write to the ini file. $ret[0] will contain nonzero if successful $ret = DllCall('Kernel32.dll', 'bool', 'WritePrivateProfileStringW', _ 'wstr', $sSection, _ 'wstr', $sKey, _ 'wstr', $sValue, _ 'wstr', $sFileName _ ); lpAppName, lpKeyName, lpString, lpFileName If @error Then Return SetError(@error, @extended, 0) Return SetExtended(0, $ret[0]) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: _WinAPI_GetPrivateProfileStringW ; Description ...: Read from ANSI and unicode encoded ini files ; Syntax.........: _WinAPI_GetPrivateProfileStringW($sFileName, $sSection, $sKey[, $sDefault = ''[, $iBufferSize = 65536]]) ; Parameters ....: $sFileName - The filename of the .ini file ; $sSection - The section name in the .ini file ; $sKey - The key name in the in the .ini file ; $sDefault - The default value to return if the requested key is not found ; $iBufferSize - Adjustable buffer size which contains the chars from the API call ; Return values .: Success - Returns the requested key value ; Failure - Returns the default string if requested key not found ; @error 1 to 5 - Refer to DllCall ; Author ........: MHz ; Modified.......: ; Remarks .......: Similar to IniRead but uses unicode API calls ; Related .......: IniRead ; Link ..........: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724353%28v=vs.85%29.aspx ; http://msdn.microsoft.com/en-us/library/windows/desktop/bb773660%28v=vs.85%29.aspx ; Example .......: Yes ; =============================================================================================================================== Func _WinAPI_GetPrivateProfileStringW($sFileName, $sSection, $sKey, $sDefault = '', $iBufferSize = 65536) Local $buffer, $ret ; check if path is relative and make it absolute if it is relative $ret = DllCall('Shlwapi.dll', 'bool', 'PathIsRelativeW', 'wstr', $sFileName); lpszPath If Not @error And $ret[0] Then $sFileName = @WorkingDir & '\' & $sFileName ; create a buffer to hold the returned string $buffer = DllStructCreate('wchar[' & $iBufferSize & ']') ; read from the ini file. $ret[0] will contain number of chars returned $ret = DllCall('Kernel32.dll', 'dword', 'GetPrivateProfileStringW', _ 'wstr', $sSection, _ 'wstr', $sKey, _ 'wstr', $sDefault, _ 'ptr', DllStructGetPtr($buffer), _ 'dword', DllStructGetSize($buffer), _ 'wstr', $sFileName _ ); lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName If @error Then SetError(@error, @extended, $sDefault) Return SetExtended($ret[0], DllStructGetData($buffer, 1)) EndFunc Thanks to AZJIO for some russian text for use in the example.
      Edit:
      Updated with summary correction by guiness in post #2